Những câu hỏi về code, xin giải thích các code, đề nghị các bạn gửi vào đây

Liên hệ QC
Status
Không mở trả lời sau này.

ST-Lu!

Love Wingchun
Tham gia
19/8/08
Bài viết
730
Được thích
546
Nghề nghiệp
Xích lô một thời
Kể từ hôm nay, tất cả những câu hỏi nhờ giải thích dùm một đoạn code, hay là hỏi những vấn đề linh tinh gì liên quan đến cách viết code, đề nghị các bạn gửi chung vào đây.

Những đề tài mới với tiêu đề: "Nhờ giải thích dùm đoạn code", mà không nói rõ là code gì, code dùng để làm gì, sẽ bị xóa.

BQT

----------------------------------------------------------------------------------------------------------------


Em xin được hỏi 2 đoạn code sau có tương đương nhau ?

Cells(Cells.Rows.Count, 1).End(xlUp).Row có tương đương với [A65000].End(xlup).row

Cám ơn các anh chỉ giáo
 
Chỉnh sửa lần cuối bởi điều hành viên:
Nhờ các bạn giải thích và sửa giúp mình đoạn code sau:

Mình có được một bạn làm giúp cho một đoạn code sau:
Public Sub XUBULU()
Dim sArr(), Darr(), I As Long, J As Long, N As Long, Vtr As Long, Num As Long, DK As Long
sArr = Range([A1], [A1].End(xlDown)).Resize(, 22).Value
ReDim Darr(1 To UBound(sArr, 1), 1 To 2)
For I = 1 To UBound(sArr, 1) - 1
DK = sArr(I, 1)
For N = I + 1 To UBound(sArr, 1)
For J = 6 To 22
If sArr(N, J) = DK Then
Darr(I, 1) = N - I: Darr(I, 2) = Darr(I, 2) + 1
End If
Next J
If Darr(I, 1) > 0 Then Exit For
Next N
Next I
[C1].Resize(I - 1, 2).Value = Darr
End Sub
Nhưng bây giờ mình muốn hoàn thiện hơn. Thay vì so sánh 1 cell A1 mình muốn so sánh cả 1 mảng A1:B1
Rẩt mong được các bạn giúp mình.
 

File đính kèm

  • Code.rar
    10.6 KB · Đọc: 5
Upvote 0
các bác giúp e với, e đang tập tành lập trình mà sao cứ lỗi ạ, tìm mãi ko ra lỗi

Function asct(Rb, Rs, A, N, ra, r, delta, eo, nguy) As Double

'Don vi vao T, cm
'Don vi tinh T, cm
Dim Rb, Rs As Double
Dim N, Ngh, nguy, eo, A, r, ra, phis, phi, phia, Zs As Double
Dim Ast, txi, delta, deltaphi As Double
Const Pi = 3.14159
phia = 2.5 * N * 10 ^ 4 / (A * 100 * Rb)
deltaphi = 1
Do
deltaphi = deltaphi + 1
phi = phia + deltaphi / 1000
txi = phia / Pi
If txi > 0.15 Then
phis = 1 - delta * txi
If phis < 0 Then phis = 0
End If
Zs = (0.2 + 1.3 * txi) * ra
Else
phis = 1 - delta * 0.15
If phis < 0 Then phis = 0
End If
Zs = (0.2 + 1.3 * 0.15) * ra
End If
Ast = (N * 10 ^ 4 * nguy * eo - 2 / (3 * Pi) * Rb * 10 ^ 2 * A * r * Sin(phi) ^ 3) / (1 / Pi * Rs * 10 ^ 2 * ra * Sin(phi) + Rs * 10 ^ 2 * phis * Zs)
Ngh = (Rb * 10 ^ 2 * A / Pi * (phi - 0.5 * Sin(2 * phi)) + Rs * 10 ^ 2 * Ast / Pi * phi - Rs * 10 ^ 2 * Ast * phis) / 10000
Loop Until Ngh = N
asct = Ast
End Function
không hiểu sai ở đâu, các bác cao thủ chỉ e với! thanks
 
Upvote 0
Function asct(Rb, Rs, A, N, ra, r, delta, eo, nguy) As Double

