Vòng lặp phân lớp đất tính lún

Liên hệ QC

tranvanhung2009

Thành viên hoạt động
Tham gia
1/3/11
Bài viết
128
Được thích
18
Xin chào mọi người!
Mình đã viết đoạn code để tính lún cho móng. Tuy nhiên vòng lặp "Do While - loop và Do - Loop while" ở trong đoạn VBA kèm theo báo lỗi, mình đã tìm hiểu nhưng vẫn chưa được
Mong mọi người giúp đỡ chỉnh sửa lại đoạn vba này. Có thể giải thích cho mình hiểu được lỗi của mình tại sao lại bị thế được không ạ.
So liệu cần tính lấy từ sheet "so lieu" kết quả trả về sheet "tinh lun". Mình đã đưa ra kết quả của một dòng cụ thể
Cám ơn mọi người nhiều
 

File đính kèm

  • tinh lun.xlsm
    125.6 KB · Đọc: 18
Dân kỹ thuật gì mà nói chuyện kinh hãi quá.
Code có mấy mô đun, mỗi mô đun có cả đống hàm. Chả hàm nào có được dòng giới thiệu nó làm cái gì.

Bây giờ nói "báo lỗi" trong vòng lặp Do... Bảo người ta cầm đèn pin đi vào rừng hái nấm à?
Ít nhất phải cho biết nó ở Sub/Function nào, dòng nào, và lỗi ra sao chứ.
 
Upvote 0
Báo lỗi này nè các bác

ByRef argument type mismatch​

& tô vàng macro
Sub tinh_lun_SP() luôn
Bài đã được tự động gộp:

Hàm bạn viết như vầy:
PHP:
Function zi(ByVal S_D As Double)  'chieu cao phan lop
 Dim sRow, sCol  As Integer
    sRow = Sheet1.Cells.Range("So_hang")                                                'So Dong
    sCol = Sheet1.Cells.Range("So_cot")                                                 'So Cot
Dim cr_m, cd_m, dt_m, kl_mong As Double 'Thong so mong: Chieu rong, chieu dai, dien tich
    cr_m = sCol * d * S_D
    cd_m = sRow * d * S_D
    zi = 0.2 * Application.Max(cr_m, cd_m)
End Function

Nhưng không truyền cho nó tham biến kiểu Double thì nó cự nự thôi;

Tựu chung là viết rất ẩu tả & tự sửa đi, bạn mới khá được.

Người nào sửa cho bạn sẽ có ý đồ xấu là hại bạn mà thôi!
 
Lần chỉnh sửa cuối:
Upvote 0
Xin chào mọi người!
Mình đã viết đoạn code để tính lún cho móng. Tuy nhiên vòng lặp "Do While - loop và Do - Loop while" ở trong đoạn VBA kèm theo báo lỗi, mình đã tìm hiểu nhưng vẫn chưa được
Mong mọi người giúp đỡ chỉnh sửa lại đoạn vba này. Có thể giải thích cho mình hiểu được lỗi của mình tại sao lại bị thế được không ạ.
So liệu cần tính lấy từ sheet "so lieu" kết quả trả về sheet "tinh lun". Mình đã đưa ra kết quả của một dòng cụ thể
Cám ơn mọi người nhiều
ở Sub tinh_lun_SP() thầy ạ
Bài đã được tự động gộp:

Dân kỹ thuật gì mà nói chuyện kinh hãi quá.
Code có mấy mô đun, mỗi mô đun có cả đống hàm. Chả hàm nào có được dòng giới thiệu nó làm cái gì.

Bây giờ nói "báo lỗi" trong vòng lặp Do... Bảo người ta cầm đèn pin đi vào rừng hái nấm à?
Ít nhất phải cho biết nó ở Sub/Function nào, dòng nào, và lỗi ra sao chứ.
Sub tinh_lun_SP()
 
Upvote 0
Thường câu lệnh này
Mã:
 .Cells(i, 1).Resize(1, 1).Value = arr
Phải nằm trong cặp lệnh
PHP:
With  Sheets("GPE")

End With
 
Upvote 0
Báo lỗi này nè các bác

ByRef argument type mismatch​

& tô vàng macro
Sub tinh_lun_SP() luôn
Bài đã được tự động gộp:

Hàm bạn viết như vầy:
PHP:
Function zi(ByVal S_D As Double)  'chieu cao phan lop
Dim sRow, sCol  As Integer
    sRow = Sheet1.Cells.Range("So_hang")                                                'So Dong
    sCol = Sheet1.Cells.Range("So_cot")                                                 'So Cot
Dim cr_m, cd_m, dt_m, kl_mong As Double 'Thong so mong: Chieu rong, chieu dai, dien tich
    cr_m = sCol * d * S_D
    cd_m = sRow * d * S_D
    zi = 0.2 * Application.Max(cr_m, cd_m)
End Function

Nhưng không truyền cho nó tham biến kiểu Double thì nó cự nự thôi;

Tựu chung là viết rất ẩu tả & tự sửa đi, bạn mới khá được.

Người nào sửa cho bạn sẽ có ý đồ xấu là hại bạn mà thôi!
em cám ơn thầy, em cũng mới bắt đầu tìm hiểu về VBA, trước chỉ tự viết mấy hàm rồi xử lí trên bảng tính. Nên kiến thức về VBA còn yếu lắm thầy ạ.
Bài đã được tự động gộp:

Bị lỗi này nữa thầy ạ. Trong file dinh kem em đã giải thích thêm ơ phần code VBA trong ham sub tinh_lun_SP
1619952688143.png
 

File đính kèm

  • tinh lun.xlsm
    163.3 KB · Đọc: 7
Lần chỉnh sửa cuối:
Upvote 0
Xin lỗi, mình chưa bao giờ là thầy; Thêm nữa phong cách viết Code như bạn mình không dám chức vị bạn gọi đâu;
Chúc vui nha!
 
Upvote 0
Xin lỗi, mình chưa bao giờ là thầy; Thêm nữa phong cách viết Code như bạn mình không dám chức vị bạn gọi đâu;
Chúc vui nha!
Trước đây em cũng tự học excel (chủ yếu trên bảng tính) đó có tìm hiểu và đọc trên diễn đàn về viết các hàm, cơ bản các hàm nội suy là cũng do sưu tầm được trên diễn đàn và internet.
Và đã có kết quả nhất định trong việc tính toán trực tiếp trên bảng tính. Bây giờ em đang học thêm về các vòng lặp, mảng trong VBA để giải quyết công việc được hiệu quả hơn. Mọi người ai truyền đạt đến kiến thức cho người khác để người đó được mở rộng kiến thức, đều xứng đáng đều được gọi là Thầy. Các cụ xưa có câu nữa chữ cùng là thầy mà Thầy.
Em được biết trên diễn đàn này cũng có rất nhiều người là thầy giáo ở các trường đại học và cao đẳng ở nước mình ở đây.
 
Upvote 0
Làm thế này bạn sẽ biết dòng lệnh nào đang sai nè:
PHP:
Sub Tinh_Lun_SP()
Dim I, J, K, Gamadat  'k As Integer; gamadat As Double '
Dim L_D As Double, S_D, F As Double, z1, AL_gaylun1, AL_banthan1, cr_mong1, al_dk, al_kiemtra, md_dat
Dim Arr()
On Error GoTo LoiCT
  K = 21

1 Do While Sheet1.Cells(K, 2).Value <> ""
    I = K - 20
3   L_D = Sheet1.Cells(K, 2):    S_D = Sheet1.Cells(K, 3)
    F = Sheet1.Cells(K, 4)
5   md_dat = Sheet1.Cells.Range("Modun_dat_Gs") 'Mo dun dan hoi dat
    Gamadat = Sheet1.Cells.Range("gamadat") ' khoi luong rieng cua dat
7   z1 = zi(S_D) 'Chieu cao phan lop dat
    cr_mong1 = cr_mong(S_D)
9   AL_gaylun1 = AL_gaylun(L_D, S_D, F)
    AL_banthan1 = AL_banthan(L_D, S_D)
  
11  al_dk = 0.2 * AL_gaylun1
    al_kiemtra = AL_gaylun1
13  Do
14        J = 1:
15        Arr(J, 1) = J
16        Arr(J, 2) = (J - 1) * z1
        Arr(J, 3) = 2 * (J - 1) * z1 / cr_mong1
17        Arr(J, 4) = NS("bangtraalpha", 2 * (J - 1) * z1 / cr_mong1)
        Arr(J, 5) = md_dat
