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:
Đã xong.

Mình post file và code cho bạn nào có nhu cầu chèn giống mình.

Mã:
Sub InsertTitles()
Dim I As Long, J As Integer, Van As Integer
For I = Range("A20").End(xlUp).Row To 2 Step -1
Van = 3
For J = 2 To Van - 1
Rows(I + J).Insert xlDown
Rows(I + J).Insert xlDown
Rows("1:2").Copy
Rows(I + J).PasteSpecial
Next
Next
Application.CutCopyMode = False
End Sub

Giải thích chút xíu về code cho các bạn dễ chỉnh sửa.
Rows("1:2").Copy ' > Dòng các bạn muốn copy
Van = 3 ' > Bạn copy 1 dòng thì "Van = 2", copy 2 dòng thì "Van = 3", 3 dòng 4 dòng 5 dòng thì cứ thế tăng lên
For J = 2 To Van - 1 ' > Copy 2 dòng thì "J = 1", Copy 2 dòng thì "J = 2",...
Rows(I + J).Insert xlDown ' > Chèn 1 dòng thì để 1 dòng này, chèn 2 dòng thì để 2 dòng,... Code mình hơi thô ở đoạn này nhờ các cao thủ chỉnh lại cho đẹp.
 

File đính kèm

Upvote 0
Đã xong.

Mình post file và code cho bạn nào có nhu cầu chèn giống mình.

Mã:
Sub InsertTitles()
Dim I As Long, J As Integer, Van As Integer
For I = Range("A20").End(xlUp).Row To 2 Step -1
Van = 3
For J = 2 To Van - 1
Rows(I + J).Insert xlDown
Rows(I + J).Insert xlDown
Rows("1:2").Copy
Rows(I + J).PasteSpecial
Next
Next
Application.CutCopyMode = False
End Sub

Giải thích chút xíu về code cho các bạn dễ chỉnh sửa.
Rows("1:2").Copy ' > Dòng các bạn muốn copy
Van = 3 ' > Bạn copy 1 dòng thì "Van = 2", copy 2 dòng thì "Van = 3", 3 dòng 4 dòng 5 dòng thì cứ thế tăng lên
For J = 2 To Van - 1 ' > Copy 2 dòng thì "J = 1", Copy 2 dòng thì "J = 2",...
Rows(I + J).Insert xlDown ' > Chèn 1 dòng thì để 1 dòng này, chèn 2 dòng thì để 2 dòng,... Code mình hơi thô ở đoạn này nhờ các cao thủ chỉnh lại cho đẹp.
Dùng 1 For thôi, và do chèn dòng nên phải dùng For ngược (step -1) để tránh sai, và nhanh hơn
 
Upvote 0
Em chào các anh/chị ạ. Em là thành viên mới.
Các anh/chị cho em hỏi để loop filter từng giá trị trong một cột bằng VBA thì phải làm thế nào ạ? Ví dụ em có cột A chứa các giá trị như sau:
1
2
1
1
3
2
3
Giờ em muốn filter cột A lấy giá trị 1, chạy 1 đoạn code rồi filter lấy giá trị 2, chạy 1 đoạn code,... cho đến hết các giá trị khác nhau trong cột A. Mong các anh/chị giải đáp giúp, em xin cảm ơn ạ!
 
Upvote 0
Dùng 1 for như thế nào vậy bạn? Mình không chạy được nên để 2 for.
ví dụ thế này
Mã:
Sub InsertTitles00()
Dim I As Long
For I = Range("A11").Row To 4 Step -1
    Rows("1:2").Copy
    Rows(I).Insert xlDown
Next
Application.CutCopyMode = False
End Sub
(giả định đến A11, còn tìm dòng cuối - tự làm đi)
 