'Don vi vao T, cm
'Don vi tinh T, cm
Dim Rb, Rs As Double
Dim N, Ngh, nguy, eo, A, r, ra, phis, phi, phia, Zs As Double
Dim Ast, txi, delta, deltaphi As Double
Const Pi = 3.14159
phia = 2.5 * N * 10 ^ 4 / (A * 100 * Rb)
deltaphi = 1
Do
deltaphi = deltaphi + 1
phi = phia + deltaphi / 1000
txi = phia / Pi
If txi > 0.15 Then
phis = 1 - delta * txi
If phis < 0 Then phis = 0
End If
Zs = (0.2 + 1.3 * txi) * ra
Else
phis = 1 - delta * 0.15
If phis < 0 Then phis = 0
End If
Zs = (0.2 + 1.3 * 0.15) * ra
End If
Ast = (N * 10 ^ 4 * nguy * eo - 2 / (3 * Pi) * Rb * 10 ^ 2 * A * r * Sin(phi) ^ 3) / (1 / Pi * Rs * 10 ^ 2 * ra * Sin(phi) + Rs * 10 ^ 2 * phis * Zs)
Ngh = (Rb * 10 ^ 2 * A / Pi * (phi - 0.5 * Sin(2 * phi)) + Rs * 10 ^ 2 * Ast / Pi * phi - Rs * 10 ^ 2 * Ast * phis) / 10000
Loop Until Ngh = N
asct = Ast
End Function
không hiểu sai ở đâu, các bác cao thủ chỉ e với! thanks

chưa test nhưng xem qua đã thấy 2 câu này không ổn :
Đã khai báo biến ở Funciton
PHP:
Function asct(Rb, Rs, A, N, ra, r, delta, eo, nguy) As Double
? sao lại khai báo ở Dim làm gì nữa nhj
PHP:
Dim N, Ngh, nguy, eo, A, r, ra, phis, phi, phia, Zs As Double
 
Upvote 0
Function asct(Rb, Rs, A, N, ra, r, delta, eo, nguy) As Double

'Don vi vao T, cm
'Don vi tinh T, cm
Dim Rb, Rs As Double
Dim N, Ngh, nguy, eo, A, r, ra, phis, phi, phia, Zs As Double
Dim Ast, txi, delta, deltaphi As Double
Const Pi = 3.14159
phia = 2.5 * N * 10 ^ 4 / (A * 100 * Rb)
deltaphi = 1
Do
deltaphi = deltaphi + 1
phi = phia + deltaphi / 1000
txi = phia / Pi
If txi > 0.15 Then
phis = 1 - delta * txi
If phis < 0 Then phis = 0
End If
Zs = (0.2 + 1.3 * txi) * ra
Else
phis = 1 - delta * 0.15
If phis < 0 Then phis = 0
End If
Zs = (0.2 + 1.3 * 0.15) * ra
End If
Ast = (N * 10 ^ 4 * nguy * eo - 2 / (3 * Pi) * Rb * 10 ^ 2 * A * r * Sin(phi) ^ 3) / (1 / Pi * Rs * 10 ^ 2 * ra * Sin(phi) + Rs * 10 ^ 2 * phis * Zs)
Ngh = (Rb * 10 ^ 2 * A / Pi * (phi - 0.5 * Sin(2 * phi)) + Rs * 10 ^ 2 * Ast / Pi * phi - Rs * 10 ^ 2 * Ast * phis) / 10000
Loop Until Ngh = N
asct = Ast
End Function
không hiểu sai ở đâu, các bác cao thủ chỉ e với! thanks

Sau khi sửa xong các khai báo --> hàm này sẽ chạy với vòng lặp gần như là vô tận ? --> bạn biết tại sao không ?
Mình đoán không nhầm bạn muốn giải phương trình N <= Ngh(Asct) --> tức là bạn muốn tìm giá trị Asct thỏa mãn điều kiện N = Ngh --> nhưng mà hàm Ngh(Asct) phức tạp --> bạn cần giới hạn lại điều kiện N = Ngh
--> gửi thử phương trình tính diện tích cốt thép lên cho mình xem qua<--------- Cái này là cấu kiện chịu nén ah
 
