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:
Em xin chào các bác ạ,
Em đang tập tành học VBA và hiện tại đang gặp khó về vấn đề này ạ.
Cụ thể là em có 1 file với số tiền phải chi cho người lao động thuộc các cụm, dữ liệu mỗi cụm cách nhau bởi 1 dòng trống.
Em muốn viết 1 code tự tìm dòng cuối của 1 cụm sau đó, xóa dữ liệu thừa ở dòng "cuối +1" và lấy tổng số tiền (cột G) của cụm đó vào ô trống của dòng "cuối +1". Sau đó tiếp tục tìm đến dòng cuối của cụm thứ 2 và xóa dữ liệu thừa ở dòng "cuối +1" và lấy tổng số tiền (cột G) chỉ của cụm thứ 2 vào ô trống của dòng "cuối +1". Cứ thế lặp lại cho đến khi hết dữ liệu.
Hiện tại em chỉ viết được code cho 1 cụm và ko biết viết vòng lặp như thế nào ạ.
Mã:
Sub TinhTong()

    Sheet1.Activate
    Dim Lr As Long
    Dim i As Long

    ' Lay dong cuoi
    Lr = Sheet1.Range("G1").End(xlDown).Row
    i = Lr + 1
    
    ' To dam o dong cuoi +1
    Rows(i).Select
    Selection.ClearContents
    Selection.Font.Bold = True
    
    ' Tinh tong o dong cuoi +1
    Dim Rng As Range
    Dim c As Range
    Set Rng = Range("G1:G" & Lr)
    Set c = Range("G1").End(xlDown).Offset(1, 0)
    c.Formula = "=SUM(" & Rng.Address(False, False) & ")"
    
End Sub
Kính mong các bác xem giúp em file ạ.
Em xin chân thành cám ơn các bác ạ.
 

File đính kèm

  • Tổng từng đoạn.xlsm
    21.3 KB · Đọc: 5
Upvote 0
Em xin chào các bác ạ,
Em đang tập tành học VBA và hiện tại đang gặp khó về vấn đề này ạ.
Cụ thể là em có 1 file với số tiền phải chi cho người lao động thuộc các cụm, dữ liệu mỗi cụm cách nhau bởi 1 dòng trống.
Em muốn viết 1 code tự tìm dòng cuối của 1 cụm sau đó, xóa dữ liệu thừa ở dòng "cuối +1" và lấy tổng số tiền (cột G) của cụm đó vào ô trống của dòng "cuối +1". Sau đó tiếp tục tìm đến dòng cuối của cụm thứ 2 và xóa dữ liệu thừa ở dòng "cuối +1" và lấy tổng số tiền (cột G) chỉ của cụm thứ 2 vào ô trống của dòng "cuối +1". Cứ thế lặp lại cho đến khi hết dữ liệu.
Hiện tại em chỉ viết được code cho 1 cụm và ko biết viết vòng lặp như thế nào ạ.
Mã:
Sub TinhTong()

    Sheet1.Activate
    Dim Lr As Long
    Dim i As Long

    ' Lay dong cuoi
    Lr = Sheet1.Range("G1").End(xlDown).Row
    i = Lr + 1
   
    ' To dam o dong cuoi +1
    Rows(i).Select
    Selection.ClearContents
    Selection.Font.Bold = True
   
    ' Tinh tong o dong cuoi +1
    Dim Rng As Range
    Dim c As Range
    Set Rng = Range("G1:G" & Lr)
    Set c = Range("G1").End(xlDown).Offset(1, 0)
    c.Formula = "=SUM(" & Rng.Address(False, False) & ")"
   
End Sub
Kính mong các bác xem giúp em file ạ.
Em xin chân thành cám ơn các bác ạ.
Không biết đúng ý bạn không nhưng thử test code xem.
Mã:
Sub GPE()
Dim rLast As Long, Rng As Range, sCell As Range
    With Sheet1
        rLast = .Range("G1000000").End(xlUp).Row
        Set Rng = .Range("G1:G" & rLast).SpecialCells(xlCellTypeConstants, 1)
        For Each sCell In Rng.Areas
            sCell.Cells(1, 1).Offset(sCell.Rows.Count).Formula = "=SUM(" & sCell.Address(0, 0) & ")"
        Next sCell
    End With
