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

snow25

Thành viên gắn bó
Tham gia ngày
24 Tháng bảy 2018
Bài viết
2,207
Được thích
1,982
Điểm
360

Sub dinhdang()
Dim i As Integer
For i = 11 To 18
If Range("F&i") = 1 Then Range("I&i,K&i,P&i,S&i").NumberFormat = "#,##0"
Next i
End Sub


nhờ các thầy chỉ em viết đoạn code trên đang sai chỗ nào với ạ
Đây bạn xem.
Mã:
Sub dinhdang()
Dim i As Integer
For i = 11 To 18
     If Range("F" & i).Value = 1 Then Range("I" & i & "," & "K" & i & "," & "P" & i & "," & "S" & i).NumberFormat = "#,##0"
Next i
End Sub
 

Ba Tê

Cạo Rồi Khỏi Gội
Tham gia ngày
5 Tháng năm 2009
Bài viết
11,187
Được thích
15,880
Điểm
1,860
Tuổi
60
Nơi ở
An Giang

Sub dinhdang()
Dim i As Integer
For i = 11 To 18
If Range("F&i") = 1 Then Range("I&i,K&i,P&i,S&i").NumberFormat = "#,##0"
Next i
End Sub


nhờ các thầy chỉ em viết đoạn code trên đang sai chỗ nào với ạ
Range("F&i") sai.
Range("F" & i) đúng.
Biến i không nằm trong ngoặc kép.
 

minhzau0110

Thành viên mới
Tham gia ngày
5 Tháng sáu 2019
Bài viết
4
Được thích
0
Điểm
13
Tuổi
25
Kính chào các anh, em là tay mơ trong excel và macro muốn hỏi một chút về câu lệnh trỏ đến ô bên cạnh của ô cuối cùng có dữ liệu ạ (ví dụ bảng excel chỉ có cột A có dữ liệu và có 10 dòng thì e muốn chọn ô B10 đó ạ). Từ đó áp vào trường hợp code dưới (code này e sử dụng record macro để tạo ra nên hơi lủng củng ạ). Mục tiêu của code này tính số lần các mặt hàng đáp ứng các tiêu chí thuộc cột I, J.
E đang làm theo các bước:
- lọc tiêu chí cột I, J.
- copy dữ liệu đã lọc sang sheet khác.
- dùng hàm countif để tính số lần.
- remove duplicate để cho ra kết quả cuối cùng ạ.
Nhờ các anh tối ưu code giúp em với ạ.
Mã:
Sub test()

'

' test Macro

'



'

    Selection.AutoFilter

    ActiveSheet.Range("$A$1:$R$28484").AutoFilter Field:=9, Criteria1:="0"

    ActiveSheet.Range("$A$1:$R$28484").AutoFilter Field:=10, Criteria1:="NIL"

    Columns("C:D").Select

    Selection.Copy

    Sheets("Sheet2").Select

    Range("A1").Select

    ActiveSheet.Paste

    Range("C1").Select

    Application.CutCopyMode = False

    ActiveCell.FormulaR1C1 = "No of bad day"

    Range("C2").Select

    ActiveCell.FormulaR1C1 = "=COUNTIF(C[-1],RC[-1])"

    Range("B2").Select

    Selection.End(xlDown).Select

    Range("C1101").Select

    Range(Selection, Selection.End(xlUp)).Select

    Selection.FillDown

    Selection.Copy

    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _

        :=False, Transpose:=False

    Columns("A:C").Select

    Range("A1089").Activate

    Application.CutCopyMode = False

    ActiveSheet.Range("$A$1:$C$1021193").RemoveDuplicates Columns:=Array(1, 2, 3), _

        Header:=xlYes

    Range("A1").Select

    Selection.AutoFilter

    Range("C1").Select

    ActiveWorkbook.Worksheets("Sheet2").AutoFilter.Sort.SortFields.Clear

    ActiveWorkbook.Worksheets("Sheet2").AutoFilter.Sort.SortFields.Add Key:=Range _

        ("C1:C349"), SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:= _

        xlSortNormal

    With ActiveWorkbook.Worksheets("Sheet2").AutoFilter.Sort

        .Header = xlYes

        .MatchCase = False

        .Orientation = xlTopToBottom

        .SortMethod = xlPinYin

        .Apply

    End With

End Sub
 

snow25

