Chuyên đề giải đáp những thắc mắc về code VBA

Liên hệ QC

maytinhvp01

Thành viên thường trực
Tham gia
27/7/13
Bài viết
390
Được thích
179
Mình muốn nhờ giải thich câu lệnh " If Ran.Cells(d, c) > max Then max = Ran.Cells(d, c) "
trong ví du:
Public Function LonNhat(Ran As Range)
Dim max As Double, v As Integer, d As Integer, c As Integer
max = Ran.Cells(1, 1)
For d = 1 To Ran.Rows.Count
For c = 1 To Ran.Columns.Count
If Ran.Cells(d, c) > max Then max = Ran.Cells(d, c)
Next c
Next d
v = Tim(max, Ran)
LonNhat = max
End Function
-------------------------------------------------------
[INFO1]Thông báo:
Vì topic này:
http://www.giaiphapexcel.com/forum/...ải-thích-các-code-đề-nghị-các-bạn-gửi-vào-đây
đã quá dài nên BQT đóng lại.
Nay tôi mở topic mới với cùng chủ đề: GIẢI THÍCH NHỮNG THẮC MẮC VỀ CODE
Các bạn nếu có nhu cầu giải thích code, vui lòng post tại đây nhé
NDU96081631

[/INFO1]
 
Chỉnh sửa lần cuối bởi điều hành viên:
chào mọi người
mọi người cho mình hỏi vấn đề thế này
ví dụ có 1 sheet tên "A-B" khi sử dụng code Sheets("A-B").codename thì bị lỗi 1004 do có ký tự đặc biệt "-"
vậy làm sao để thao tác với những sheet có ký tự đặc biệt như thế.
không dùng kiểu Sheets(1).codename nhé.
cảm ơn mọi người.
 
Upvote 0
chào mọi người
mọi người cho mình hỏi vấn đề thế này
ví dụ có 1 sheet tên "A-B" khi sử dụng code Sheets("A-B").codename thì bị lỗi 1004 do có ký tự đặc biệt "-"
vậy làm sao để thao tác với những sheet có ký tự đặc biệt như thế.
không dùng kiểu Sheets(1).codename nhé.
cảm ơn mọi người.
máy mình vẫn bình thường không bị lỗi: test=Sheets("A-B").codename
 
Upvote 0
máy mình vẫn bình thường không bị lỗi: test=Sheets("A-B").codename
vậy hỏi mà chưa test trước rồi :v
thử lại cái này he bạn
tạo 2 sheet 1 sheet tên "Sheet1" 1 sheet tên "A-B"
thử code này xem
Mã:
Sub Test()
MsgBox Range("Sheet1!A1").Column
MsgBox Range("A-B!A1").Column'<lỗi 1004
End Sub
tương tự nếu thay "-" thành " "
 
Upvote 0
vậy hỏi mà chưa test trước rồi :v
thử lại cái này he bạn
tạo 2 sheet 1 sheet tên "Sheet1" 1 sheet tên "A-B"
thử code này xem
Mã:
Sub Test()
MsgBox Range("Sheet1!A1").Column
MsgBox Range("A-B!A1").Column'<lỗi 1004
End Sub
tương tự nếu thay "-" thành " "
Với tên sheet hơi "lạ", ta nên cho cặp dấu nháy đơn vào trước và sau tên sheet:
Sub Test()
MsgBox Range("'A-B'!A1").Column
End Sub
 
Upvote 0
Em có đoạn code như dưới, mà chưa hiểu tại sao nó lại hiện ra hai hộp thoại với nội dung giống nhau, theo em nghĩ nó phải khác nhau. Mong mọi người giải thích giúp.

Mã:
Sub thu()
    Dim c As Collection
    Set c = New Collection
    c.Add 1
    c.Add 2
    MsgBox Hex(VarPtr(c.Item(1)))
    c.Add 3
    MsgBox Hex(VarPtr(c.Item(2)))
    
End Sub
 
Upvote 0
cho em hỏi thêm
Mã:
Sub checksListFormat()
    Dim oShell As Object
    Dim sList
    Set oShell = CreateObject("wscript.shell")
    sList = oShell.RegRead("HKEY_CURRENT_USER\Control Panel\International\sList")
    MsgBox sList
    oShell.RegWrite "HKEY_CURRENT_USER\Control Panel\International\sList", IIf(sList = ",", ";", ",")
    sList = oShell.RegRead("HKEY_CURRENT_USER\Control Panel\International\sList")
    MsgBox sList
End Sub
dùng để đổi dấu slist Separator qua lại giữa dấu chấm phẩy và dấu phẩy ( ngăn cách các biến số trong công thức)
code có tác dụng vào resgedit, vào control panel xem thì có thấy sự thay đổi của tham số slist Separator
nhưng còn trên excel vẫn như cũ. vậy làm sao để code có tác dụng ngay được ạ.
==================================
cụ thể ban đầu là dấu chấm phẩy
sau khi chạy code thì slist Separator là dấu phẩy
nhưng công thức thì vẫn là dấu chấm phẩy, không đổi thành dấu phẩy được
 
Upvote 0
Các bạn Cho mình hỏi ADO giới hạn truy vấn số cột là 256 và số dòng 65536 phải ko nhỉ ? Xin cảm ơn !
 
Upvote 0
Các bạn Cho mình hỏi ADO giới hạn truy vấn số cột là 256 và số dòng 65536 phải ko nhỉ ? Xin cảm ơn !
Hình như là vậy!
Tuy nhiên bạn có thể thí nghiệm trực tiếp trên dữ liệu để kiểm chứng (thay vì hỏi và chờ trả lời)
 