19        Arr(J, 6) = Gamadat * (J - 1) * z1 + AL_banthan1
        Arr(J, 7) = NS("bangtraalpha", 2 * (J - 1) * z1 / cr_mong1) * AL_gaylun1
21        Arr(J, 8) = 0.8 * NS("bangtraalpha", 2 * (J - 1) * z1 / cr_mong1) * AL_gaylun1 * z1 / md_dat
        J = J + 1
23        al_kiemtra = NS("bangtraalpha", 2 * (J - 1) * z1 / cr_mong1) * AL_gaylun1
    Loop While al_kiemtra > al_dk
25  tinhlun.Cells(I, 1).Resize(1, 1).Value = Arr
    K = 0
    I = I + 1
Loop
Err_: Exit Sub
LoiCT:
MsgBox "Dòng Sai: " & Erl, , Err & " " & Error()
End Sub
 
Upvote 0
Code rác rưởi, không theo một đường lối, tiêu chuẩn nhất định nào. Sai tùm lum.
Sai ở đây là code sẽ chạy sai chứ nó hiện lỗi lên cho thớt thì coi như thớt may mắn lắm rồi.

Sub tinh_lun_SP()
Dim i, j, k As Integer
Dim L_D, S_D, F, z1, AL_gaylun1, AL_banthan1, cr_mong1, al_dk, al_kiemtra, md_dat, gamadat As Double
Dim arr()
k = 21
Do While Sheet1.Cells(k, 2).Value <> ""
i = k - 20
L_D = Sheet1.Cells(k, 2)
S_D = Sheet1.Cells(k, 3)
F = Sheet1.Cells(k, 4)
md_dat = Sheet1.Cells.Range("Modun_dat_Gs") 'Mo dun dan hoi dat
gamadat = Sheet1.Cells.Range("gamadat") ' khoi luong rieng cua dat
z1 = zi(S_D) 'Chieu cao phan lop dat
cr_mong1 = cr_mong(S_D)
AL_gaylun1 = AL_gaylun(L_D, S_D, F)
AL_banthan1 = AL_banthan(L_D, S_D)

al_dk = 0.2 * AL_gaylun1
al_kiemtra = AL_gaylun1
Do
j = 1
arr(j, 1) = j
arr(j, 2) = (j - 1) * z1
arr(j, 3) = 2 * (j - 1) * z1 / cr_mong1
arr(j, 4) = NS("bangtraalpha", 2 * (j - 1) * z1 / cr_mong1)
arr(j, 5) = md_dat
arr(j, 6) = gamadat * (j - 1) * z1 + AL_banthan1
arr(j, 7) = NS("bangtraalpha", 2 * (j - 1) * z1 / cr_mong1) * AL_gaylun1
arr(j, 8) = 0.8 * NS("bangtraalpha", 2 * (j - 1) * z1 / cr_mong1) * AL_gaylun1 * z1 / md_dat
j = j + 1
al_kiemtra = NS("bangtraalpha", 2 * (j - 1) * z1 / cr_mong1) * AL_gaylun1
Loop While al_kiemtra > al_dk
.Cells(i, 1).Resize(1, 1).Value = arr
k = 0
i = i + 1
Loop

End Sub

1.
...
k = 21
Do While Sheet1.Cells(k, 2).Value <> ""
i = k - 20
L_D = Sheet1.Cells(k, 2)
S_D = Sheet1.Cells(k, 3)
F = Sheet1.Cells(k, 4)
...
k = 0
i = i + 1

Loop

Lượt thứ nhất, k = 21. Vòng trở lại, k = 0
Do While Sheet1.Cells(k, 2).Value <> "" sẽ bị lỗi "Application-defined or Object-defined Error"

2.
Dim arr()
...
arr(j, 1) = j

Giữa 2 dòng lệnhn trên (tức là phần ...) không thấy lệnh Redim nào để xác định kích cỡ của mảng động arr(). Nếu code chạy đến đây sẽ bị lỗi "Subscript out of range"

3.
Do
j = 1
arr(j, 1) = j
...
j = j + 1
al_kiemtra = NS("bangtraalpha", 2 * (j - 1) * z1 / cr_mong1) * AL_gaylun1
Loop While al_kiemtra > al_dk