Thành viên gắn bó
Tham gia ngày
24 Tháng bảy 2018
Bài viết
2,207
Được thích
1,982
Điểm
360
Kính chào các anh, em là tay mơ trong excel và macro muốn hỏi một chút về câu lệnh trỏ đến ô bên cạnh của ô cuối cùng có dữ liệu ạ (ví dụ bảng excel chỉ có cột A có dữ liệu và có 10 dòng thì e muốn chọn ô B10 đó ạ). Từ đó áp vào trường hợp code dưới (code này e sử dụng record macro để tạo ra nên hơi lủng củng ạ). Mục tiêu của code này tính số lần các mặt hàng đáp ứng các tiêu chí thuộc cột I, J.
E đang làm theo các bước:
- lọc tiêu chí cột I, J.
- copy dữ liệu đã lọc sang sheet khác.
- dùng hàm countif để tính số lần.
- remove duplicate để cho ra kết quả cuối cùng ạ.
Nhờ các anh tối ưu code giúp em với ạ.
Mã:
Sub test()

'

' test Macro

'



'

    Selection.AutoFilter

    ActiveSheet.Range("$A$1:$R$28484").AutoFilter Field:=9, Criteria1:="0"

    ActiveSheet.Range("$A$1:$R$28484").AutoFilter Field:=10, Criteria1:="NIL"

    Columns("C:D").Select

    Selection.Copy

    Sheets("Sheet2").Select

    Range("A1").Select

    ActiveSheet.Paste

    Range("C1").Select

    Application.CutCopyMode = False

    ActiveCell.FormulaR1C1 = "No of bad day"

    Range("C2").Select

    ActiveCell.FormulaR1C1 = "=COUNTIF(C[-1],RC[-1])"

    Range("B2").Select

    Selection.End(xlDown).Select

    Range("C1101").Select

    Range(Selection, Selection.End(xlUp)).Select

    Selection.FillDown

    Selection.Copy

    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _

        :=False, Transpose:=False

    Columns("A:C").Select

    Range("A1089").Activate

    Application.CutCopyMode = False

    ActiveSheet.Range("$A$1:$C$1021193").RemoveDuplicates Columns:=Array(1, 2, 3), _

        Header:=xlYes

    Range("A1").Select

    Selection.AutoFilter

    Range("C1").Select

    ActiveWorkbook.Worksheets("Sheet2").AutoFilter.Sort.SortFields.Clear

    ActiveWorkbook.Worksheets("Sheet2").AutoFilter.Sort.SortFields.Add Key:=Range _

        ("C1:C349"), SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:= _

        xlSortNormal

    With ActiveWorkbook.Worksheets("Sheet2").AutoFilter.Sort

        .Header = xlYes

        .MatchCase = False

        .Orientation = xlTopToBottom

        .SortMethod = xlPinYin

        .Apply

    End With

End Sub
Cho cái file lên xem nào bạn.
 

Ba Tê

Cạo Rồi Khỏi Gội
Tham gia ngày
5 Tháng năm 2009
Bài viết
11,187
Được thích
15,880
Điểm
1,860
Tuổi
60
Nơi ở
An Giang

minhzau0110

Thành viên mới
Tham gia ngày
5 Tháng sáu 2019
Bài viết
4
Được thích
0
Điểm
13
Tuổi
25
Nhìn file đâu biết bạn muốn có kết quả thế nào.
Bạn làm thủ công kết quả cụ thể bạn muốn vào 1 sheet khác xem sao.
Càng nhiều kết quả càng tốt.
Em xin lỗi để em gửi lại ạ. Cụ thể các bước e đã làm như sau:
- Bước 1: ở sheet Raw data, em filter theo giá trị cột I, J và R. (I = 0, J = NIL, R > 0)
- Bước 2: copy dữ liệu cột C, D đã filter sang sheet thứ 2 để tính số lần xuất hiện bằng hàm countif.
- Bước 3: sau khi countif xong copy paste value dữ liệu sang sheet thứ 3 để remove duplicate (cái này bình thường em hay copy paste value thẳng trên sheet 2 luôn).
- Bước 4: filter dữ liệu có số lần xuất hiện >=4.
Lúc record macro thì em phát hiện lỗi ở đoạn mã khi mình muốn dùng hàm tính countif dữ liệu. (ví dụ bảng excel chỉ có cột A có dữ liệu và có 10 dòng thì mình muốn chọn từ ô B1-B10 để tính countif cho cột A. Tuy nhiên khi sang file có độ dài khác thì mã macro vẫn đang trỏ đến ô B10 nên không dùng được ạ).
 

File đính kèm

Ba Tê

