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.
Em chỉ mới tìm hiểu VBA nên nhờ mọi người giúp đỡ.
Bài toán như sau: Em nhập 1 số tại A1 của sheet1
+Nếu A1>10 =>Thông báo a lớn hơn 10
+Nếu A1=10 =>Thông báo a bằng 10
+Nếu A1<10 =>Thông báo a nhỏ hơn 10
+Nếu A1 là chữ =>Thông báo a là dạng Text
Em xin cám ơn
 

File đính kèm

  • LenhIf.xlsm
    17.7 KB · Đọc: 2
Upvote 0
Chào mọi người.
Em chỉ mới tìm hiểu VBA nên nhờ mọi người giúp đỡ.
Bài toán như sau: Em nhập 1 số tại A1 của sheet1
+Nếu A1>10 =>Thông báo a lớn hơn 10
+Nếu A1=10 =>Thông báo a bằng 10
+Nếu A1<10 =>Thông báo a nhỏ hơn 10
+Nếu A1 là chữ =>Thông báo a là dạng Text
Em xin cám ơn
Bạn thử:
PHP:
Sub LenhIf()
    a = Sheet1.Range("A1")
    If IsNumeric(a) = False Then MsgBox "a la dang Text"
    If IsNumeric(a) = True Then
        If a > 10 Then
            MsgBox "a lon hon 10"
        ElseIf a = 10 Then
            MsgBox "a bang 10"
        Else
            MsgBox "a nho hon 10"
        End If
    End If
End Sub
 
Upvote 0
Bạn thử:
PHP:
Sub LenhIf()
    a = Sheet1.Range("A1")
    If IsNumeric(a) = False Then MsgBox "a la dang Text"
    If IsNumeric(a) = True Then
        If a > 10 Then
            MsgBox "a lon hon 10"
        ElseIf a = 10 Then
            MsgBox "a bang 10"
        Else
            MsgBox "a nho hon 10"
        End If
    End If
End Sub
Cám ơn anh nhiều !
 
Upvote 0
Em có việc khó không biết làm sao nhờ cả nhà giúp.
Em có 1 Form nhập dữ liệu vào 1 sheet A. giờ em gặp khó là làm sao khi nhập vào form mà trùng tên (VD: text tên trùng với cột B trong Sheet A là tên) thì khi click vào lưu thì báo đã có tên trùng với tên đó và không cho lưu dữ liệu trùng đó nữa. Tks cả nhà.
 
Upvote 0
Các Anh/chị, Chú Bác cho e hỏi bên diễn đàn mình có chỗ nào bán cuốn sách lập trình về VBA không ạ. Xuất bản mới mới :)
Cám ơn
 
Upvote 0
Em có việc khó không biết làm sao nhờ cả nhà giúp.
Em có 1 Form nhập dữ liệu vào 1 sheet A. giờ em gặp khó là làm sao khi nhập vào form mà trùng tên (VD: text tên trùng với cột B trong Sheet A là tên) thì khi click vào lưu thì báo đã có tên trùng với tên đó và không cho lưu dữ liệu trùng đó nữa. Tks cả nhà.
Dùng cách dò tìm, trong VBA thì Range.Find.... tức là dùng method Find của Range
 
Upvote 0
Chào mọi người, mọi người giúp e code VBA với điều kiện
nếu trong vùng dữ liệu có 1 ô nào có gtri bằng 0 thì xóa luôn dòng đó với ạ.
e cám ơn nhiều.
 

File đính kèm

  • LIST SPHIE.xlsx
    10.8 KB · Đọc: 11
Upvote 0
Chào mọi người, mọi người giúp e code VBA với điều kiện
nếu trong vùng dữ liệu có 1 ô nào có gtri bằng 0 thì xóa luôn dòng đó với ạ.
e cám ơn nhiều.
Bạn xem thử
PHP:
Sub Xoadong()
    Dim sArr, I As Long, J As Long, Er As Long
    Dim rng As Range, Dk As Boolean: Dk = False
Er = Range("A" & Rows.Count).End(xlUp).Row
If Er > 1 Then
    sArr = Range("A1:A" & Er).Resize(, 6).Value
    For I = 2 To UBound(sArr)
        For J = 1 To UBound(sArr, 2)
            If sArr(I, J) = Empty Then
                Dk = True
                If rng Is Nothing Then
                    Set rng = Range("A" & I).EntireRow
                Else
                    Set rng = Union(rng, Range("A" & I).EntireRow)
                End If
                Exit For
            End If
        Next J
    Next
    If Dk = True Then
        rng.Select
        'rng.Delete
    Else
        MsgBox "Nothing"
    End If
