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:
bạn hiểu ko : vì là dữ liệu mình hơn 4000 cột, bây giờ đâu xác định được cột nào là có dữ liệu dài nhất để mà chọn "A" Hay là "X" ???
À vậy thì xác định dòng lớn nhất trong đó.
Vậy bạn thử.
Mã:
Sub xacdinhsodong()
Dim a As Long
With Sheet1
a = .UsedRange.Rows.Count
MsgBox a
End With
End Sub
 
Upvote 0
À vậy thì xác định dòng lớn nhất trong đó.
Vậy bạn thử.
Mã:
Sub xacdinhsodong()
Dim a As Long
With Sheet1
a = .UsedRange.Rows.Count
MsgBox a
End With
End Sub
Cám ơn ! Code này có hiệu quả. Vậy liệu mình bỏ with đi
Gắn cho a = sheet1.usedrange.rows.count đc k nhỉ
 
Upvote 0
Cám ơn ! Code này có hiệu quả. Vậy liệu mình bỏ with đi
Gắn cho a = sheet1.usedrange.rows.count đc k nhỉ
Được nó vẫn như nhau mà.
Bài đã được tự động gộp:

Nếu không có dòng: i=i+1
thì số sheet sẽ bằng không thì sao anh ?
hay còn có cái gì khác, em chưa hiểu ý chổ này lắm !
Bạn có thể thay bằng thế này.
Mã:
Sub Vonglap_For8()
    Dim mysheet As Worksheet
    Dim i As Integer
    For Each mysheet In ActiveWorkbook.Worksheets
  
    MsgBox mysheet.Name
    MsgBox "So sheets trong Worksheet la: " & mysheet.Index
    Next mysheet
    
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Được nó vẫn như nhau mà.
Bài đã được tự động gộp:


Bạn có thể thay bằng thế này.
Mã:
Sub Vonglap_For8()
    Dim mysheet As Worksheet
    Dim i As Integer
    For Each mysheet In ActiveWorkbook.Worksheets
 
    MsgBox mysheet.Name
    MsgBox "So sheets trong Worksheet la: " & mysheet.Index
    Next mysheet
   
End Sub
Cách này cũng hay, nhưng nếu số sheet nhiều lên thì mau hư chuột lắm anh !:cray:
 
Upvote 0
Cách này cũng hay, nhưng nếu số sheet nhiều lên thì mau hư chuột lắm anh !:cray:
Bạn muốn xem có bao nhiêu sheets à.Mình tưởng hiện thị từng sheets.
Mã:
Sub Vonglap_For8()
    Dim mysheet As Worksheet
    Dim i As Integer
    For Each mysheet In ActiveWorkbook.Worksheets

    MsgBox mysheet.Name
   
    Next mysheet
   MsgBox "So sheets trong Worksheet la: " & Sheets.Count
End Sub
 
Upvote 0
Bạn muốn xem có bao nhiêu sheets à.Mình tưởng hiện thị từng sheets.
Mã:
Sub Vonglap_For8()
    Dim mysheet As Worksheet
    Dim i As Integer
    For Each mysheet In ActiveWorkbook.Worksheets

    MsgBox mysheet.Name
  
    Next mysheet
   MsgBox "So sheets trong Worksheet la: " & Sheets.Count
End Sub
Híc cái tưởng nhầm của anh mà hóa ra lại hay với em.
 
Upvote 0
Mình mới tập tành làm code VBA phục vụ công việc. Mình có thắc mắc muốn nhờ giải đáp giúp.
Mình có file dùng Vlookup để in nhiều phần khác nhau với 1 khuôn giống nhau. Và đã có dùng VBA để in số lượng lớn giấy với 1 thao tác.
Nhưng khi mình dùng hàm For To Next để in thì chỉ thực hiện được từ số nhỏ đến số lớn.
Vậy có cách nào để mình in với số lượng lớn từ lớn đến nhỏ được không?
 