Lần chỉnh sửa cuối:
Upvote 0
Sau khi sửa xong các khai báo --> hàm này sẽ chạy với vòng lặp gần như là vô tận ? --> bạn biết tại sao không ?
Mình đoán không nhầm bạn muốn giải phương trình N <= Ngh(Asct) --> tức là bạn muốn tìm giá trị Asct thỏa mãn điều kiện N = Ngh --> nhưng mà hàm Ngh(Asct) phức tạp --> bạn cần giới hạn lại điều kiện N = Ngh
--> gửi thử phương trình tính diện tích cốt thép lên cho mình xem qua<--------- Cái này là cấu kiện chịu nén ah
đúng bác ạ! đây là cấu kiện chịu nén, tính cột tròn, bác cũng là dân xd ạ, em viết ph theo sách thầy Nguyễn Đình Cống, theo phương pháp gần đúng, cthuc như e lập ý, theo bác thì hướng giải quyết thế nào ạ! tẹo nữa ăn trưa xong e viết rõ cthức cho bác xem!
 
Upvote 0
Sau khi sửa xong các khai báo --> hàm này sẽ chạy với vòng lặp gần như là vô tận ? --> bạn biết tại sao không ?
Mình đoán không nhầm bạn muốn giải phương trình N <= Ngh(Asct) --> tức là bạn muốn tìm giá trị Asct thỏa mãn điều kiện N = Ngh --> nhưng mà hàm Ngh(Asct) phức tạp --> bạn cần giới hạn lại điều kiện N = Ngh
--> gửi thử phương trình tính diện tích cốt thép lên cho mình xem qua<--------- Cái này là cấu kiện chịu nén ah

http://www.mediafire.com/view/?xlt3xgpbd28imza
bác xem hộ e xem giải quyết thế nào ạ! thanks!
 
Upvote 0
http://www.mediafire.com/view/?xlt3xgpbd28imza
bác xem hộ e xem giải quyết thế nào ạ! thanks!
Mình Sửa lại một vài chỗ trong đoạn code của bạn như sau :
[GPECODE=vb]
Function asct(Rb, Rs, A, N, ra, r, delta, eo, nguy) As Double
'Don vi vao T, cm
'Don vi tinh T, cm
Dim Ngh As Double, phis As Double, phi As Double, phia As Double, Zs As Double
Dim Ast As Double, txi As Double, deltaphi As Double
Const Pi = 3.14159
phia = 2.5 * N * 10 ^ 4 / (val(A) * 100 * val(Rb))
deltaphi = 1
Do
deltaphi = deltaphi + 1
phi = phia + deltaphi / 1000
txi = phia / Pi
If txi > 0.15 Then
phis = 1 - val(delta) * txi
If phis < 0 Then phis = 0
Zs = (0.2 + 1.3 * txi) * ra
Else
phis = 1 - val(delta) * 0.15
If phis < 0 Then phis = 0
Zs = (0.2 + 1.3 * 0.15) * val(ra)
End If
Ast = (val(N) * 10 ^ 4 * val(nguy) * val(eo) - 2 / (3 * Pi) * val(Rb) * 10 ^ 2 * val(A) * val(r) * Sin(phi) ^ 3) / _
(1 / Pi * val(Rs) * 10 ^ 2 * val(ra) * Sin(phi) + val(Rs) * 10 ^ 2 * phis * Zs)
Ngh = (val(Rb) * 10 ^ 2 * A / Pi * (phi - 0.5 * Sin(2 * phi)) + val(Rs) * 10 ^ 2 * Ast / _
Pi * phi - val(Rs) * 10 ^ 2 * Ast * phis) / 10000
Loop Until Ngh <= N
asct = Ast
End Function
[/GPECODE]
Bạn chú ý đến cấu trúc Do ........ Loop Until thì Ngh<=N ,
Còn nếu viết Do..............Loop While thì Ngh>=N

Để bảo đảm rằng kết quả tính Diện tích thép cần thiết luôn thoả mãn điều kiện Ngh>=N
 
