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

Cu Tồ

Thành viên mới
Tham gia ngày
6 Tháng năm 2020
Bài viết
39
Được thích
7
Điểm
15
mn cho hỏi là trong diễn đang mình có ai sử dụng bộ soạn thảo wps không ah? vì mình thấy giữa mrs và wps khi chạy vba thì có một số không tương đồng về cách viết code
 

lovestoryo0o

Thành viên mới
Tham gia ngày
9 Tháng tư 2010
Bài viết
3
Được thích
0
Điểm
663
Tuổi
31
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

giaiphap

==(^o^)==
Tham gia ngày
12 Tháng ba 2007
Bài viết
5,072
Được thích
4,521
Điểm
860
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
 

lovestoryo0o

Thành viên mới
Tham gia ngày
9 Tháng tư 2010
Bài viết
3
Được thích
0
Điểm
663
Tuổi
31
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 ạ.
 

giaiphap

==(^o^)==
Tham gia ngày
12 Tháng ba 2007
Bài viết
5,072
Được thích
4,521
Điểm
860
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
 

Ba Tê

Gội Rồi Mới Cạo
Tham gia ngày
5 Tháng năm 2009
Bài viết
11,487
Được thích
16,395
Điểm
1,860
Tuổi
61
Nơi ở
An Giang
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
 

lovestoryo0o

Thành viên mới
Tham gia ngày
9 Tháng tư 2010
Bài viết
3
Được thích
0
Điểm
663
Tuổi
31
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.
 

panda1112009

Thành viên mới
Tham gia ngày
8 Tháng tám 2017
Bài viết
12
Được thích
1
Điểm
165
Tuổi
28
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
 

giaiphap

==(^o^)==
Tham gia ngày
12 Tháng ba 2007
Bài viết
5,072
Được thích
4,521
Điểm
860
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
 

panda1112009

Thành viên mới
Tham gia ngày
8 Tháng tám 2017
Bài viết
12
Được thích
1
Điểm
165
Tuổi
28
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 @@
 

Duong.bach

Thành viên bị đình chỉ hoạt động
Thành viên bị đình chỉ hoạt động
Tham gia ngày
28 Tháng ba 2020
Bài viết
9
Được thích
1
Điểm
15
Tuổi
27
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
 

CHAOQUAY

Thành viên tích cực
Tham gia ngày
24 Tháng tám 2018
Bài viết
1,084
Được thích
1,132
Điểm
360
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]"
 

Duong.bach

Thành viên bị đình chỉ hoạt động
Thành viên bị đình chỉ hoạt động
Tham gia ngày
28 Tháng ba 2020
Bài viết
9
Được thích
1
Điểm
15
Tuổi
27
Bạn tham khảo đoạn code dưới
Mã:
Sheet1.Range("A1:A50") = "=RC[1]+RC[2]"
Cảm ơn 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.
 

SA_DQ

/(hông là gì!
Thành viên danh dự
Tham gia ngày
8 Tháng sáu 2006
Bài viết
11,397
Được thích
17,305
Điểm
1,860
Bạn thử vầy:
Sub TinhTongKhongTrong()
Sheet1.Range("A2:A50") = "=IF(AND(RC[1]<>"""", RC[2]<>"""" ),RC[1]+RC[2],"""")"
End Sub
 

Duong.bach

Thành viên bị đình chỉ hoạt động
Thành viên bị đình chỉ hoạt động
Tham gia ngày
28 Tháng ba 2020
Bài viết
9
Được thích
1
Điểm
15
Tuổi
27
Bạn thử vầy:
Sub TinhTongKhongTrong()
Sheet1.Range("A2:A50") = "=IF(AND(RC[1]<>"""", RC[2]<>"""" ),RC[1]+RC[2],"""")"
End Sub
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. 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:

Ba Tê

Gội Rồi Mới Cạo
Tham gia ngày
5 Tháng năm 2009
Bài viết
11,487
Được thích
16,395
Điểm
1,860
Tuổi
61
Nơi ở
An Giang
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
 

Duong.bach

Thành viên bị đình chỉ hoạt động
Thành viên bị đình chỉ hoạt động
Tham gia ngày
28 Tháng ba 2020
Bài viết
9
Được thích
1
Điểm
15
Tuổi
27
Ý 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:

Ba Tê

Gội Rồi Mới Cạo
Tham gia ngày
5 Tháng năm 2009
Bài viết
11,487
Được thích
16,395
Điểm
1,860
Tuổi
61
Nơi ở
An Giang

Duong.bach

Thành viên bị đình chỉ hoạt động
Thành viên bị đình chỉ hoạt động
Tham gia ngày
28 Tháng ba 2020
Bài viết
9
Được thích
1
Điểm
15
Tuổi
27
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.
 

Ba Tê

Gội Rồi Mới Cạo
Tham gia ngày
5 Tháng năm 2009
Bài viết
11,487
Được thích
16,395
Điểm
1,860
Tuổi
61
Nơi ở
An Giang
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:
Top Bottom