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:
'Allowance qty
Select Case (Cells(i, 13).Value)
Case "Voc"
Cells(x + 15, y + resignMonth).Value = Cells(x + 15, y + resignMonth).Value + 1
Sheets("MsTung request").Cells(4, 13 + resignMonth).Value = Sheets("MsTung request").Cells(4, 13 + resignMonth).Value + 1
Case "S.term"
Cells(x + 16, y + resignMonth).Value = Cells(x + 16, y + resignMonth).Value + 1
Sheets("MsTung request").Cells(5, 13 + resignMonth).Value = Sheets("MsTung request").Cells(5, 13 + resignMonth).Value + 1
Case "None"
Cells(x + 17, y + resignMonth).Value = Cells(x + 17, y + resignMonth).Value + 1
Case "Elder3"
Cells(x + 18, y + resignMonth).Value = Cells(x + 18, y + resignMonth).Value + 1
Case "Elder 2"
Cells(x + 19, y + resignMonth).Value = Cells(x + 19, y + resignMonth).Value + 1
Case "Elder 1"
Cells(x + 20, y + resignMonth).Value = Cells(x + 20, y + resignMonth).Value + 1
Case "Skill 4"
Cells(x + 21, y + resignMonth).Value = Cells(x + 21, y + resignMonth).Value + 1
Case "Skill 3"
Cells(x + 22, y + resignMonth).Value = Cells(x + 22, y + resignMonth).Value + 1
Case "Skill 2"
Cells(x + 23, y + resignMonth).Value = Cells(x + 23, y + resignMonth).Value + 1
Case "Skill 1"
Cells(x + 24, y + resignMonth).Value = Cells(x + 24, y + resignMonth).Value + 1
Case "Support 2"
Cells(x + 25, y + resignMonth).Value = Cells(x + 25, y + resignMonth).Value + 1
Case Else
Cells(x + 26, y + resignMonth).Value = Cells(x + 26, y + resignMonth).Value + 1

Cho em hỏi có cách nào để thu gọn các lệnh giống nhau liên tiếp thế này và cải thiện tốc độ chạy của VBA ạ


Vận dụng vòng lặp
Nếu muốn nhanh hơn với dữ liệu nhiều hơn thì mảng phải được sắp xếp, và xử dụng thuật toán tìm kiếm, như Tìm kiếm nhị phân, tìm kiếm hồi quy, ...
PHP:
Dim R&, Arr
Arr = VBA.Array("Voc", "S.term", "...")
For R = 0 to Ubound(Arr)
    If Arr(R) = (Cells(i, 13).Value) Then
       R = R + 15
        Cells(x + R, y + resignMonth).Value = Cells(x + R, y + resignMonth).Value + 1
        If R = 15 Or R = 16 Then
           R = R - 11
            Sheets("MsTung request").Cells(R, 13 + resignMonth).Value = Sheets("MsTung request").Cells(R, 13 + resignMonth).Value + 1
        End If
       Exit For
    End IF
Next
 
Lần chỉnh sửa cuối:
Upvote 0
Nhờ các bạn xem giúp mình code này sai ở đâu với, thấy toàn báo lỗi Invalid Next Control Variable Reference

Sub yuop()

Dim i As Integer
Dim j As Integer

Application.EnableEvents = False

For i = 1 To 1000
For j = 1 To 1000

Sheets("Sheet1").Cells(i + 1, j + 1).Value = Sheets("Sheet1").Cells(i, j).Value

Next i
Next j

Application.EnableEvents = True

End Sub
 
Upvote 0
Nhờ các bạn xem giúp mình code này sai ở đâu với, thấy toàn báo lỗi Invalid Next Control Variable Reference

Sub yuop()

Dim i As Integer
Dim j As Integer

Application.EnableEvents = False

For i = 1 To 1000
For j = 1 To 1000

Sheets("Sheet1").Cells(i + 1, j + 1).Value = Sheets("Sheet1").Cells(i, j).Value

Next i
Next j

Application.EnableEvents = True

End Sub
Thử sửa như bên dưới xem sao
Next i thành Next j
Next j thành Next i
 