End Sub
 
Upvote 0
Không biết đúng ý bạn không nhưng thử test code xem.
Mã:
Sub GPE()
Dim rLast As Long, Rng As Range, sCell As Range
    With Sheet1
        rLast = .Range("G1000000").End(xlUp).Row
        Set Rng = .Range("G1:G" & rLast).SpecialCells(xlCellTypeConstants, 1)
        For Each sCell In Rng.Areas
            sCell.Cells(1, 1).Offset(sCell.Rows.Count).Formula = "=SUM(" & sCell.Address(0, 0) & ")"
        Next sCell
    End With
End Sub
Quá tuyệt vời bác ạ.
Em xin cảm ơn bác nhiều ạ.
Và em xin mạo muội nhờ bác thêm 1 chút nữa được ko ạ.
Bác có thể thêm vào tác vụ xóa hết dữ liệu của cả dòng mà có chứa ô có hàm tổng, chỉ để lại ô có hàm tổng và đồng thời tô đậm ô đó được ko ạ.
Em xin cảm ơn bác 1 lần nữa ạ.
 
Upvote 0
Quá tuyệt vời bác ạ.
Em xin cảm ơn bác nhiều ạ.
Và em xin mạo muội nhờ bác thêm 1 chút nữa được ko ạ.
Bác có thể thêm vào tác vụ xóa hết dữ liệu của cả dòng mà có chứa ô có hàm tổng, chỉ để lại ô có hàm tổng và đồng thời tô đậm ô đó được ko ạ.
Em xin cảm ơn bác 1 lần nữa ạ.
Sửa code lại chút.
Mã:
Sub GPE()
Dim rLast As Long, Rng As Range, sCell As Range, iRow As Long
    With Sheet1
        rLast = .Range("G1000000").End(xlUp).Row
        .Range("G1:G" & rLast).Font.Bold = False
        Set Rng = .Range("G1:G" & rLast).SpecialCells(xlCellTypeConstants, 1)
        For Each sCell In Rng.Areas
            iRow = sCell.Cells(1, 1).Offset(sCell.Rows.Count).Row
            .Rows(iRow).ClearContents
            .Range("G" & iRow).Formula = "=SUM(" & sCell.Address(0, 0) & ")"
            .Range("G" & iRow).Font.Bold = True
        Next sCell
    End With
End Sub
 
Upvote 0
Em xin chào các bác ạ,
Em đang tập tành học VBA và hiện tại đang gặp khó về vấn đề này ạ.
Cụ thể là em có 1 file với số tiền phải chi cho người lao động thuộc các cụm, dữ liệu mỗi cụm cách nhau bởi 1 dòng trống.
Em muốn viết 1 code tự tìm dòng cuối của 1 cụm sau đó, xóa dữ liệu thừa ở dòng "cuối +1" và lấy tổng số tiền (cột G) của cụm đó vào ô trống của dòng "cuối +1". Sau đó tiếp tục tìm đến dòng cuối của cụm thứ 2 và xóa dữ liệu thừa ở dòng "cuối +1" và lấy tổng số tiền (cột G) chỉ của cụm thứ 2 vào ô trống của dòng "cuối +1". Cứ thế lặp lại cho đến khi hết dữ liệu.
Hiện tại em chỉ viết được code cho 1 cụm và ko biết viết vòng lặp như thế nào ạ.
Mã:
Sub TinhTong()

    Sheet1.Activate
    Dim Lr As Long
    Dim i As Long

    ' Lay dong cuoi
    Lr = Sheet1.Range("G1").End(xlDown).Row
    i = Lr + 1
   
    ' To dam o dong cuoi +1
    Rows(i).Select
    Selection.ClearContents
    Selection.Font.Bold = True
   
    ' Tinh tong o dong cuoi +1
    Dim Rng As Range
    Dim c As Range
    Set Rng = Range("G1:G" & Lr)
    Set c = Range("G1").End(xlDown).Offset(1, 0)
    c.Formula = "=SUM(" & Rng.Address(False, False) & ")"
   