Cạo Rồi Khỏi Gội
Tham gia ngày
5 Tháng năm 2009
Bài viết
11,187
Được thích
15,880
Điểm
1,860
Tuổi
60
Nơi ở
An Giang
Em xin lỗi để em gửi lại ạ. Cụ thể các bước e đã làm như sau:
- Bước 1: ở sheet Raw data, em filter theo giá trị cột I, J và R. (I = 0, J = NIL, R > 0)
- Bước 2: copy dữ liệu cột C, D đã filter sang sheet thứ 2 để tính số lần xuất hiện bằng hàm countif.
- Bước 3: sau khi countif xong copy paste value dữ liệu sang sheet thứ 3 để remove duplicate (cái này bình thường em hay copy paste value thẳng trên sheet 2 luôn).
- Bước 4: filter dữ liệu có số lần xuất hiện >=4.
Lúc record macro thì em phát hiện lỗi ở đoạn mã khi mình muốn dùng hàm tính countif dữ liệu. (ví dụ bảng excel chỉ có cột A có dữ liệu và có 10 dòng thì mình muốn chọn từ ô B1-B10 để tính countif cho cột A. Tuy nhiên khi sang file có độ dài khác thì mã macro vẫn đang trỏ đến ô B10 nên không dùng được ạ).
Bạn xem file này, 4 bước của bạn gom lại thành 1 cái Click chuột.
 

File đính kèm

huuon

Thành viên mới
Tham gia ngày
14 Tháng bảy 2017
Bài viết
2
Được thích
0
Điểm
163
Tuổi
26
Xin chào mọi người mình gặp vấn đề sau:
Có cách nào dùng marco tạo file excel mới chứa các marco của file cũ không ?
Mình dùng marco tạo file mới nhưng file mới ko chứa marco cũ.
Nếu lại phải tạo marco cho file mới thì rất mất thời gian.
 

huonglien1901

GPE là ngôi nhà thứ 2 của tôi!!!
Tham gia ngày
17 Tháng tư 2016
Bài viết
2,136
Được thích
1,682
Điểm
360
Tuổi
27
Xin chào mọi người mình gặp vấn đề sau:
Có cách nào dùng marco tạo file excel mới chứa các marco của file cũ không ?
Mình dùng marco tạo file mới nhưng file mới ko chứa marco cũ.
Nếu lại phải tạo marco cho file mới thì rất mất thời gian.
bạn lưu định dạng xlsm.xlsb là code có thể lưu mà.
 

lehanhquyen

Thành viên mới
Tham gia ngày
13 Tháng năm 2012
Bài viết
4
Được thích
0
Điểm
363
Em chào các anh chị,
Em mới học VBA nên còn nhiều bỡ ngỡ mong anh chị sửa giúp em câu lệnh này.

Đây là bước em làm trên Excel
Sheets("Market Values").Range("A19:dO19").Copy Destination:=Sheets("MV").Range("A2")
Sheets("Market Values").Range("A31:dO31").Copy Destination:=Sheets("MV").Range("A3")
Sheets("Market Values").Range("A43:dO43").Copy Destination:=Sheets("MV").Range("A4")
Sheets("Market Values").Range("A55:dO55").Copy Destination:=Sheets("MV").Range("A5")
Sheets("Market Values").Range("A67:dO67").Copy Destination:=Sheets("MV").Range("A6")
Sheets("Market Values").Range("A79:dO79").Copy Destination:=Sheets("MV").Range("A7")

Còn đây là code em chạy VBA:
Sub mv()
Dim i as integer
For i = 0 To 5
Sheets("Market Values").Range(Cells(19 + i * 12, 1), Cells(19 + i * 12, 119)).Copy Destination:=Sheets("MV").Cells(i + 2, 1).Paste
Next i
End Sub

Khi em chạy mà nó báo lỗi ko chạy đc ạ. Mong anh chị chỉ lỗi giúp em.
Em cảm ơn anh chị ạ
 

tam888

Thành viên tích cực
Tham gia ngày
22 Tháng tám 2013
Bài viết
840
Được thích
498
Điểm
435
Em chào các anh chị,
Em mới học VBA nên còn nhiều bỡ ngỡ mong anh chị sửa giúp em câu lệnh này.

Đây là bước em làm trên Excel
Sheets("Market Values").Range("A19:dO19").Copy Destination:=Sheets("MV").Range("A2")
Sheets("Market Values").Range("A31:dO31").Copy Destination:=Sheets("MV").Range("A3")
Sheets("Market Values").Range("A43:dO43").Copy Destination:=Sheets("MV").Range("A4")
Sheets("Market Values").Range("A55:dO55").Copy Destination:=Sheets("MV").Range("A5")
Sheets("Market Values").Range("A67:dO67").Copy Destination:=Sheets("MV").Range("A6")
Sheets("Market Values").Range("A79:dO79").Copy Destination:=Sheets("MV").Range("A7")