Upvote 0
Chào chủ thớt và mọi người.
Hiện em gặp chút thắc mắc, mong mọi người giải đáp cho ạ.
Em sử dùng Userform có 1 Button "Kết quả" và 1 TextBox, Khi nhấn Button thì nó sẽ so sánh 2 ô E"x" và F"x",
Nếu giá trị ô F"x" > giá trị ô E"x" => Điền vào ô G"x" là "Lãi" hiển thị lên TextBox là "Đã đủ chỉ tiêu", còn nếu ko thì sẽ điền vào ô G"x" là "Lỗ" và TextBox là "Chưa đủ chỉ tiêu",
đồng thời gán x = x + 1.
Và nếu ở TextBox là "Đã đủ chỉ tiêu" Thì sẽ bôi màu nền hoặc màu chữ màu Xanh, và nếu "Chưa đủ chỉ tiêu" thì sẽ bôi màu nền hoặc màu chữ màu Đỏ.
Mọi người giúp em đoạn code này với ạ.
Em xin cảm ơn

Screenshot_60.png
 
Lần chỉnh sửa cuối:
Upvote 0
Em sử dùng Userform có 1 Button "Kết quả" và (A) 1 TextBox, Khi nhấn Button thì nó sẽ so sánh 2 ô E"x" và F"x",
Nếu giá trị ô F"x" > giá trị ô E"x" => Điền vào ô G"x" là "Lãi" hiển thị lên TextBox là "Đã đủ chỉ tiêu", còn nếu ko thì sẽ điền vào ô G"x" là "Lỗ" và TextBox là "Chưa đủ chỉ tiêu",
(B) đồng thời gán x = x + 1.
. . . . . . .
Mình thử dịch từ tiếng Việt của bạn sang tiếng Việt phổ thông xem đúng không nha:
:D (A) Mình cần so dánh các trị cùng dòng trong hai cột 'E' & cột 'F'
Nếu trị tại ô E dòng x (nào đó) hơn trị trong cột F cùng dòng thì . . . .
Còn ngược lại thì . . . .
:D (B) Tiếp tục so sánh cho đến cuối cột chứa dữ liệu

???
 
Lần chỉnh sửa cuối:
Upvote 0
Mình thử dịch từ tiếng Việt của bạn sang tiếng Việt phổ thông xem đúng không nha:
:D (A) Mình cần so dánh các trị cùng dòng trong hai cột 'E' & cột 'F'
Nếu trị tại ô F dòng x (nào đó) hơn trị trong cột F cùng dòng thì . . . .
Còn ngược lại thì . . . .
Bản dịch sai. Cái này không bao giờ sảy ra. :D
 
Upvote 0
Đúng rồi, mình vô lý quá! (& đã sửa trên bài của mình)
Xin cảm ơn BatMan1 nhiều nha!
 
Upvote 0
Đúng rồi, mình vô lý quá! (& đã sửa trên bài của mình)
...
Nếu trị tại ô E dòng x (nào đó) hơn trị trong cột F cùng dòng thì . . . .
Vẫn sai. Hoặc "Nếu trị tại ô E dòng x (nào đó) hơn HOẶC BẰNG trị trong cột F cùng dòng thì . . . (Lỗ) Còn ngược lại thì . . . (Lãi)", hoặc "Nếu trị tại ô F dòng x (nào đó) HƠN trị trong cột E cùng dòng thì . . . (Lãi) Còn ngược lại thì . . . (Lỗ)"
 
Upvote 0
Mình đâu có dịch hoàn toàn nội dung đâu; Dịch theo ý thôi mà.


Chúc các bạn vui vẻ & có tuần làm việc thành công!
 
Upvote 0
Hàm Function Filter2DArray(ByVal SourceArray, ByVal ColIndex As Long, ByVal FindStr As String, ByVal HasTitle As Boolean) của thầy @ndu96081631.
Mình đang bị vướng chỗ khi Dữ liệu tìm kiếm không có trong vùng dữ liệu tìm kiếm thì nó báo lỗi.
Mình sử dụng câu lệnh dưới để bỏ lỗi nhưng không đươc.

Mã:
If Not IsArray(darr) Then MsgBox "Khong co du lieu"
Nhờ diễn đàn giúp đỡ
 
Upvote 0
Bạn cần biết mã lỗi là gì (Err & Error()) & dòng lệnh nào (Erl) bị lỗi
 
Upvote 0
Hàm Function Filter2DArray(ByVal SourceArray, ByVal ColIndex As Long, ByVal FindStr As String, ByVal HasTitle As Boolean) của thầy @ndu96081631.
Mình đang bị vướng chỗ khi Dữ liệu tìm kiếm không có trong vùng dữ liệu tìm kiếm thì nó báo lỗi.
Mình sử dụng câu lệnh dưới để bỏ lỗi nhưng không đươc.