End Sub
Kính mong các bác xem giúp em file ạ.
Em xin chân thành cám ơn các bác ạ.
Thêm một cách viết đơn giản.
PHP:
Sub TinhTong2()
Dim Lr As Long, i As Long, k As Long
With Sheet1
    Lr = .Range("G1000").End(xlUp).Row + 1  ' Lay dong trong cuoi'
    For i = 1 To Lr                         'Xet cot G tu dong 1 den dong cuoi'
        k = k + 1                           'Dem so dong'
        If .Range("G" & i).Value = Empty Then           'Neu gap o trong cot G = trong'
            .Range("A" & i).Resize(, 10).ClearContents  'Xoa du lieu tu cot A den cot J'
            .Range("G" & i).Font.Bold = True            'To dam chi mot o cot G'
            .Range("G" & i).Value = "=SUM(R[-" & k - 1 & "]C:R[-1]C)"   'Cong thuc Tong'
            k = 0   'So dem =0, bat dau dem lai'
        End If
    Next i
End With
End Sub
 
Upvote 0
Sửa code lại chút.
Mã:
Sub GPE()
Dim rLast As Long, Rng As Range, sCell As Range, iRow As Long
    With Sheet1
        rLast = .Range("G1000000").End(xlUp).Row
        .Range("G1:G" & rLast).Font.Bold = False
        Set Rng = .Range("G1:G" & rLast).SpecialCells(xlCellTypeConstants, 1)
        For Each sCell In Rng.Areas
            iRow = sCell.Cells(1, 1).Offset(sCell.Rows.Count).Row
            .Rows(iRow).ClearContents
            .Range("G" & iRow).Formula = "=SUM(" & sCell.Address(0, 0) & ")"
            .Range("G" & iRow).Font.Bold = True
        Next sCell
    End With
End Sub
Thêm một cách viết đơn giản.
PHP:
Sub TinhTong2()
Dim Lr As Long, i As Long, k As Long
With Sheet1
    Lr = .Range("G1000").End(xlUp).Row + 1  ' Lay dong trong cuoi'
    For i = 1 To Lr                         'Xet cot G tu dong 1 den dong cuoi'
        k = k + 1                           'Dem so dong'
        If .Range("G" & i).Value = Empty Then           'Neu gap o trong cot G = trong'
            .Range("A" & i).Resize(, 10).ClearContents  'Xoa du lieu tu cot A den cot J'
            .Range("G" & i).Font.Bold = True            'To dam chi mot o cot G'
            .Range("G" & i).Value = "=SUM(R[-" & k - 1 & "]C:R[-1]C)"   'Cong thuc Tong'
            k = 0   'So dem =0, bat dau dem lai'
        End If
    Next i
End With
End Sub
Cám ơn 2 bác nhiều ạ. Code quá tuyệt.
 
Upvote 0
Em có đoạn code ntn.. và e muốn khi chạy đoạn mã này nó sẽ hiện ra 1 ô thông báo để mình chọn số đơn vị muốn làm tròn vd: 3;0;-3. Vì trong code này nó mặc định bằng 0 nên nhiều lúc phải chỉnh tay khá mất công.. e xin cảm ơn ạ.

Mã:
Public Sub ChenRound()
Dim Vung, Cll, Tam
Set Vung = Application.InputBox("Nhap vung muon chen ham ROUND", , , , , , , 8)
For Each Cll In Vung
Tam = Replace(Cll.Formula, "=", "")
Cll.Formula = "=ROUND(" & Tam & ",0)"
Next Cll
End Sub
 
Upvote 0
Em có đoạn code ntn.. và e muốn khi chạy đoạn mã này nó sẽ hiện ra 1 ô thông báo để mình chọn số đơn vị muốn làm tròn vd: 3;0;-3. Vì trong code này nó mặc định bằng 0 nên nhiều lúc phải chỉnh tay khá mất công.. e xin cảm ơn ạ.

