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:
Rows("1:1").Select ' => chọn dòng 1
Selection.Copy ' => Copy dòng đang chọn
Selection.Insert Shift:=x1Down ' => chèn tại dòng đang chọn

Nếu muốn chèn tại dòng 3 thì viết rút gọn như sau:

Rows("1:1").Copy ' => Copy dòng 1
Rows("3:3").Insert Shift:=x1Down ' => chèn tại dòng 3

Cái đoạn này mình hiểu rùi. Ý mình là mình muốn phát triển đoạn này lên 1 xíu là mình muốn chèn cái đoạn mình copy vào nhiều dòng như sheet "kết quả" trong file của mình ấy.

Kiểu như đoạn code dưới. Nhưng mà đoạn này thì mình viết sai rồi nên bị lỗi
Mã:
Do
    Rows(r.Offset(1, 0), r.Offset(j, 0)).Insert Shift:=x1Down
    Set r = Cells(r.Row + j + 1, 1)
    If r.Offset(1, 0) = "" Then Exit Do
    Loop
216579
Bạn xem giúp mình đoạn này hoặc chỉ mình viết đoạn khác với. Cảm ơn nhiều lắm.
 
Upvote 0
Cái đoạn này mình hiểu rùi. Ý mình là mình muốn phát triển đoạn này lên 1 xíu là mình muốn chèn cái đoạn mình copy vào nhiều dòng như sheet "kết quả" trong file của mình ấy.

Kiểu như đoạn code dưới. Nhưng mà đoạn này thì mình viết sai rồi nên bị lỗi
Mã:
Do
    Rows(r.Offset(1, 0), r.Offset(j, 0)).Insert Shift:=x1Down
    Set r = Cells(r.Row + j + 1, 1)
    If r.Offset(1, 0) = "" Then Exit Do
    Loop
View attachment 216579
Bạn xem giúp mình đoạn này hoặc chỉ mình viết đoạn khác với. Cảm ơn nhiều lắm.
Bạn cho cái file lên nhé.
 
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.
 

File đính kèm

  • Insert Copied Cells.xlsm
    28.7 KB · Đọc: 3
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

  • AdvancedFilter.xlsm
    13.8 KB · Đọc: 6
Upvote 0
Web KT
Back
Top Bottom