Mã:
If Not IsArray(darr) Then MsgBox "Khong co du lieu"
Nhờ diễn đàn giúp đỡ
Bức tử sub là xong film
Mã:
If Not IsArray(darr) Then MsgBox "Khong co du lieu": Exit Sub
 
Upvote 0
em có code : If Sheets("Raw Customer Data").Range("f1" + i) = "yes" Then
Code này em muốn so sánh 2 ô 2 sheets khác nhau, nhưng báo lỗi!
Anh chị giải thích giúp em được không ạ!
 
Upvote 0
em có code : If Sheets("Raw Customer Data").Range("f1" + i) = "yes" Then
Code này em muốn so sánh 2 ô 2 sheets khác nhau, nhưng báo lỗi!
Anh chị giải thích giúp em được không ạ!
Muốn học code thì ít nhất phải biết lấy giấy bút ra ghi lại xem nó báo lỗi gì chứ.
Tôi có thể chỉ ra lỗi ngay tại chỗ. Nhưng làm như vậy là "cơm bón tận miệng". Tôi chỉ muốn giúp bạn cách nấu cơm thôi.
 
Lần chỉnh sửa cuối:
Upvote 0
Muốn học code thì ít nhất phải biết lấy giấy bút ra ghi lại xem nó báo lỗi gì chứ.
Tôi có thể chỉ ra lỗi ngay tại chỗ. Nhưng làm như vậy là "cơm bón tận miệng". Tôi chỉ muốn giúp bạn cách nấu cơm thôi.
ok bạn! nó báo lỗi " type mismatch" Mình nghĩ nó định dạng 2 ô khác nhau, tạm thời mình chưa fix được!
 
Upvote 0
ok bạn! nó báo lỗi " type mismatch" Mình nghĩ nó định dạng 2 ô khác nhau, tạm thời mình chưa fix được!
Tôi vốn không giao thiệp với tiếng Tây bồi.
Lỡ rồi, tôi chỉ làm một lần này thôi.
"Type mismatch" theo nghĩa rộng có nghĩa là trong code có một toán tử hay biểu thức nào đó đã đặt biến không đúng vào kiểu của nó.
Trong trường hợp trước mắt, code của bạn thì nó có toán tử "+" được thực hiện giữa hai vế "f1" và i. Và bị lỗi kiểu.
Tôi không thể biết i kiểu gì. Nhưng "f1" thì chắc chắn là kiểu chuỗi (string). Đối với VBA, toán tử nối chuỗi luôn luôn là "&" chứ không phải "+". Trong VBA, toán tử "+" chỉ dùng được cho kiểu số. VBA không có chuyện hàm chồng toán tử như C++ hay Java.

Túm lại, biểu thức Sheets("Raw Customer Data").Range("f1" + i) phải sửa lại là Sheets("Raw Customer Data").Range("f1" & i)
Với toán tử "&", VBA sẽ hiểu là code muốn nói chuỗi, và sẽ tự động ép kiểu i thành chuỗi để nối vào "f1".
Lưu ý là tôi chỉ mách cho bạn về lỗi "type mismatch". Code của bạn còn sai chỗ khác hay không thì tôi hoàn toàn không thể đoán.
 
Upvote 0
Tôi vốn không giao thiệp với tiếng Tây bồi.
Lỡ rồi, tôi chỉ làm một lần này thôi.
"Type mismatch" theo nghĩa rộng có nghĩa là trong code có một toán tử hay biểu thức nào đó đã đặt biến không đúng vào kiểu của nó.
Trong trường hợp trước mắt, code của bạn thì nó có toán tử "+" được thực hiện giữa hai vế "f1" và i. Và bị lỗi kiểu.
Tôi không thể biết i kiểu gì. Nhưng "f1" thì chắc chắn là kiểu chuỗi (string). Đối với VBA, toán tử nối chuỗi luôn luôn là "&" chứ không phải "+". Trong VBA, toán tử "+" chỉ dùng được cho kiểu số. VBA không có chuyện hàm chồng toán tử như C++ hay Java.

Túm lại, biểu thức Sheets("Raw Customer Data").Range("f1" + i) phải sửa lại là Sheets("Raw Customer Data").Range("f1" & i)
Với toán tử "&", VBA sẽ hiểu là code muốn nói chuỗi, và sẽ tự động ép kiểu i thành chuỗi để nối vào "f1".
Lưu ý là tôi chỉ mách cho bạn về lỗi "type mismatch". Code của bạn còn sai chỗ khác hay không thì tôi hoàn toàn không thể đoán.
Cảm ơn bạn!
 