Tức là j chỉ lẩn quẩn giữa 1 và 2.

Nói chung, code sai nhiều như quân Nguyên. Ở trên chỉ là 3 ví dụ dễ thấy.

Chú cho thớt: lúc nói Sub tinh_lun_SP() thì cũng nên cho biết nó nằm ở mô đun nào. Project của bạn có cả đống mô-đun, bắt tôi phải tìm nó sao?
 
Upvote 0
@Chủ bài đăng: Bạn chịu khó gạch đầu dòng cô đọng những gì mà bạn muốn Code của bạn thực hiện
Qua đó mọi người giúp bạn hướng đi hay cách viết khác & khả dĩ hơn chăng!
 
Upvote 0
Xin chào mọi người!
Mình đã viết đoạn code để tính lún cho móng. Tuy nhiên vòng lặp "Do While - loop và Do - Loop while" ở trong đoạn VBA kèm theo báo lỗi, mình đã tìm hiểu nhưng vẫn chưa được
Mong mọi người giúp đỡ chỉnh sửa lại đoạn vba này. Có thể giải thích cho mình hiểu được lỗi của mình tại sao lại bị thế được không ạ.
So liệu cần tính lấy từ sheet "so lieu" kết quả trả về sheet "tinh lun". Mình đã đưa ra kết quả của một dòng cụ thể
Cám ơn mọi người nhiều
Chỉnh lại code theo đúng công thức trong file
Mã:
Sub tinh_lun_SP()
  Dim i&, r&, j&, k&, eRow&, tong#
  Dim L_D#, S_D#, F#, z1#, z#, AL_gaylun1#, AL_banthan1#, cr_mong1#, al_dk#, al_kiemtra#, md_dat#, gamadat#
  Dim arr(1 To 1000, 1 To 15), rng As Range
    
  Set rng = Range("bangtraalpha")
  With Sheet1
    md_dat = .Range("Modun_dat_Gs") 'Mo dun dan hoi dat
    gamadat = .Range("gamadat") ' khoi luong rieng cua dat
    z = zi(.Cells(21, 3))
    eRow = .Range("B" & Rows.Count).End(xlUp).Row
    For r = 21 To eRow
      arr(k + 1, 1) = r - 20
      L_D = .Cells(r, 2):     arr(k + 1, 2) = L_D
      S_D = .Cells(r, 3):     arr(k + 1, 3) = S_D
      F = .Cells(r, 4):       arr(k + 1, 4) = F
      z1 = zi(S_D) 'Chieu cao phan lop dat
      cr_mong1 = cr_mong(S_D)
      AL_gaylun1 = AL_gaylun(L_D, S_D, F):     arr(k + 1, 5) = AL_gaylun1
      AL_banthan1 = AL_banthan(L_D, S_D):     arr(k + 1, 6) = AL_banthan1
      al_dk = 0.2 * AL_gaylun1
      al_kiemtra = AL_gaylun1

      j = 0:  tong = 0
      Do
        j = j + 1
        k = k + 1
        arr(k, 7) = j           ' So thu tu phan lop dat, khi j=1 thi z1 (lop 1) bang gia tri 0     Ket qua tham chieu tra ve o cot H
        arr(k, 8) = (j - 1) * z1 ' gia tri zi duoc cong don sau moi lan tang j                      Ket qua tham chieu tra ve o cot I, gia tri nay tang tuyen tinh theo Zi o cot H
        arr(k, 9) = 2 * (j - 1) * z1 / cr_mong1 '
        arr(k, 10) = NS(rng, arr(j, 9)) '                               Gia tri J nay phu thuoc vao bang tra, phu thuoc vao gia tri tuong ung theo j o cot I
        arr(k, 11) = md_dat
        If j = 1 Then
          arr(k, 12) = AL_banthan1
        Else
          arr(k, 12) = gamadat * z1 + arr(k - 1, 12) '                                           Gia tri L nay tang dan theo do sau Zi phu thuoc vao so lan lap j, gia tri ban dau = AL_banthan1
        End If
        arr(k, 13) = AL_gaylun1 * arr(k, 10)              '   Gia tri cot M bang gia tri theo cot J tuong ung * AL_gaylun1
        arr(k, 14) = 0.8 * z * arr(k, 13) / arr(k, 11)
        tong = tong + arr(k, 14)
        arr(k, 15) = al_dk
      Loop Until arr(k, 13) < al_dk
      k = k + 1
      arr(k, 8) = "Do lun cua mong la:"
      arr(k, 14) = tong
    Next r
    tinhlun.Range("A6").Resize(k, 15).Value = arr
  End With