Upvote 0
Mình Sửa lại một vài chỗ trong đoạn code của bạn như sau :
[GPECODE=vb]
Function asct(Rb, Rs, A, N, ra, r, delta, eo, nguy) As Double
'Don vi vao T, cm
'Don vi tinh T, cm
Dim Ngh As Double, phis As Double, phi As Double, phia As Double, Zs As Double
Dim Ast As Double, txi As Double, deltaphi As Double
Const Pi = 3.14159
phia = 2.5 * N * 10 ^ 4 / (val(A) * 100 * val(Rb))
deltaphi = 1
Do
deltaphi = deltaphi + 1
phi = phia + deltaphi / 1000
txi = phia / Pi
If txi > 0.15 Then
phis = 1 - val(delta) * txi
If phis < 0 Then phis = 0
Zs = (0.2 + 1.3 * txi) * ra
Else
phis = 1 - val(delta) * 0.15
If phis < 0 Then phis = 0
Zs = (0.2 + 1.3 * 0.15) * val(ra)
End If
Ast = (val(N) * 10 ^ 4 * val(nguy) * val(eo) - 2 / (3 * Pi) * val(Rb) * 10 ^ 2 * val(A) * val(r) * Sin(phi) ^ 3) / _
(1 / Pi * val(Rs) * 10 ^ 2 * val(ra) * Sin(phi) + val(Rs) * 10 ^ 2 * phis * Zs)
Ngh = (val(Rb) * 10 ^ 2 * A / Pi * (phi - 0.5 * Sin(2 * phi)) + val(Rs) * 10 ^ 2 * Ast / _
Pi * phi - val(Rs) * 10 ^ 2 * Ast * phis) / 10000
Loop Until Ngh <= N
asct = Ast
End Function
[/GPECODE]
Bạn chú ý đến cấu trúc Do ........ Loop Until thì Ngh<=N ,
Còn nếu viết Do..............Loop While thì Ngh>=N

Để bảo đảm rằng kết quả tính Diện tích thép cần thiết luôn thoả mãn điều kiện Ngh>=N