Upvote 0
em làm một hàm như sau giống như hàm INDEX, MATCH nhưng khi gọi hàm code chạy mất 30 phút mới cho kq các bác có cách nào cải thiện tốc độ chạy khi gọi hàm
Public Function tenKH(Rng As Range, dk As Range) As Variant Dim sArr(), I As Long, Tem As String sArr = Rng.Value 'Tem = dk.Value For I = 1 To UBound(sArr) If sArr(I, 4) = dk.Value Then tenKH = sArr(I, 3) Exit For End If Next I End Function
sub để gọi hàm
Sub sms() Application.ScreenUpdating = False Dim lastrow_GL As Long, I As Long, lastrow_LN As Long Dim Rng As Range, table_LN As Range Dim Mang() Dim strTmp As String Dim rln As Long lastrow_GL = Sheet2.Cells(Sheets2.Rows.Count, "A").End(xlUp).Row lastrow_LN = Sheet1.Cells(Sheet1.Rows.Count, "d").End(xlUp).Row lastrow_GL1 = Sheet4.Cells(Sheet4.Rows.Count, "d").End(xlUp).Row For I = 2 To lastrow_GL Sheet3.Range("k" & I).Value = tachLAV(Sheet3.Range("X" & I)) Next Call tongphiHD Set table_LN = Sheet1.Range("d2:ag" & lastrow_LN) Dim Arr As Variant For rgl = 2 To lastrow_GL1 [B]Sheet4.Range("c" & rgl) = tenKH(Sheet1.Range("a2:ag" & lastrow_LN), Sheet4.Range("$d" & rgl)) [/B] Next Application.ScreenUpdating = True End Sub
 

File đính kèm

  • TESTINDEX.xlsm
    760.8 KB · Đọc: 6
Upvote 0
Chào cả nhà, em có dòng code này chọn file access rồi xuất sang excel mà ko biết sai ở đâu mà nó lúc chạy lúc ko. Cái này em dùng record macro rồi chỉnh sửa lại. Nhờ mọi người giúp đỡ ạ.


Sub TAIDULIEUTINHTOAN()
Dim Filt As String
Dim FilterIndex As Integer
Dim Title As String
Dim Filename As String
Filt = "Microsoft Access Database(*.mdb),*.mdb," & _
"All Files (*.*),*.*"
FilterIndex = 1
Title = "Load Data"
Filename = Application.GetOpenFilename(FileFilter:=Filt, FilterIndex:=FilterIndex, Title:=Title)
If Filename = "False" Then
MsgBox "NO FILE."
Exit Sub
End If

Sheets("Beam Forces").Activate
Sheets("Beam Forces").Columns("A:Z").Select
Selection.ClearContents
With ActiveSheet.ListObjects.Add(SourceType:=0, Source:=Array( _
"OLEDB;Provider=Microsoft.ACE.OLEDB.12.0;Password="""";User ID=Admin;Data Source=" & Filename & ";Mode=Share Deny Write" _
, _
";Extended Properties="""";Jet OLEDB:System database="""";Jet OLEDB:Registry Path="""";Jet OLEDB:Database Password="""";Jet OLEDB:Engine " _
, _
"Type=5;Jet OLEDB:Database Locking Mode=0;Jet OLEDB:Global Partial Bulk Ops=2;Jet OLEDB:Global Bulk Transactions=1;Jet OLEDB:New " _
, _
"Database Password="""";Jet OLEDB:Create System Database=False;Jet OLEDB:Encrypt Database=False;Jet OLEDB:Don't Copy Locale on Comp" _
, _
"act=False;Jet OLEDB:Compact Without Replica Repair=False;Jet OLEDB:SFP=False;Jet OLEDB:Support Complex Data=False" _
), Destination:=Range("$A$1")).QueryTable
.CommandType = xlCmdTable
.CommandText = Array("Beam Forces")
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.BackgroundQuery = True
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.PreserveColumnInfo = True
.SourceDataFile = Filename
.Refresh BackgroundQuery:=False
End With
End sub
 

File đính kèm

  • File.rar
    125.3 KB · Đọc: 3
Upvote 0
Web KT
Back
Top Bottom