Upvote 0
Thí nghiệm bằng cái gì?
ADO là một công cụ của Windows. Giới hạn tuỳ theo cái cổ máy (engine) mà chuỗi kết nối bảo nó dùng.
 
Upvote 0
chào mọi người. tình hình là thầy giáo giao cho em nhiệm vụ lập trình vba để nhúng phần mềm thứ 3 là sap2000 để điều kiển sap2000? vậy cho e hỏi như thế có thể làm được không ạ? và độ khó cho 1 người chưa biết về vba là thế nào ạ? Em cảm ơn mọi người, hi vọng mọi người góp ý ạ!!!
 
Upvote 0
E có xem 1 code VBA nội suy 2 chiều , lần đầu xem chưa có kiến thức nhiều , mong a/c giải đáp 1 số thắc mắc như sau ạ
Code chỗ mục Modules là để phục vụ cho code trong Sheet excel phải k ạ ?
Ở ví dụ code nội suy 2 chiều, tác giả viết phần code Module:
Mã:
Function ns1(x, X1, X2, GT1, GT2)
    TG = GT2 + (GT1 - GT2) * (x - X2) / (X1 - X2)
    ns1 = TG
End Function
Function NSM(x, y, MANGZ)
    hang = 1
    Cot = 1
    For i = 1 To 100
        If MANGZ(i, 1) <> "" Then hang = hang + 1
        If MANGZ(i, 1) = 35 Then i = 50
    Next i
    For j = 1 To 100
        If MANGZ(1, j) <> "" Then Cot = Cot + 1
    Next j

    For i = 1 To hang
        If x <= MANGZ(i, 1) Then
        X1 = MANGZ(i, 1)
        X2 = MANGZ(i - 1, 1)
        VTX = i
        i = hang
        End If
    Next i
    For j = 1 To Cot
        If y <= MANGZ(1, j) Then
        Y1 = MANGZ(1, j)
        Y2 = MANGZ(1, j - 1)
        VTY = j
        j = Cot
        End If
    Next j
    x1y1 = MANGZ(VTX, VTY)
    x1y2 = MANGZ(VTX, VTY - 1)
    x2y1 = MANGZ(VTX - 1, VTY)
    x2y2 = MANGZ(VTX - 1, VTY - 1)
    'NOI SUY
    t3 = ns1(y, Y1, Y2, x2y1, x2y2)
    T4 = ns1(y, Y1, Y2, x1y1, x1y2)
    NSM = ns1(x, X1, X2, T4, t3)
End Function
Ở phần code sheet :
Mã:
Private Sub noisuy2chieu_Click()

i = 8
While Sheet1.Cells(i, "D") <> ""

 Ketqua = NSM(Sheet1.Cells(i, "D"), Sheet1.Cells(i, "E"), Sheet1.Range("H9:O16"))
 Sheet1.Cells(i, "F") = Ketqua

i = i + 1
Wend

End Sub
Mong a/c nào có thể dịch từng câu lệnh, cú pháp để e hiểu hơn được không ạ.
 
Upvote 0
Thí nghiệm bằng cái gì?
ADO là một công cụ của Windows. Giới hạn tuỳ theo cái cổ máy (engine) mà chuỗi kết nối bảo nó dùng.
E thí nghiệm trong môi trường Excel 2013,mệnh đề From Vung - Range("A5:C65537") --> Báo lỗi. Nhưng sửa thành Range("A5:C65536") thì chạy bình thường.
E có đọc được bài viết của thầy NDU trong Bài tập ADO căn bản của A Hai Lúa Miền Tây và các bài tiếp theo: http://www.giaiphapexcel.com/diendan/threads/bài-tập-về-ado-căn-bản.75143/page-6
Nhưng có thắc mắc: Có phải với Name bình thường sẽ bị giới hạn trong phạm vi 65536 dòng, nhưng đã có giải pháp để tăng truy vấn lên tận 500.000 dòng và hơn thế nữa. Phải chăng ADO bị giới hạn với 1 name đặt Thủ công như cách của e .
 
Upvote 0
Bài đó đã hơn 4 năm rồi. Trong khoảng thời gian đó có nhiều thay đổi và cải tiến công nghệ.
 
Upvote 0
Mong a/c nào có thể dịch từng câu lệnh, cú pháp để e hiểu hơn được không ạ.

Mói học code thì tìm những bài có chú thích rõ ràng mà học.
Mấy cái code này tác giả khong có cho biết mình dùng giải thuật gì, tôi khong thể kiểm chứng viết như vậy là đúng hay sai cho nên lười đọc và giải thích lắm.

Ví dụ đáng lẽ phảí tính A+B, tác giả viết sai thành A-B thì tìm cả ngày cũng chưa chắc ra.
 
Upvote 0
Bài đó đã hơn 4 năm rồi. Trong khoảng thời gian đó có nhiều thay đổi và cải tiến công nghệ.
Cảm ơn A. E đag pải tìm hiểu dần ạ. Phải đi từ cái 4 năm trước mới được ý, chứ theo công nghệ tại thời điểm này thì chạy k nổi :rolleyes:
 
Upvote 0
Tiện đây, nhờ a @VetMini xem giúp e bài này. sử dụng hàm sumifs trong VBA, k hiểu điều kiện sai ở chỗ nào mà ko ra đc kết quả
 

File đính kèm

  • sumifs_VAB.xlsm
    14.8 KB · Đọc: 8
Upvote 0
Bạn copy code đưa lên, và cho biết code làm cái gì. Tôi đọc lô gic của code trước và chỉ tải file về khi cần kiểm chứng đúng sai.
 
Upvote 0

File đính kèm

  • Copy of sumifs_VAB.xlsm
    16.2 KB · Đọc: 14
Upvote 0
Web KT

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

Back
Top Bottom