Nhờ anh chị download file bên dưới về xem và giúp tôi phát triển 1 sub sẵn có trên file. Hiện tại sub chỉ có thể dò trích lấy nội lực N, M2, M3 ở vị trí đầu và cuối của phần tử cột với các ComBo. nhưng với Ndh, M2dh, M3dh thì không biết phải làm sao để trích ra đúng vị trí mong muốn (cụ thể trích nội lực có tên TT bên sheets("Element Forces - Frames") sang sheets("TinhThep") cho nằm tương ứng với các ComBo. Trong file tôi có copy ví dụ tay 1 phần tử số 8.
Do là dân ngoại đạo mới tìm hiểu về VBA excel trên diễn đàn nhờ các anh chị giúp đỡ.
đây là link download file: http://www.mediafire.com/download/41fkc449o64bscb/GPE.rar
Nhờ anh chị download file bên dưới về xem và giúp tôi phát triển 1 sub sẵn có trên file. Hiện tại sub chỉ có thể dò trích lấy nội lực N, M2, M3 ở vị trí đầu và cuối của phần tử cột với các ComBo. nhưng với Ndh, M2dh, M3dh thì không biết phải làm sao để trích ra đúng vị trí mong muốn (cụ thể trích nội lực có tên TT bên sheets("Element Forces - Frames") sang sheets("TinhThep") cho nằm tương ứng với các ComBo. Trong file tôi có copy ví dụ tay 1 phần tử số 8.
Do là dân ngoại đạo mới tìm hiểu về VBA excel trên diễn đàn nhờ các anh chị giúp đỡ.
đây là link download file: http://www.mediafire.com/download/41fkc449o64bscb/GPE.rar
Nếu dữ liệu của bạn lớn , khoảng vài nghìn phần tử hay tổ hợp gì đấy thì viết hản một sub để tăng tốc độ! :
* tạo một mảng ban Arr ban đầu : Arr = sheets("Element Forces - Frames").range(L3:U1000)
* Dùng vòng lặp duyệt qua từng hàng trong mảng : Kiểm tra các giá trị tên phần tử Arr(i,1) & tiết diện phần tử Arr(i,2)--> nếu khớp với chuỗi kiểm tra --> ghi vào mảng kết quả Arrresult
* Đưa toàn bộ giá trị Arrresult xuống sheet!
Ngoài ra Nếu bạn biết công cụ Scripting.Dictionary thì sẽ nhanh gọn hơn !
Nếu dữ liệu của bạn lớn , khoảng vài nghìn phần tử hay tổ hợp gì đấy thì viết hản một sub để tăng tốc độ! :
* tạo một mảng ban Arr ban đầu : Arr = sheets("Element Forces - Frames").range(L3:U1000)
* Dùng vòng lặp duyệt qua từng hàng trong mảng : Kiểm tra các giá trị tên phần tử Arr(i,1) & tiết diện phần tử Arr(i,2)--> nếu khớp với chuỗi kiểm tra --> ghi vào mảng kết quả Arrresult
* Đưa toàn bộ giá trị Arrresult xuống sheet!
Ngoài ra Nếu bạn biết công cụ Scripting.Dictionary thì sẽ nhanh gọn hơn !
nói thật bạn đừng cười mình chỉ mới mò mẫm học VBA nên cũng chỉ biết sài 1 số lệnh đơn giản mà mình xem trên diễn đàn mình hiểu được thôi. mình ngồi dọc cả buổi chiều viết ra được 1 đoạn nhưng khi run lại bị lỗi ở Vị trí = L còn vị trí = 0 vẫn ra đúng
Đây là sub mình làm nếu được bạn sửa lại giùm mình với.
Nhưng trước khi chạy sub phải đặt tên Vung1, Vung2, Vung3, Vung4, Vung5 như Trong Ghi chú.
Sub TrichNM2M3()
Dim KetQua As Range
Dim iDong As Long
iDong = 1
Sheets("TinhThep").Select
Set KetQua = Sheets("TinhThep").Range("A3")
Lúc đầu mình cũng hỏi trên diễn đàn cách dùng công thức có sẵn của excel. được 1 anh chỉ dùng hàm lookup y như bạn vậy nhưng khi copy công thức xuống hết các phần tử thì lại bị tình trạng này (Hình như là excel phải mất 1 khoảng thời gian mới cập nhật được công thức)
mỗi lần như vậy phải đợi từ 5-15 phút tuỳ theo số dòng nhiều hay ít. và khi save cũng bị nên mình mới chuyển ý định sang làm 1 sub để chạy cho nhanh. Xem hình mình đính kèm
nói thật bạn đừng cười mình chỉ mới mò mẫm học VBA nên cũng chỉ biết sài 1 số lệnh đơn giản mà mình xem trên diễn đàn mình hiểu được thôi. mình ngồi dọc cả buổi chiều viết ra được 1 đoạn nhưng khi run lại bị lỗi ở Vị trí = L còn vị trí = 0 vẫn ra đúng
Đây là sub mình làm nếu được bạn sửa lại giùm mình với.
Nhưng trước khi chạy sub phải đặt tên Vung1, Vung2, Vung3, Vung4, Vung5 như Trong Ghi chú.
Sub GPE()
Dim tmpArr, ArrResult, Arrsource, dic As Object
Dim tmp$, i&, ir&
Arrsource = Sheets("Element Forces - Frames").Range("L4:U1000")
tmpArr = Sheet2.Range("A3", [B65536].End(3))
ReDim ArrResult(1 To UBound(tmpArr, 1), 1 To 3)
Set dic = CreateObject("scripting.dictionary")
'____________________________________________________________
For i = 1 To UBound(Arrsource, 1)
tmp = Trim(Arrsource(i, 1)) & Trim(Arrsource(i, 2))
If Not dic.exists(tmp) Then dic.Add tmp, i
Next
For i = 1 To UBound(tmpArr, 1)
tmp = Trim(tmpArr(i, 1)) & Trim(tmpArr(i, 2))
If dic.exists(tmp) Then
ir = dic.Item(tmp)
ArrResult(i, 1) = Arrsource(ir, 5): ArrResult(i, 2) = Arrsource(ir, 9): ArrResult(i, 3) = Arrsource(ir, 10)
End If
Next
'________________________________________________________________
Sheet2.Range("I3:K1000").clearcontents
Sheet2.Range("I3:K3").Resize(i - 1) = ArrResult
set dic = nothing
End Sub
Sao không dùng công thức có sẵn trong excel bạn nhỉ :
ví dụ :
Công thức cho Ỉ3,J3,K3 :
Lúc đầu mình cũng hỏi trên diễn đàn cách dùng công thức có sẵn của excel. được 1 anh chỉ dùng hàm lookup y như bạn vậy nhưng khi copy công thức xuống hết các phần tử thì lại bị tình trạng này (Hình như là excel phải mất 1 khoảng thời gian mới cập nhật được công thức)
mỗi lần như vậy phải đợi từ 5-15 phút tuỳ theo số dòng nhiều hay ít. và khi save cũng bị nên mình mới chuyển ý định sang làm 1 sub để chạy cho nhanh. Xem hình mình đính kèm
Nhìn qua hình đính kèm : có vẻ như máy bạn là Core I5 , mà tốc độ 5-15 phút nếu chỉ với công thức Lookup thì phải xem lại , hồi sinh viên mình cũng từng làm file tổ hợp nội lực tháp thép ( khoảng 2000 phần tử ) bằng hàm lookup cũng đâu có lâu như vậy !, chác file của bạn còn nhiều vấn đề khác !
Nhìn qua hình đính kèm : có vẻ như máy bạn là Core I5 , mà tốc độ 5-15 phút nếu chỉ với công thức Lookup thì phải xem lại , hồi sinh viên mình cũng từng làm file tổ hợp nội lực tháp thép ( khoảng 2000 phần tử ) bằng hàm lookup cũng đâu có lâu như vậy !, chác file của bạn còn nhiều vấn đề khác !
Đúng rồi máy mình là core i5 nhưng đời 2 nên cũng hơi già yếu. mà chắc cũng do mình làm biếng nên copy công thức 1 lúc 3 cells I3, J3, K3 và paste xuống tận dòng 13574 nên nó hơi lâu chứ mình chia ra vài lần mỗi lần paste khoảng 500 dòng thì cập nhật công thức cũng nhanh lắm.
Không hiểu bạn khen hay chê ?
Nếu bạn đã xác định viết Sub để tăng tốc độ của file tính ,thì nên lưu ý một số điểm sau :
* Sử dụng mảng Array : thay vì duyệt qua các phần tử cells trong bảng tính , bạn hãy duyệt qua các phần tử trong mảng Array vừa tạo ra !
* Tùy từng trường hợp, mà ta sử dụng các hàm có sẵn trong excel (worksheetFunction.) : bởi vì nếu bạn lạm dụng quá nhiều vào hàm có sẵn của excel đôi khi sub hay function của bạn giống hệt việc bạn viết hàm trên excel , chỉ khác là bạn giấu được công thức,hoăc thay thế 1 câu lệnh rất dài bằng một câu lệnh ngắn hơn ,trong khi tốc độ thì không được cải thiện
***......
!
Mình khen đó chứ. chắc tại cách dùng từ của mình làm bạn hiểu nhầm. Do mình cũng chỉ tập tành tìm hiểu về VBA. đọc các bài trên diễn đàn 1 số câu lệnh quen quen như trong cuốn sách của Phan Tự Hướng thì mình coi còn hiểu chứ mình cũng có đọc 1 số bài về mảng Arr nhưng đọc xong lại chẳng biết hỏi ai nên rồi cũng không hiểu.