Mã:
Public Sub ChenRound()
Dim Vung, Cll, Tam
Set Vung = Application.InputBox("Nhap vung muon chen ham ROUND", , , , , , , 8)
For Each Cll In Vung
Tam = Replace(Cll.Formula, "=", "")
Cll.Formula = "=ROUND(" & Tam & ",0)"
Next Cll
End Sub
Sửa thế này.
Mã:
Public Sub ChenRound()
    Dim Vung, Cll, Tam
    Dim iNum As Integer
   
    Set Vung = Application.InputBox("Nhap vung muon chen ham ROUND", , , , , , , 8)
    iNum = Application.InputBox("Nh" & ChrW(7853) & "p s" & ChrW(7889) & " làm tròn.", _
            "B" & ChrW(7841) & "n ph" & ChrW(7843) & "i nh" & ChrW(7853) & "p s" & ChrW(7889) & " nguyên.", , , , , , 1)
    For Each Cll In Vung
        Tam = Replace(Cll.Formula, "=", "")
        Cll.Formula = "=ROUND(" & Tam & "," & iNum & ")"
    Next Cll
End Sub
 
Upvote 0
Sửa thế này.
Mã:
Public Sub ChenRound()
    Dim Vung, Cll, Tam
    Dim iNum As Integer
  
    Set Vung = Application.InputBox("Nhap vung muon chen ham ROUND", , , , , , , 8)
    iNum = Application.InputBox("Nh" & ChrW(7853) & "p s" & ChrW(7889) & " làm tròn.", _
            "B" & ChrW(7841) & "n ph" & ChrW(7843) & "i nh" & ChrW(7853) & "p s" & ChrW(7889) & " nguyên.", , , , , , 1)
    For Each Cll In Vung
        Tam = Replace(Cll.Formula, "=", "")
        Cll.Formula = "=ROUND(" & Tam & "," & iNum & ")"
    Next Cll
End Sub
Dạ e cảm ơn a nhiều ạ.. trước e thay bằng i chứ k phải inum nên chạy chả được.. k rành VBA nó chán thế đấy @@
 
Upvote 0
Mọi người cho mình hỏi, ngoài cách dùng vòng lặp for, có cách nào để insert công thức cho nhiều ô trong không ạ?
ví dụ như vòng for như này. Thanks all
Dim i As Integer
For i = 1 To 50
Range("a" & i) = Range("b" & i) + Range("c" & i)
Next
 
Upvote 0
Mọi người cho mình hỏi, ngoài cách dùng vòng lặp for, có cách nào để insert công thức cho nhiều ô trong không ạ?
ví dụ như vòng for như này. Cảm ơn all
Dim i As Integer
For i = 1 To 50
Range("a" & i) = Range("b" & i) + Range("c" & i)
Next
Bạn tham khảo đoạn code dưới
Mã:
Sheet1.Range("A1:A50") = "=RC[1]+RC[2]"
 
Upvote 0
Bạn tham khảo đoạn code dưới
Mã:
Sheet1.Range("A1:A50") = "=RC[1]+RC[2]"
Thanks bác, em biết thêm 1 phương thức mới. cho em hỏi thêm là em muốn cell ở cột A chỉ insert lệnh khi cell cột B và C có giá trị thì phải làm như nào ạ, khi cell cột B hoặc C "" thì cell cột A cũng trống tương ứng.
 
Upvote 0
Bạn thử vầy:
Sub TinhTongKhongTrong()
Sheet1.Range("A2:A50") = "=IF(AND(RC[1]<>"""", RC[2]<>"""" ),RC[1]+RC[2],"""")"
End Sub
 
Upvote 0
Bạn thử vầy:
Sub TinhTongKhongTrong()
Sheet1.Range("A2:A50") = "=IF(AND(RC[1]<>"""", RC[2]<>"""" ),RC[1]+RC[2],"""")"
End Sub
Thanks bác, ý em muốn hỏi là nó trống luôn chứ k fai hiển thị trống ạ?
Có cách nào chuyển về dạng applitcation ko bác. Kiểu như code dưới này, nhưng em chưa làm nó chạy dc
If Target.Address = "$A$x" Then
Range("A" & x) = Range("B" & x) + Range("C" & x)
 