ôi, cám ơn bác nhìu nhìu ạ! à bác cho e hỏi 1 câu chắc là rất ngớ ngẩn, vì e mới tập tành nên chưa hiểu cái hàm val() có ý nghĩa là gì ạ! :((
 
Upvote 0
ôi, cám ơn bác nhìu nhìu ạ! à bác cho e hỏi 1 câu chắc là rất ngớ ngẩn, vì e mới tập tành nên chưa hiểu cái hàm val() có ý nghĩa là gì ạ! :((

Val() bạn có thể hiểu nó gần như hàm Value trong excel --->Bạn có thể tìm hiểu tài liệu về VBA trên diễn đàn
Vì các giá trị Rs, Ra... bạn khai báo là Variant --> nên mình cẩn thận thêm val() đề phòng trường hợp bạn gõ công thức như sau = asct(Rs,Ra,..deta*10...) --> có thể hàm sẽ báo lỗi value!
 
Upvote 0
Vấn đề Vba mong được mọi người giúp đỡ.

Tình hình là em muốn viết code để báo khi trong một cột có giá trị # những giá trị còn lại.
ví dụ em có dữ liệu ô A1 đến ô A5 nếu A1 đến A5 bằng nhau thì cho kết quả đúng ngược lại thì sai. Em thử viết đại if A1=A2=A3=A4=A5,true,false thì không được hi. Rất mong được mọi ngươi giúp đỡ. em cảm ơn nhiều ạk!
 

File đính kèm

  • Vi du.xlsx
    8.1 KB · Đọc: 5
Upvote 0
Tình hình là em muốn viết code để báo khi trong một cột có giá trị # những giá trị còn lại.
ví dụ em có dữ liệu ô A1 đến ô A5 nếu A1 đến A5 bằng nhau thì cho kết quả đúng ngược lại thì sai. Em thử viết đại if A1=A2=A3=A4=A5,true,false thì không được hi. Rất mong được mọi ngươi giúp đỡ. em cảm ơn nhiều ạk!
Bạn cần mô tả kỹ hơn 1 chút vấn đề như sau:
1/ Cho kết quả "đúng", "sai" => vị trí hiển thị ở đâu?
2/ Quá trình so sánh là ngay khi nhập dữ liệu hay như thế nào?
3/ Viết Code rồi bạn có thể tự tùy biến được hay không? Nếu không tùy biến được thì bạn đưa File thực lên nhé!
 
Upvote 0
1. ...........
If [A1].Value = [A2].Value = [A3].Value = [A4].Value = [A5].Value Then
MsgBox "kiem tra lai"
End sub
End If
dạ em cần so sánh thế này ạ
2. so sánh khi em chạy macro
3. em tùy biến cho phù hợp được anh
 
Upvote 0
Bạn tuỳ biến nhé
Mã:
Sub CheckUnique()
Dim i As Long
    For i = 1 To [A3:A7].Count
        If Cells(i, 1).Value - Cells(i + 1, 1).Value > 0 Then
            MsgBox "Kiem tra lai"
        End If
    Next
End Sub
 
Upvote 0
Tình hình là em muốn viết code để báo khi trong một cột có giá trị # những giá trị còn lại.
ví dụ em có dữ liệu ô A1 đến ô A5 nếu A1 đến A5 bằng nhau thì cho kết quả đúng ngược lại thì sai. Em thử viết đại if A1=A2=A3=A4=A5,true,false thì không được hi. Rất mong được mọi ngươi giúp đỡ. em cảm ơn nhiều ạk!

Với công thức thì ta dùng hàm AND

= And(A1=A2, A2=A3,A3=A4, A4=A5)


trong VBA thì biểu thức với toán tử And, viết thành

PHP:
 [A1]=[A2] And [A2]=[A3] And [A3=[A4] And [A4]=[A5]

VD viết thành câu lệnh IF trong VBA

PHP:
If  [A1]=[A2] And [A2]=[A3] And [A3=[A4] And [A4]=[A5] Then
    MsgBox "Cac cells A1=A2=A3=A4=A5"
Else
    MsgBox "Cac cells  A1,A2,A3,A4,A5 KHONG bang nhau"
End If

thế thui, giản đơn vậy
 
Lần chỉnh sửa cuối:
Upvote 0
@vodoi2x thank anh nhưng em nghĩ câu lệnh dài dòng hơn cách dùng for next khi số dòng nhiều
 
Upvote 0
@vodoi2x thank anh nhưng em nghĩ câu lệnh dài dòng hơn cách dùng for next khi số dòng nhiều

Dĩ nhiên, tôi chỉ là ví dụ (bạn đưa ví dụ cũng chỉ có 6 cells mà) để hiểu bản chất vấn đề, thế thui

Dùng For Next thì cũng nên dùng toán tử And, hoặc nhanh hơn nữa là toán tử Or

Túm lại viết code thì còn tùy thuộc bài cụ thể, vậy bạn biến hóa đi nhé,
 
Upvote 0
Góp ý với bạn:
1/ Bạn cần chú ý tới nội quy. Tên topic đang sai với quy chuẩn của GPE.
2/ Bạn dành nhiều thời gian hơn nghiên cứu rồi chúng ta thảo luận tiếp nhé!
 
Upvote 0
em nghĩ câu lệnh dài dòng hơn cách dùng for next khi số dòng nhiều
Giả sử dữ liệu của bạn bắt đầu từ ô A1 và dài đến A(n), chạy thử code này
PHP:
Sub sosanh()
Dim data(), i, k
data = Range([A1], [A65536].End(3)).Value
With CreateObject("scripting.dictionary")
   For i = 1 To UBound(data)
      If Not .exists(data(i, 1)) Then
         k = k + 1
         .Add data(i, 1), ""
      End If
      If k > 1 Then Exit For
   Next
End With
If k > 1 Then MsgBox "Du lieu khac nhau tai cell " & i
If k = 1 Then MsgBox "Không có du lieu khac nhau"
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Giả sử dữ liệu của bạn bắt đầu từ ô A1 và dài đến A(n), chạy thử code này
PHP:
Sub sosanh()
Dim data(), i, k
data = Range([A1], [A65536].End(3)).Value
With CreateObject("scripting.dictionary")
   For i = 1 To UBound(data)
      If Not .exists(data(i, 1)) Then
         k = k + 1
         .Add data(i, 1), ""
      End If
      If k > 1 Then Exit For
   Next
End With
If k > 1 Then MsgBox "Du lieu khac nhau tai cell " & i
If k = 1 Then MsgBox "Không có du lieu khac nhau"
End Sub
Gì mà phải đít to, ghê vậy
- Lấy giá trị đầu tiên làm mẫu
- So sánh mẫu với tất cả (vòng lập). Nếu có khác biệt, thoát vòng lập
Vậy thôi
 
Upvote 0
Status
Không mở trả lời sau này.
Web KT

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

Back
Top Bottom