Còn đây là code em chạy VBA:
Sub mv()
Dim i as integer
For i = 0 To 5
Sheets("Market Values").Range(Cells(19 + i * 12, 1), Cells(19 + i * 12, 119)).Copy Destination:=Sheets("MV").Cells(i + 2, 1).Paste
Next i
End Sub

Khi em chạy mà nó báo lỗi ko chạy đc ạ. Mong anh chị chỉ lỗi giúp em.
Em cảm ơn anh chị ạ
Nếu vẫn thích dùng COPY thì dùng cái này (copy thì nó được định dạng và công thức (nếu có))

Cách 1 dùng range address, thêm biến ii
Mã:
For i=2 to 7
   ii= 19 + (i-2)*12
   Sheets("Market Values").Range("A" & ii & ":D" & ii).Copy Destination:=Sheets("MV").Range("A" & i)
next i
Cách 2 dùng Cells
Mã:
For i=2 to 7
   Sheets("Market Values").Cells(1,19 + (i-2)*12).Resize(,119).Copy Destination:=Sheets("MV").Cells(i,1)
next i
Cách 3, chỉ gán giá trị (VALUE) cho nhanh
Mã:
For i=2 to 7
   Sheets("MV").Cells(1,i).Resize(,119).Value = Sheets("Market Values").Cells(1,19 + (i-2)*12).Resize(,119).Value
next i
-----------------
Còn lỗi trong công thức của bạn thì (vì bạn biết vba rồi nên tôi chỉ vắn tắt): Kiểm tra lại Cells(....) gắn vào đâu?
 

leviethungtoht

Thành viên mới
Tham gia ngày
11 Tháng năm 2010
Bài viết
4
Được thích
1
Điểm
365
Tuổi
32
Nhờ các pro chỉ dùm kiểu lập trình vba của phần mềm dutoan97 là như thế nào. Mình thấy họ viết các câu lệnh ngay trên sheet. Đây là kiểu lập trình gì vậy. Làm thế nào để chạy các câu lệnh này? Cảm ơn pro.
 

File đính kèm

vanmanhvcu

Thành viên chính thức
Tham gia ngày
27 Tháng ba 2011
Bài viết
75
Được thích
9
Điểm
370
Tuổi
29
Chào tất cả mọi người !
nhờ mọi người xem giúp mình vì sao UDF function của mình khi gõ vào Office 2007 - 32bit không hiện ra
mình đóng gói UDF trong add-in để có thể dùng nhiều lần function trên file
link ở bài viết này:
 

CHAOQUAY

Thành viên tiêu biểu
Tham gia ngày
24 Tháng tám 2018
Bài viết
730
Được thích
651
Điểm
360
Chào tất cả mọi người !
nhờ mọi người xem giúp mình vì sao UDF function của mình khi gõ vào Office 2007 - 32bit không hiện ra
mình đóng gói UDF trong add-in để có thể dùng nhiều lần function trên file
link ở bài viết này:
Thử sửa bên trên thành bên dưới xem sao
Mã:
Function CONTAINER(ContNo As String) As Boolean
Mã:
Public Function CONTAINER(ContNo As String) As Boolean
 

vanmanhvcu

Thành viên chính thức
Tham gia ngày
27 Tháng ba 2011
Bài viết
75
Được thích
9
Điểm
370
Tuổi
29
Thử sửa bên trên thành bên dưới xem sao
Mã:
Function CONTAINER(ContNo As String) As Boolean
Mã:
Public Function CONTAINER(ContNo As String) As Boolean
Vẫn không được bác ạ.
gõ công thức vẫn không hiện ra
vậy là vì sao?
 

VetMini

Gian hùng bàn phiếm (thành viên trôi nước)
Tham gia ngày
21 Tháng mười hai 2012
Bài viết
7,087
Được thích
8,322
Điểm
560
Những điều kiện cần thiết để hàm UDF hiện ra khi gõ tên nó trên bảng tính:

1. Nó phải nằm trong module căn bản, không phải sheet, không phải project khác.
2. Excel 2007 trở lên (2003 có thể dùng được UDF nhưng không bảo đảm cái tên nó hiện ra)

Người viết bài #2136 có lẽ vi phạm điều kiện 1 ở trên (theo nói thì hàm nằm ở trong add-in)
 
Top Bottom