End If
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Bạn xem thử
Mã:
Sub Xoadong()
    Dim sArr, I As Long, J As Long, Er As Long
    Dim rng As Range
Er = Range("A" & Rows.Count).End(xlUp).Row
If Er > 1 Then
    sArr = Range("A1:A" & Er).Resize(, 6).Value
    For I = 2 To UBound(sArr)
        For J = 1 To UBound(sArr, 2)
            If sArr(I, J) = Empty Then
                If rng Is Nothing Then
                    Set rng = Range("A" & I).EntireRow
                Else
                    Set rng = Union(rng, Range("A" & I).EntireRow)
                End If
                Exit For
            End If
        Next J
    Next
    rng.Select
    'rng.Delete
End If
End Sub
cám ơn nhiều ạ
cho hỏi thêm là nếu vùng dữ liệu mở rộng ra thì code này có thực hiện được không ạ.
với mấy cái code union này kia mình tìm hiểu tài liệu ở đâu được.
 
Upvote 0
cám ơn nhiều ạ
cho hỏi thêm là nếu vùng dữ liệu mở rộng ra thì code này có thực hiện được không ạ.
với mấy cái code union này kia mình tìm hiểu tài liệu ở đâu được.
Tôi vẫn khoái chơi với mảng.
Trong file bạn thì dữ liệu có 6 cột, nếu dữ liệu <>6 cột thì khai báo lại biến CoL
Đặt tên sheet là "GPE".
PHP:
Public Sub sGpe()
Const CoL As Long = 6                 'Số cột là 6 trong bảng dữ liệu.'
Dim sArr(), dArr(), I As Long, J As Long, K As Long, R As Long
With Sheets("GPE")
    sArr = .Range("A2", .Range("A2").End(xlDown)).Resize(, CoL).Value
    R = UBound(sArr)
    ReDim dArr(1 To R, 1 To CoL)
    For I = 1 To R
        K = K + 1
        For J = 1 To CoL
            dArr(K, J) = sArr(I, J)
            If sArr(I, J) = 0 Then
                K = K - 1
                Exit For
            End If
        Next J
    Next I
    Range("A2").Resize(R, CoL).ClearContents
    If K Then .Range("A2").Resize(K, CoL) = dArr
End With
End Sub
 
Upvote 0
Upvote 0
Tôi vẫn khoái chơi với mảng.
Trong file bạn thì dữ liệu có 6 cột, nếu dữ liệu <>6 cột thì khai báo lại biến CoL
Đặt tên sheet là "GPE".
PHP:
Public Sub sGpe()
Const CoL As Long = 6                 'Số cột là 6 trong bảng dữ liệu.'
Dim sArr(), dArr(), I As Long, J As Long, K As Long, R As Long
With Sheets("GPE")
    sArr = .Range("A2", .Range("A2").End(xlDown)).Resize(, CoL).Value
    R = UBound(sArr)
    ReDim dArr(1 To R, 1 To CoL)
    For I = 1 To R
        K = K + 1
        For J = 1 To CoL
            dArr(K, J) = sArr(I, J)
            If sArr(I, J) = 0 Then
                K = K - 1
                Exit For
            End If
        Next J
    Next I
    Range("A2").Resize(R, CoL).ClearContents
    If K Then .Range("A2").Resize(K, CoL) = dArr
End With
End Sub
Kiến thức về mảng thấy phức tạp qá
 
Upvote 0
Theo mình nghĩ mảng nó chỉ là.Không thao tác trên excel mà ghi dữ liệu vào mảng.
Bthg thì mình xài vòng lặp for cho từng cột.
Nếu bắp gặp ô nào bằng 0 thì xóa luôn dòng đó.
Chỉ có thắc mắc ở chỗ là nếu sử dụng mảng thì liệu Excel nó có chạy nhanh hơn k
 
Upvote 0
Chỉ có thắc mắc ở chỗ là nếu sử dụng mảng thì liệu Excel nó có chạy nhanh hơn k
Bạn thử tăng dữ liệu lên vạn dòng & 24 cột & sau đó thử với macro xài mảng dưới đây xem sao:
PHP:
Sub Array_()
Dim Arr()
Dim J As Long, W As Long, Tmr As Double, Cot As Integer, Zero As Boolean