Lần chỉnh sửa cuối:
Upvote 0
Cảm ơn bác, ý em muốn hỏi là nó trống luôn chứ k fai hiển thị trống ạ?
Có cách nào chuyển về dạng applitcation ko bác
Dạng applitcation là sao?
Ý muốn này chỉ có thể trở về cách For... Next
PHP:
For I = DòngĐầu To DòngCuối
    If Range("B" & I) + Range("C" & I) > 0 Then
        Range("A" & I) = "=RC[1]+RC[2]"
    End If
Next I
 
Upvote 0
Ý em là không muốn hiển thị công thức trong cell ý
Bài đã được tự động gộp:

Dạng applitcation là sao?
Ý muốn này chỉ có thể trở về cách For... Next
PHP:
For I = DòngĐầu To DòngCuối
    If Range("B" & I) + Range("C" & I) > 0 Then
        Range("A" & I) = "=RC[1]+RC[2]"
    End If
Next I
Ý em là không muốn hiển thị công thức trong cell ý
 
Lần chỉnh sửa cuối:
Upvote 0
Dạng applitcation là sao?
Ý muốn này chỉ có thể trở về cách For... Next
PHP:
For I = DòngĐầu To DòngCuối
    If Range("B" & I) + Range("C" & I) > 0 Then
        Range("A" & I) = "=RC[1]+RC[2]"
    End If
Next I
Em sửa như này sao lại lỗi ạ ?
For I = DòngĐầu To DòngCuối
If Range("B" & I) + Range("C" & I) > 0 Then
Range("A" & I) = range("B"& i ).value + range("C"& i ).value
End If
Next I
Bài đã được tự động gộp:

Vậy là bạn chỉ đọc và "hiểu" code chứ chưa thử?
Vậy là bạn chỉ đọc và "hiểu" code chứ chưa thử?
Em thử rồi, nhưng trong cell có giá trị thực tế vẫn là công thức, tất nhiên cách của bác đã gần đúng với mong muốn của em nhất, nhưng nếu k hiện công thức thì trông nó càng pro hơn :D.
 
Upvote 0
Em sửa như này sao lại lỗi ạ ?
For I = DòngĐầu To DòngCuối
If Range("B" & I) + Range("C" & I) > 0 Then
Range("A" & I) = range("B"& i ).value + range("C"& i ).value
End If
Next I
Bài đã được tự động gộp:



Em thử rồi, nhưng trong cell có giá trị thực tế vẫn là công thức, tất nhiên cách của bác đã gần đúng với mong muốn của em nhất, nhưng nếu k hiện công thức thì trông nó càng pro hơn :D.
Bạn phải gán DòngĐầu = bao nhiêu, Dòng Cuối = bao nhiêu chứ. Ví dụ For I=10 to 30
Tôi chỉ là gợi ý thôi chứ bạn bê nguyên xi thì ai biết DòngĐầu là cái quái gì.
Muốn dọn sạch cột A trước khi chạy code thì bạn thêm dòng lệnh này trước vòng For
PHP:
Range("A" & DongDau & ":A" & DongCuoi).Clearcontents   'Them dong nay'
For I = DongDau To DongCuoi
   If Range("B" & I) + Range("C" & I) > 0 Then
      Range("A" & I).Value = Range("B" & I).Value + Range("C" & I).Value
   End If
Next I
Tôi không hiểu được, "k", "pro" là gì.
 
Lần chỉnh sửa cuối:
Upvote 0
Bạn phải gán DòngĐầu = bao nhiêu, Dòng Cuối = bao nhiêu chứ. Ví dụ For I=10 to 30
Tôi chỉ là gợi ý thôi chứ bạn bê nguyên xi thì ai biết DòngĐầu là cái quái gì.
Muốn dọn sạch cột A trước khi chạy code thì bạn thêm dòng lệnh này trước vòng For
PHP:
Range("A" & DongDau & ":A" & DongCuoi).Clearcontents   'Them dong nay'
For I = DongDau To DongCuoi
   If Range("B" & I) + Range("C" & I) > 0 Then
      Range("A" & I) = "=RC[1]+RC[2]"
   End If
Next I
Tôi không hiểu được, "k", "pro" là gì.
Đúng là kk thì chắc bác sẽ hiểu
Nhưng không hiểu mà bác vẫn làm?
 
Upvote 0
Web KT
Back
Top Bottom