Upvote 0
Em chào các anh/chị ạ. Em là thành viên mới.
Các anh/chị cho em hỏi để loop filter từng giá trị trong một cột bằng VBA thì phải làm thế nào ạ? Ví dụ em có cột A chứa các giá trị như sau:
1
2
1
1
3
2
3
Giờ em muốn filter cột A lấy giá trị 1, chạy 1 đoạn code rồi filter lấy giá trị 2, chạy 1 đoạn code,... cho đến hết các giá trị khác nhau trong cột A. Mong các anh/chị giải đáp giúp, em xin cảm ơn ạ!
Không hiểu lắm mục đích và yêu cầu của bạn nên gửi cái này cho bạn. Nếu muốn các bạn khác giúp tốt hơn bạn nên đưa file ví dụ lên cho dễ test
Mã:
Sub Filter()
Dim vn As Worksheet
Set vn = ThisWorkbook.Sheets("Sheet1") ' Sheet dữ liệu gốc
Dim vnn As Worksheet
Set vnn = ThisWorkbook.Sheets("Sheet2") ' Sheet chứa kết quả
vnn.UsedRange.Clear
vn.AutoFilterMode = False
vn.UsedRange.AutoFilter 2, "1" ' Cột muốn lọc A=1, B=2; giá trị muốn lọc
vn.UsedRange.Copy vnn.Range("A1") ' Vị trí xuất
vn.AutoFilterMode = False
End Sub
 
Upvote 0
Theo hình Bài #2052 thì không cần For nào.
Copy 2 lần, paste 3 lần, sort 1 lần là được.
 
Upvote 0
ví dụ thế này
Mã:
Sub InsertTitles00()
Dim I As Long
For I = Range("A11").Row To 4 Step -1
    Rows("1:2").Copy
    Rows(I).Insert xlDown
Next
Application.CutCopyMode = False
End Sub
(giả định đến A11, còn tìm dòng cuối - tự làm đi)
Thanks bạn nha. Mình chỉnh lại xíu cho nó tự đếm dòng cuối cùng chứa dự liệu :v :V :v
Mã:
Sub InsertTitles()
Dim I As Long
For I = Range("A" & Cells(Rows.Count, "A").End(xlUp).Row).Row To 4 Step -1
    Rows(I).Insert xlDown
    Rows(I).Insert xlDown
    Rows("1:2").Copy
    Rows(I).PasteSpecial
Next
Application.CutCopyMode = False
End Sub
Bài đã được tự động gộp:

Theo hình Bài #2052 thì không cần For nào.
Copy 2 lần, paste 3 lần, sort 1 lần là được.
Mình không hiểu cách làm của bạn lắm. Bạn nói rõ hơn được không?
 
Upvote 0
Không hiểu lắm mục đích và yêu cầu của bạn nên gửi cái này cho bạn. Nếu muốn các bạn khác giúp tốt hơn bạn nên đưa file ví dụ lên cho dễ test

Ví dụ em có bảng sau:
216657

Em muốn filter qua lần lượt các giá trị khác nhau ở cột A và copy dữ liệu tương ứng ở cột B (như trong hình filter giá trị 1 và copy B2:B3). Làm tương tự với các giá trị còn lại (số lượng giá trị khác nhau ở cột A không cố định) thì phải sử dụng VBA như thế nào ạ?
216658
 
Upvote 0
Em chào các anh/chị ạ. Em là thành viên mới.
Các anh/chị cho em hỏi để loop filter từng giá trị trong một cột bằng VBA thì phải làm thế nào ạ? Ví dụ em có cột A chứa các giá trị như sau:
1
2
1
1
3
2
3
Giờ em muốn filter cột A lấy giá trị 1, chạy 1 đoạn code rồi filter lấy giá trị 2, chạy 1 đoạn code,... cho đến hết các giá trị khác nhau trong cột A. Mong các anh/chị giải đáp giúp, em xin cảm ơn ạ!
Mình đoán là bạn muốn in à.Cho cái file lên coi.
 
Upvote 0
Ví dụ em có bảng sau:
View attachment 216657

Em muốn filter qua lần lượt các giá trị khác nhau ở cột A và copy dữ liệu tương ứng ở cột B (như trong hình filter giá trị 1 và copy B2:B3). Làm tương tự với các giá trị còn lại (số lượng giá trị khác nhau ở cột A không cố định) thì phải sử dụng VBA như thế nào ạ?
View attachment 216658
Dùng AdvancedFilter thử nhé:
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
    Range("A2:B8").AdvancedFilter xlFilterInPlace, Range("D1:D2")
End Sub
 

File đính kèm

Upvote 0
Dùng AdvancedFilter thử nhé:
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
    Range("A2:B8").AdvancedFilter xlFilterInPlace, Range("D1:D2")
End Sub