Tmr = Timer():                         Arr() = Sheet2.[B1].CurrentRegion.Offset(1).Value
ReDim dArr(1 To UBound(Arr()), 1 To UBound(Arr(), 2))
For J = 1 To UBound(Arr())
    W = W + 1
    For Cot = 1 To UBound(Arr(), 2)
        If Arr(J, Cot) = 0 Then
            Zero = True:                        W = W - 1
            Exit For
        Else
            dArr(W, Cot) = Arr(J, Cot)
        End If
    Next Cot
Next J
MsgBox J & " => " & W, , Timer() - Tmr
End Sub

Máy cà tèng của mình báo là mất .125" & từ 10242 dòng xuống còn 8640
 
Lần chỉnh sửa cuối:
Upvote 0
Còn đây là macro để cho thấy sự tăng giảm thời lượng xài 1 hay 2 mảng (Array) với dữ liệu đủ lớn như bài trên:
PHP:
Sub DuyetCotA_CountIf(Num As Integer)
 Dim Rws As Long, J As Long, W As Long, Tmr As Double, Col As Integer, Cot As Integer
 Dim WF As Object

  Tmr = Timer():                            Rws = Sheet1.[B1].CurrentRegion.Rows.Count
  Col = Sheet1.[B1].CurrentRegion.Columns.Count
  Set WF = Application.WorksheetFunction
  ReDim Arr(1 To Rws, 1 To Col)
  For J = 2 To Rws
    If WF.CountIf(Cells(J, "A").Resize(, Col), 0) = 0 Then
        W = W + 1
        If Num = 2 Then
            ReDim dArr(1 To 1, 1 To Col)
            dArr() = Cells(J, 1).Resize(, Col).Value
        End If
        For Cot = 1 To Col
            If Num = 2 Then
                Arr(W, Cot) = dArr(1, Cot)
            ElseIf Num = 1 Then
                Arr(W, Cot) = Cells(J, 1).Offset(, Col - 1).Value
            End If
        Next Cot
    End If
  Next J
  MsgBox J & " => " & W, , Timer() - Tmr
End Sub
 
Upvote 0
Bạn thử tăng dữ liệu lên vạn dòng & 24 cột & sau đó thử với macro xài mảng dưới đây xem sao:
PHP:
Sub Array_()
Dim Arr()
Dim J As Long, W As Long, Tmr As Double, Cot As Integer, Zero As Boolean

Tmr = Timer():                         Arr() = Sheet2.[B1].CurrentRegion.Offset(1).Value
ReDim dArr(1 To UBound(Arr()), 1 To UBound(Arr(), 2))
For J = 1 To UBound(Arr())
    W = W + 1
    For Cot = 1 To UBound(Arr(), 2)
        If Arr(J, Cot) = 0 Then
            Zero = True:                        W = W - 1
            Exit For
        Else
            dArr(W, Cot) = Arr(J, Cot)
        End If
    Next Cot
Next J
MsgBox J & " => " & W, , Timer() - Tmr
End Sub

Máy cà tèng của mình báo là mất .125" & từ 10242 dòng xuống còn 8640
Dữ liệu của mình trung bình 1 file csv 30Mb
Khoảng 4000 cột, gần 1tr dòng.
Chạy cái máy đơ lun :(
 
Upvote 0
Cho e hỏi trong nhiều sub, phía đầu tiêu đề người ta viết như sau
Mã:
Sub DuyetCotA_CountIf(Num As Integer)
những sub này không chạy trực tiếp được.
vậy những sub này là sao ạ. AC giải thích giùm với.
 
Upvote 0
Dữ liệu của mình trung bình 1 file csv 30Mb
Khoảng 4000 cột, gần 1tr dòng.
Máy mình với bộ nhớ hạn hẹp chỉ chạy macro #1664 với 25500 dòng & 255 cột mất >4.656" (file xls 112Mb)
Những sub này không chạy trực tiếp được.
vậy những sub này là sao ạ. AC giải thích giùm với.
Muốn chạy nó cần cung cấp cho nó tham biến {1 hay 2} Nhưng với dữ liệu đồ sộ của bạn thì quên nó đi!
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT
Back
Top Bottom