Upvote 0
Mình mới tập tành làm code VBA phục vụ công việc. Mình có thắc mắc muốn nhờ giải đáp giúp.
Mình có file dùng Vlookup để in nhiều phần khác nhau với 1 khuôn giống nhau. Và đã có dùng VBA để in số lượng lớn giấy với 1 thao tác.
Nhưng khi mình dùng hàm For To Next để in thì chỉ thực hiện được từ số nhỏ đến số lớn.
Vậy có cách nào để mình in với số lượng lớn từ lớn đến nhỏ được không?
Được!
For I=lớn To nhỏ Step - mấy
 
Lần chỉnh sửa cuối:
Upvote 0
For số = nhỏ To lớn
thì vòng lặp đi từ số nhỏ sang lớn, từng bước một.

For số = lớn To nhỏ Step -1
thì vòng lặp đi từ lớn xuống nhỏ, từng bước một. Đừng quên cái chỗ Step -1
 
Upvote 0
Thay đoạn code If ... EndIf đầu sub thành đoạn sau, xem có được không
Mã:
If lngRow <= 3 Then
    lngRow = 4
Else
    Dim Rg As Range
    Set Rg = .Range("B4:B" & lngRow).Find(txtmakhncc.Text,lookin:=xlValues, LookAt:=xlWhole)
    If Not Rg  Is Nothing Then
        Msgbox "Da co trung " & txtmakhncc.Text
        Exit sub
    End If
    lngRow = lngRow + 1
End If