End Sub
 
Upvote 0
Cũng không khó chủ yếu là chuyển từ thủ công từng bước sang tự động hóa, bạn mày mò như vầy cũng đã tốt rồi.
Các tiền bối đã lên tiếng thì bạn thử làm theo hướng như sau (áp dụng cho các tính toán sau này):
  • Bạn phải lập ra được 1 tính toán hoàn chỉnh, lưu thành 1 sheet khác, ít nhất cũng có cái để kiểm tra tính toán "cái sự lập trình".
  • Các khối dữ liệu cần rõ ràng Input (Đầu vào) là gì >> Cần tính toán gì >> dữ liệu đầu ra. Từ các khối lớn bạn tiếp tục chia nhỏ ra, như phần input là (Lớp đất | Tải trọng | ...); kết quả đầu ra (áp lực | độ lún | ...)
  • Ghi chú tính toán thành từng bước, sau khi bạn có tư duy mạch lạc như vậy thì bạn mới bắt đầu code, ghi chú từng đoạn 1, bạn không mạch lạc được suy nghĩ thì đâm ra bạ đâu hỏi đó, code nó rối như canh hẹ.
Viết Function cũng có cái hay là tận dụng lại được, nhưng nếu nó không đủ lớn hoặc 1 vài dòng code thì mình nên gộp nó thành 1 Function hay Sub thôi.
 
Upvote 0
...Viết Function cũng có cái hay là tận dụng lại được, nhưng nếu nó không đủ lớn hoặc 1 vài dòng code thì mình nên gộp nó thành 1 Function hay Sub thôi.
Điểm này là chủ quan.
1 vài dòng tôi vẫn có thể viết function riêng như thường. Việc tôi tách nó riêng hay gộp chung tuỳ thuộc vào tính chất độc lập của nó chứ không tuỳ thuộc vào số dòng.
 
Upvote 0
Điểm này là chủ quan.
1 vài dòng tôi vẫn có thể viết function riêng như thường. Việc tôi tách nó riêng hay gộp chung tuỳ thuộc vào tính chất độc lập của nó chứ không tuỳ thuộc vào số dòng.
Chắc phải kiếm đường theo bác VetMini để tư duy nó khá lên. Đọc comment của bác đôi khi cũng thấy tự soi lại mình, mỗi khi thả chữ xuống topic có bác cũng phải tư duy hơn. :p
"Việc tôi tách nó riêng hay gộp chung tuỳ thuộc vào tính chất độc lập của nó ..." --> :good:
 
Upvote 0
Chắc phải kiếm đường theo bác VetMini để tư duy nó khá lên. Đọc comment của bác đôi khi cũng thấy tự soi lại mình, mỗi khi thả chữ xuống topic có bác cũng phải tư duy hơn. :p
"Việc tôi tách nó riêng hay gộp chung tuỳ thuộc vào tính chất độc lập của nó ..." --> :good:
Tôi ít khi cố tình soi mói, bắt bẻ code của cá nhân chỉ vì không thích. (ít khi có nghĩa là ít. Tôi không hề muốn chối là không có cho nên khoan nghĩ là tôi đạon đức ngoài miệng)

Thường thường tôi phê phán code hay giải thuật, tư duy là do tôi nghĩ nó có tính chất chủ quan. Và tôi đưa ra đường lối khác, cũng có thể vẫn chủ quan. Ch nên các bạn trên diễn đàn chỉ cần biết theo nguyên tắc: biết được hai cái chủ quan sẽ khách quan được hơn nhiều.
 
Upvote 0
Qua bài viết này: chân thành cám ơn tất cả các Thầy đã góp ý giúp đỡ. E sẽ học VBA lại từ bước căn bản, VBA rất hữu ích và tiện dụng cho những bài toán dù lớn hay nhỏ. Một lần nữa xin chân thành sự góp ý, chia sẻ kiến thức của các Thầy!
 
Upvote 0
Web KT

Bài viết mới nhất

Back
Top Bottom