Cảm ơn anh/chị đã hỗ trợ ạ :D Nhưng trong trường hợp này ý của em là em cần viết 1 cái macro để khi chạy macro nó tự động filter lấy từng giá trị khác nhau ở cột A (số lượng giá trị khác nhau không biết trước) ạ. Như trong ví dụ ở post #2063, khi chạy macro sẽ filter lấy giá trị 1 ở cột A -> copy giá trị đã filter ở cột B -> filter lấy giá trị 2 ở cột A -> copy giá trị đã filter ở cột B -> filter lấy giá trị 3 -> copy giá trị đã filter ở cột B. Trường hợp này cột A có 3 giá trị khác nhau là 1, 2, 3, nhưng em đang cần một cách làm tổng quát để có thể sử dụng khi số lượng giá trị khác nhau không biết trước ạ
 
Upvote 0
Cảm ơn anh/chị đã hỗ trợ ạ :D Nhưng trong trường hợp này ý của em là em cần viết 1 cái macro để khi chạy macro nó tự động filter lấy từng giá trị khác nhau ở cột A (số lượng giá trị khác nhau không biết trước) ạ. Như trong ví dụ ở post #2063, khi chạy macro sẽ filter lấy giá trị 1 ở cột A -> copy giá trị đã filter ở cột B -> filter lấy giá trị 2 ở cột A -> copy giá trị đã filter ở cột B -> filter lấy giá trị 3 -> copy giá trị đã filter ở cột B. Trường hợp này cột A có 3 giá trị khác nhau là 1, 2, 3, nhưng em đang cần một cách làm tổng quát để có thể sử dụng khi số lượng giá trị khác nhau không biết trước ạ
Thì bạn cứ đưa file có dữ liệu giống thật và kết quả bạn muốn có (bằng thủ công) để mọi người hiểu được bạn muốn thế nào.
Cứ Copy, copy... rồi để nó ở đâu?
 
Upvote 0
Thì bạn cứ đưa file có dữ liệu giống thật và kết quả bạn muốn có (bằng thủ công) để mọi người hiểu được bạn muốn thế nào.
Cứ Copy, copy... rồi để nó ở đâu?
Phần copy chỉ là ví dụ, còn mục đích chính vẫn là cách viết macro để loop filter các giá trị khác nhau trong cột ạ. 216670
Như trong cột A em có các mã khách hàng như thế này. Em cần lần lượt filter lấy giá trị 200024 -> 290001 -> 290083 -> .... cho đên hết. Em nghĩ vấn đề này cũng không quá phức tạp nên cũng không cần file dữ liệu làm gì cho rắc rối ạ :D
 
Upvote 0
Phần copy chỉ là ví dụ, còn mục đích chính vẫn là cách viết macro để loop filter các giá trị khác nhau trong cột ạ. View attachment 216670
Như trong cột A em có các mã khách hàng như thế này. Em cần lần lượt filter lấy giá trị 200024 -> 290001 -> 290083 -> .... cho đên hết. Em nghĩ vấn đề này cũng không quá phức tạp nên cũng không cần file dữ liệu làm gì cho rắc rối ạ :D
Quên Filter đi, dùng Dictionary
 
Upvote 0
Phần copy chỉ là ví dụ, còn mục đích chính vẫn là cách viết macro để loop filter các giá trị khác nhau trong cột ạ.
...
Như trong cột A em có các mã khách hàng như thế này. Em cần lần lượt filter lấy giá trị 200024 -> 290001 -> 290083 -> .... cho đên hết. Em nghĩ vấn đề này cũng không quá phức tạp nên cũng không cần file dữ liệu làm gì cho rắc rối ạ :D
Bạn nghĩ sai rồi. Vấn đề này chỉ "không quá phức tạp" khi:
1. bạn đã hiểu thật rõ yêu cầu của mình.
2. bạn có khả năng diễn tả thật chính xác và đầy đủ yêu cầu ấy. Điều này bao gồm cả ví dụ dữ liệu đầu vào và đầu ra.

Vì tước mắt là bạn đã không làm được cả hai điều trên cho nên cái file dữ liệu là công cụ giúp người khác đoán vấn đề phụ cho bạn.
 
Upvote 0
Phần copy chỉ là ví dụ, còn mục đích chính vẫn là cách viết macro để loop filter các giá trị khác nhau trong cột ạ.
Tham khảo code này xem:
Mã:
Private Sub CommandButton1_Click()
    If ActiveSheet.FilterMode = False Then
        Range("A2:A8").AdvancedFilter 1, , , 1
        CommandButton1.Caption = "Show"
    Else
        ActiveSheet.ShowAllData
        CommandButton1.Caption = "Hide"
    End If
End Sub
 

File đính kèm

Upvote 0
Web KT

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

Back
Top Bottom