Em làm được rồi, Tks bác nhiều. Nhưng em muốn thêm điều kiện nữa như sau thì phải thêm như nào (phần điều kiện trên vẫn giữ song song với điều kiện dưới đây):
- Trong file excell ở cột C4:C (là dữ liệu ở Textboxt "txtphanbiet.Text" nhập vào mà có chữ "kh") thì sẽ kiểm tra điều kiện cột E4:E (cột này là cột của Textboxt "txtsodtkhncc.Text" được nhập vào mà dữ liệu đã có thì cũng báo trùng và ko cho nhập (lưu ý chỉ ktra khi cột C là chữ "kh")

Em có VD trong file attch kèm theo.

=> giờ em phải thêm code VBA điều kiện như nào ah ? Rất mong cả nhà giúp đỡ.
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Em làm được rồi, Tks bác nhiều. Nhưng em muốn thêm điều kiện nữa như sau thì phải thêm như nào (phần điều kiện trên vẫn giữ song song với điều kiện dưới đây):
- Trong file excell ở cột C4:C (là dữ liệu ở Textboxt "txtphanbiet.Text" nhập vào mà có chữ "kh") thì sẽ kiểm tra điều kiện cột E4:E (cột này là cột của Textboxt "txtsodtkhncc.Text" được nhập vào mà dữ liệu đã có thì cũng báo trùng và ko cho nhập (lưu ý chỉ ktra khi cột C là chữ "kh")

Em có VD trong file attch kèm theo.

=> giờ em phải thêm code VBA điều kiện như nào ah ? Rất mong cả nhà giúp đỡ.
Đưa file kiểu này thì sao test đúng sai, nên bạn thử làm đi rồi gửi lên đây hỏi tiếp nếu mắc
 
Upvote 0
Đưa file kiểu này thì sao test đúng sai, nên bạn thử làm đi rồi gửi lên đây hỏi tiếp nếu mắc
Vậy em muốn bỏ qua việc set "kh" giờ em chỉ set 2 mục
("B4:B" & lngRow).Find(txtmakhncc.Text, LookIn:=xlValues, LookAt:=xlWhole) và ("F4:F" & lngRow).Find(txtsodtkhncc.Text, LookIn:=xlValues, LookAt:=xlWhole) anh giup em doan Code VBA của nó sẽ phải viết như nào ah ?
 
Upvote 0
Vậy em muốn bỏ qua việc set "kh" giờ em chỉ set 2 mục
("B4:B" & lngRow).Find(txtmakhncc.Text, LookIn:=xlValues, LookAt:=xlWhole) và ("F4:F" & lngRow).Find(txtsodtkhncc.Text, LookIn:=xlValues, LookAt:=xlWhole) anh giup em doan Code VBA của nó sẽ phải viết như nào ah ?
Thì cũng vậy bạn phải tự thân vận động , sáng tạo lên, đừng cứ chờ ù ì sẽ bao giờ lên tay
Đây, thử thế này
Mã:
If lngRow <= 3 Then
    lngRow = 4
Else
    'Kiem tra trung Ma
    Dim Rg As Range
    Set Rg = .Range("B4:B" & lngRow).Find(txtmakhncc.Text,lookin:=xlValues, LookAt:=xlWhole)
    If Not Rg  Is Nothing Then
        Msgbox "Da co trung " & txtmakhncc.Text
        Exit sub
    End If
  
    'Kiem tra trung so dt
    Set Rg = Nothing
     Set Rg = .Range("F4:F" & lngRow).Find(txtsodtkhncc.Text,lookin:=xlValues, LookAt:=xlWhole)
    If Not Rg  Is Nothing Then
        Msgbox "Da co trung " & txtsodtkhncc.Text
        Exit sub
    End If
  
    lngRow = lngRow + 1
End If
 
Upvote 0
Cho em hỏi đoạn code này có gì sai?
PHP:
Public Sub CongToCompare()
    Dim Ws As Worksheet
    Dim Arr(), i As Long, j As Long, k As Long
    Dim SoSheet As Byte
  
    SoSheet = Application.Sheets.Count
  
    ReDim Result(1 To SoSheet * 50000, 1 To 10)
    With Workbooks("(E) Daily Attendance(Upload)(V)(H4006M1_VN).xls")
        For Each Ws In .Worksheets
            Arr = Ws.Range("A5", Ws.Range("A50000").End(xlUp)).Resize(, 10).Value2
            For i = 1 To UBound(Arr, 1)
                If Len(Arr(i, 2)) = 5 Then
                    k = k + 1
                    For j = 1 To 10
                        Result(k, j) = Arr(i, j)
                    Next j
                End If
            Next i
        Next Ws
    End With

    With Workbooks("Balance MrT and ERP.xlsb")
        .Sheets("Data").Range("C5").Resize(k, 10) = Result
    End With
  
End Sub

Đoạn code này nằm trong file Balance MrT and ERP.xlsb và là file đang làm việc. Khi em chạy code thì dữ liệu lấy từ file (E) Daily Attendance(Upload)(V)(H4006M1_VN).xls sang bị thiếu là sao nhỉ? Không biết cái For each của em có vấn đề gì không mà lại vậy
 
Upvote 0
Cho em hỏi đoạn code này có gì sai?
PHP:
Public Sub CongToCompare()
    Dim Ws As Worksheet
    Dim Arr(), i As Long, j As Long, k As Long
    Dim SoSheet As Byte

    SoSheet = Application.Sheets.Count

    ReDim Result(1 To SoSheet * 50000, 1 To 10)
    With Workbooks("(E) Daily Attendance(Upload)(V)(H4006M1_VN).xls")
        For Each Ws In .Worksheets
            Arr = Ws.Range("A5", Ws.Range("A50000").End(xlUp)).Resize(, 10).Value2
            For i = 1 To UBound(Arr, 1)
                If Len(Arr(i, 2)) = 5 Then
                    k = k + 1
                    For j = 1 To 10
                        Result(k, j) = Arr(i, j)
                    Next j
                End If
            Next i
        Next Ws
    End With

    With Workbooks("Balance MrT and ERP.xlsb")
        .Sheets("Data").Range("C5").Resize(k, 10) = Result
    End With

End Sub

Đoạn code này nằm trong file Balance MrT and ERP.xlsb và là file đang làm việc. Khi em chạy code thì dữ liệu lấy từ file (E) Daily Attendance(Upload)(V)(H4006M1_VN).xls sang bị thiếu là sao nhỉ? Không biết cái For each của em có vấn đề gì không mà lại vậy
Bạn kiểm tra: file (E) Daily Attendance(Upload)(V)(H4006M1_VN).xls có đang mở không?
Nếu không mở thì không chạy được nhé!
Bổ sung: Trường hợp này có thể dùng ADO để lấy dữ liệu từ file đang đóng, như vậy sẽ nhanh hơn.
 
Lần chỉnh sửa cuối:
Upvote 0
Bạn kiểm tra: file (E) Daily Attendance(Upload)(V)(H4006M1_VN).xls có đang mở không?
Nếu không mở thì không chạy được nhé!
Bổ sung: Trường hợp này có thể dùng ADO để lấy dữ liệu từ file đang đóng, như vậy sẽ nhanh hơn.

File của mình vẫn mở, dữ liệu lấy được chỉ là nó không lấy đủ.

Mình có sưu tập được đoạn code này nhưng áp dụng file mình thì nó không chạy, không hiểu sao luôn.
File của mình có nhiều sheet nhưng dữ liệu form là như nhau, tại ô A1 luôn là tiêu đề.

Dữ liệu bắt đầu có từ dòng 5 cột A đến cột J. (Vài vạn dòng)
Nó báo lỗi tại dòng: rst.Open SQL, cnn, 3, 3, 1 là Run-time error '450' Wrong number of arguments or invalid property assignment
PHP:
Sub NMH()
    Dim cnn As Object, rst As Object
    Dim SQL$, Ws As Worksheet
        Set cnn = CreateObject("ADODB.Connection")
        Set rst = CreateObject("ADODB.Connection")
        With cnn
            .ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
                                "Data source=" & ThisWorkbook.FullName & _
                                ";Extended properties=""Excel 12.0;IMEX=1;HDR=Yes"";"
            .Open
        End With
        For Each Ws In Worksheets
            If Ws.CodeName <> "Result" Then SQL = SQL & " " & "[" & Ws.Name & "$A5:J]"
        Next
        SQL = "SELECT * FROM " & Replace(Trim(SQL), " ", " UNION ALL SELECT * FROM ")
        rst.Open SQL, cnn, 3, 3, 1
        [A2].CopyFromRecordset rst
        rst.Close: Set rst = Nothing
        cnn.Close: Set cnn = Nothing
End Sub
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Cốt ấy hốt ở đâu ra vậy?
Đem qua hộp CSDL hỏi. Và réo tên cái "chị" xinh xinh với cái tên phản cảm "ổ tơ ổ rệp" gì đó.
 
Upvote 0
Cho em hỏi đoạn code này có gì sai?
PHP:
Public Sub CongToCompare()
    Dim Ws As Worksheet
    Dim Arr(), i As Long, j As Long, k As Long
    Dim SoSheet As Byte
 
    SoSheet = Application.Sheets.Count
 
    ReDim Result(1 To SoSheet * 50000, 1 To 10)
    With Workbooks("(E) Daily Attendance(Upload)(V)(H4006M1_VN).xls")
        For Each Ws In .Worksheets
            Arr = Ws.Range("A5", Ws.Range("A50000").End(xlUp)).Resize(, 10).Value2
            For i = 1 To UBound(Arr, 1)
                If Len(Arr(i, 2)) = 5 Then
                    k = k + 1
                    For j = 1 To 10
                        Result(k, j) = Arr(i, j)
                    Next j
                End If
            Next i
        Next Ws
    End With

    With Workbooks("Balance MrT and ERP.xlsb")
        .Sheets("Data").Range("C5").Resize(k, 10) = Result
    End With
 
End Sub

Đoạn code này nằm trong file Balance MrT and ERP.xlsb và là file đang làm việc. Khi em chạy code thì dữ liệu lấy từ file (E) Daily Attendance(Upload)(V)(H4006M1_VN).xls sang bị thiếu là sao nhỉ? Không biết cái For each của em có vấn đề gì không mà lại vậy
Theo mình thì bạn thử tăng cái này lên.vì nếu dữ liệu vượt quá 50000 dòng thì là lỗi.
Arr = Ws.Range("A5", Ws.Range("A50000").End(xlUp)).Resize(, 10).Value2
 
Upvote 0
Theo mình thì bạn thử tăng cái này lên.vì nếu dữ liệu vượt quá 50000 dòng thì là lỗi.
Arr = Ws.Range("A5", Ws.Range("A50000").End(xlUp)).Resize(, 10).Value2

Bạn ơi không báo lỗi mà chỉ là dữ liệu mình không đủ thôi. Ngoài ra đây là vùng dữ liệu mình cần lấy cho nên tăng cái này thêm bao nhiêu thì kết quả vẫn vậy
 
Upvote 0
Web KT

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

Back
Top Bottom