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:
Xin chào tất cả anh/chị, em có chút vướng mắc với đoạn code sau. Em nhờ anh/chị sửa giúp em để khi em mở hộp thoại OpenDialog lên nhưng không chọn tới file nào để open mà đóng hộp thoại thì bị lỗi xoá trắng dữ lieu đang có trong ThisWorkbook.Sheets("Tong").
Em cảm ơn!
PHP:
Dim sFil As String
Dim owb As Workbook
Dim myFile As String
Dim xLastRow As Long
    myFile = Application.GetOpenFilename("Excel file (*.xls;*.xlsx),*.xls;*.xlsx", , "Select a excel file", , False)
   sFil = Dir(myFile)
  
  ..
      
    Loop

Bạn bẫy lỗi dòng này.
myFile = .....
If myFile="" Then Exit Sub
sFile = Dir(..)
 
Upvote 0
Mọi người cho em hỏi, em có một vấn đề với Dictionary. Nhu cầu của em hiện tại là muốn tạo một Dictionary, gồm Mã Hàng(MH), ngày hàng về kho(NVK), ngày hàng xuất đi tới khách hàng(NX), ngày update. Mỗi ngày kho sẽ update cho em các thông tin này(xóa hết ngày cũ), và note lại một cột là update vào ngày mấy, vấn đề ở đây là ngày hàng về kho và ngày xuất tới khách hàng có thể thay đổi. Hiện tại em muốn tạo một Dictionary, MH là key, ngày update là item, và trong item đó có 2 item con là NVK và NX. Các anh có thể cho em hỏi là vấn đề này có khả thi không, và code để add item con là gì ạ. Em sẽ tạo topic để upload file cũng như code detail mà em viết( hiện em chỉ viết được code add item, ko có item con) nếu khả thi ạ. Em cảm ơn.
 
Upvote 0
trong item đó có 2 item con là NVK và NX
Đọc bài này:

Mục 2.1 chỉ rõ item nhận một giá trị đơn hoặc một mảng (array)

PHP:
Dim Dic As Object
Set Dic = CreateObject("Scripting.Dictionary")
Dic.Add "key", array("NVK", "NX")
 
Upvote 0
Hi mọi người,
File dưới là file tiêu đề lập lại cho từng row, nhược điểm là mỗi môi trường khác nhau phải vào chỉnh sửa code (vì cột và ô ko giống nhau)
Nhờ mọi người giúp e phát triễn thêm thành giống hình dưới đây được không, nghĩa là mình muốn title nào lập lại thì chọn tiêu đề đó, dòng nào muốn lập lại thì chọn dòng...
219822
@file excel đính kèm là file chạy đoạn code phía dưới
Code trong file
Mã:
Sub titleabc()
    Dim i As Integer
    Application.ScreenUpdating = False
    Sheet3.Range("B3:S" & Sheet3.Range("B" & Rows.Count).End(3).Row + 1).Clear
    Sheet1.Range("B5:S" & Sheet1.Range("B" & Rows.Count).End(3).Row - 1).Copy Sheet3.Range("B3")
    For i = Sheet3.Range("B" & Rows.Count).End(3).Row To 3 Step -1
        Sheet3.Rows(i & ":" & i + 1).Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
        Sheet1.Range("B3:S4").Copy Sheet3.Range("B" & i)
        Sheet3.Range("B" & i).Resize(1, 18).Borders.LineStyle = xlNone
    Next
    Application.ScreenUpdating = True
End Sub
 

File đính kèm

  • Xuat-bang-luong-tung-nguoi-voi-header-lap - file goc.xlsm
    130.4 KB · Đọc: 4
Upvote 0
Hi mọi người,
File dưới là file tiêu đề lập lại cho từng row, nhược điểm là mỗi môi trường khác nhau phải vào chỉnh sửa code (vì cột và ô ko giống nhau)
Nhờ mọi người giúp e phát triễn thêm thành giống hình dưới đây được không, nghĩa là mình muốn title nào lập lại thì chọn tiêu đề đó, dòng nào muốn lập lại thì chọn dòng...
View attachment 219822
@file excel đính kèm là file chạy đoạn code phía dưới
Code trong file
Mã:
Sub titleabc()
    Dim i As Integer
    Application.ScreenUpdating = False
    Sheet3.Range("B3:S" & Sheet3.Range("B" & Rows.Count).End(3).Row + 1).Clear
    Sheet1.Range("B5:S" & Sheet1.Range("B" & Rows.Count).End(3).Row - 1).Copy Sheet3.Range("B3")
    For i = Sheet3.Range("B" & Rows.Count).End(3).Row To 3 Step -1
        Sheet3.Rows(i & ":" & i + 1).Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
        Sheet1.Range("B3:S4").Copy Sheet3.Range("B" & i)
        Sheet3.Range("B" & i).Resize(1, 18).Borders.LineStyle = xlNone
    Next
    Application.ScreenUpdating = True
End Sub
Bạn chưa mô tả chi tiết mục đích nên mình thiết kế Form thôi, việc còn lại thì bạn tự sửa code nhé.
 

File đính kèm

  • Xuat-bang-luong-tung-nguoi-voi-header-lap - file goc.xlsm
    132.1 KB · Đọc: 5
Upvote 0
Bạn chưa mô tả chi tiết mục đích nên mình thiết kế Form thôi, việc còn lại thì bạn tự sửa code nhé.
Hi ad
Mục đích là mình muốn thiết kế 1 add-in dang các ribbon trên thanh menu, khi mình click vào thì nó hình ra như hình dưới
219902
Phục vụ cho công việc lập lại tiêu đề cho từng row dữ liệu. Nghĩa là trong file mình gửi, sheet đầu là sheet dữ liệu, 1 tiêu đề chung cho mọi người. Khi in phiếu lương phát cho mọi người thì mình phải copy tiêu đề đó cho từng người tương ứng.Đoạn code mình gửi là mình copy từ file ra.Mà file này của 1 ng trên mạng, giờ áp vào cty thì mỗi lần làm mình phải vào code sửa lại, nên giờ muốn nhờ ad giúp làm 1 cái add-in. khi làm chỉ click chọn thôi, ko có vào code sửa
Mong là hiểu dc ý mình diễn giải
 
Upvote 0
Hi ad
Mục đích là mình muốn thiết kế 1 add-in dang các ribbon trên thanh menu, khi mình click vào thì nó hình ra như hình dưới
View attachment 219902
Phục vụ cho công việc lập lại tiêu đề cho từng row dữ liệu. Nghĩa là trong file mình gửi, sheet đầu là sheet dữ liệu, 1 tiêu đề chung cho mọi người. Khi in phiếu lương phát cho mọi người thì mình phải copy tiêu đề đó cho từng người tương ứng.Đoạn code mình gửi là mình copy từ file ra.Mà file này của 1 ng trên mạng, giờ áp vào cty thì mỗi lần làm mình phải vào code sửa lại, nên giờ muốn nhờ ad giúp làm 1 cái add-in. khi làm chỉ click chọn thôi, ko có vào code sửa
Mong là hiểu dc ý mình diễn giải
Bạn phải giải thích rõ mới làm được.
Thứ nhất là khung màu đỏ thứ nhất (Titles Range) là nó lặp lại chổ nào trong file (Cụ thể hơn là nó lấy từ chổ nào của sheet data và chuyển sang sheet result thì nó nằm ở chổ nào?)
Thứ hai là khung màu đỏ thứ hai (Insert Range) là nó lặp lại chổ nào trong file (Cụ thể hơn là nó lấy từ chổ nào của sheet data và chuyển sang sheet result thì nó nằm ở chổ nào?)
Thứ ba là khung màu đỏ thứ ba (Interval rows) là nó lặp lại chổ nào trong file (Cụ thể hơn là nó lấy từ chổ nào của sheet data và chuyển sang sheet result thì nó nằm ở chổ nào?)
Giải thích cụ thể và chi tiết, nếu được thì giải thích rõ ràng càng tốt.
 
Upvote 0
Bạn phải giải thích rõ mới làm được.
Thứ nhất là khung màu đỏ thứ nhất (Titles Range) là nó lặp lại chổ nào trong file (Cụ thể hơn là nó lấy từ chổ nào của sheet data và chuyển sang sheet result thì nó nằm ở chổ nào?)
Thứ hai là khung màu đỏ thứ hai (Insert Range) là nó lặp lại chổ nào trong file (Cụ thể hơn là nó lấy từ chổ nào của sheet data và chuyển sang sheet result thì nó nằm ở chổ nào?)
Thứ ba là khung màu đỏ thứ ba (Interval rows) là nó lặp lại chổ nào trong file (Cụ thể hơn là nó lấy từ chổ nào của sheet data và chuyển sang sheet result thì nó nằm ở chổ nào?)
Giải thích cụ thể và chi tiết, nếu được thì giải thích rõ ràng càng tốt.
Hi ad, em giải thích tí
1. Hình có 3 khung đỏ với file là ko có gì liên quan, ý e là trong file excel khi bấm nút màu tím thì nó tự chạy dữ liệu (từ sheet DATA), trong file excel có code VBA, nó định sẵn title từ đâu tới đâu, fix sẵn luôn. Giờ em muốn mình tạo 1 nút, khi bấm vào thì nó show cái form giống hình có 3 khung đỏ
a. Khung đỏ đầu: mình muốn tiêu đề nào lập lại thì mình khối chọn, làm vậy nó sẽ động chứ k tĩnh
b. Khung đỏ thứ 2: là dữ liệu nào muốn dc chèn tiêu đề vào, nhưng trong file có 91 người, thì 91 người sẽ dc chèn tiêu đề (xem sheet ketqua)
c. Khung đỏ 3: là muốn bao nhiêu dòng tiêu đề lập lại 1 lần. Như trong file thì mỗi row tiêu đề sẽ lập lại, vd tương lại mình sẽ có nhu cầu cứ sau 5 dòng thì tiêu đề lập lại
vd1: sau 1 row thì lập lại tiêu đề
ABCDEF->là tieu de
111111->du lieu dong 1
ABCDEF->là tieu de
222222->du lieu dong 2
vd2: sau 2 row thì lập lai tiêu đề
ABCDEF->là tieu de
111111->du lieu dong 1
222222->du lieu dong 2
ABCDEF->là tieu de
333333->du lieu dong 3
444444->du lieu dong 4
---
2. Hình có 3 khung đỏ thực chất nó là 1 chức năng trong 1 add-in tên là Kutools
Link tham khảo: https://www.extendoffice.com/documents/excel/4624-excel-header-row-print.html
Nhưng do cái này chỉ cho dùng thử, chứ dùng lâu phải mua key
3. Hiện tại em tạm gọi là có code lập lại tiêu đề rồi nên muốn nâng tiếp 1 bước thành dạng add-in, tạo 1 ribbon trên thanh menu,môi lần dùng chỉ cần click vào, và mình thao tác động, chứ k phải mỗi lần làm phải vào chỉnh sửa code.
Chắc đến đây ad hiểu ý em phải ko
 
Upvote 0
Hi ad, em giải thích tí
1. Hình có 3 khung đỏ với file là ko có gì liên quan, ý e là trong file excel khi bấm nút màu tím thì nó tự chạy dữ liệu (từ sheet DATA), trong file excel có code VBA, nó định sẵn title từ đâu tới đâu, fix sẵn luôn. Giờ em muốn mình tạo 1 nút, khi bấm vào thì nó show cái form giống hình có 3 khung đỏ
a. Khung đỏ đầu: mình muốn tiêu đề nào lập lại thì mình khối chọn, làm vậy nó sẽ động chứ k tĩnh
b. Khung đỏ thứ 2: là dữ liệu nào muốn dc chèn tiêu đề vào, nhưng trong file có 91 người, thì 91 người sẽ dc chèn tiêu đề (xem sheet ketqua)
c. Khung đỏ 3: là muốn bao nhiêu dòng tiêu đề lập lại 1 lần. Như trong file thì mỗi row tiêu đề sẽ lập lại, vd tương lại mình sẽ có nhu cầu cứ sau 5 dòng thì tiêu đề lập lại
vd1: sau 1 row thì lập lại tiêu đề
ABCDEF->là tieu de
111111->du lieu dong 1
ABCDEF->là tieu de
222222->du lieu dong 2
vd2: sau 2 row thì lập lai tiêu đề
ABCDEF->là tieu de
111111->du lieu dong 1
222222->du lieu dong 2
ABCDEF->là tieu de
333333->du lieu dong 3
444444->du lieu dong 4
---
2. Hình có 3 khung đỏ thực chất nó là 1 chức năng trong 1 add-in tên là Kutools
Link tham khảo: https://www.extendoffice.com/documents/excel/4624-excel-header-row-print.html
Nhưng do cái này chỉ cho dùng thử, chứ dùng lâu phải mua key
3. Hiện tại em tạm gọi là có code lập lại tiêu đề rồi nên muốn nâng tiếp 1 bước thành dạng add-in, tạo 1 ribbon trên thanh menu,môi lần dùng chỉ cần click vào, và mình thao tác động, chứ k phải mỗi lần làm phải vào chỉnh sửa code.
Chắc đến đây ad hiểu ý em phải ko
Bạn xem thử đúng yêu cầu của mình chưa nhé, nếu chưa đúng thì tối tính tiếp, có việc bận rồi.
 

File đính kèm

  • Book3.xlsx
    55.4 KB · Đọc: 4
  • ExportFile.xlam
    21 KB · Đọc: 5
Upvote 0
Bạn xem thử đúng yêu cầu của mình chưa nhé, nếu chưa đúng thì tối tính tiếp, có việc bận rồi.
Dear ad
Đầu tiên mình tks nhiều, cơ bản nó giống ý mình muốn rồi, nhưng kế qua hiện tại còn 1 tí lỗi nhỏ, nhờ ad fix dùm mình luôn nha.
219946
1. Như hình 1 thì sau khi mình chọn các đối tượng tương ứng trong form thì dòng dữ liệu bị lệch so với tiêu đề, vả lại giữa tiêu đề và dòng dữ liệu có khoảng trắng, bỏ luôn được không
2. Trong sheet Data có 91 người, ban đầu mình vd chỉ chọn cho tiêu đề lập lại 3 người đầu tiên thôi, file xuất quả đúng là chỉ có 3 người đó
nhưng 3 người đó bị lập đi lại lại nhiều lần, có cách nào chỉ hiện thị đúng số người mình chọn thôi.
4. Hiện tại mình chọn 3 người thì đồng nghĩa với việc sẽ có 3 cái tiêu đề cho 3 người đó, hiện tại 3 người chỉ có 1 tiêu đề
vd kết qua mong muốn là
AAAA->Tiêu đề
Người 1
AAAA->Tiêu đề
Người 2
AAAA->Tiêu đề
Người 3
----
cái này giống như phiếu lương con, mỗi tháng cắt ra đưa cho mỗi người 1 tờ giấy nhỏ để họ xem
Ad xem lại giúp mình.
 
Upvote 0

File đính kèm

  • ExportFile.xlam
    20.9 KB · Đọc: 9
Upvote 0
Em có biến X , em muốn so sánh biến x với vòng lặp for từ a1 đến a10 , nếu chỉ cần có 1 giá trị trong for = x thì ô b1 = "đúng"
- giúp e viết code với
 
Upvote 0
Bạn hãy cho biết thêm: Kiểu dữ liệu của biến X thân thương của bạn;
Tạm là vầy trong khi chờ đợi:
PHP:
 Dim X, J as Long
 For J = 1 To 10
    If Cells(J, "A").Value = X Then
         [B1].Value="OK":      Exit For
    End If
 Next J
 
Upvote 0
Bạn hãy cho biết thêm: Kiểu dữ liệu của biến X thân thương của bạn;
Tạm là vầy trong khi chờ đợi:
PHP:
Dim X, J as Long
For J = 1 To 10
    If Cells(J, "A").Value = X Then
         [B1].Value="OK":      Exit For
    End If
Next J
Bác Sa thức muộn vậy bác.
 
Upvote 0
Có anh cho em hỏi, về code này, bây giờ khi em xóa trắng data cũ và nhập vào data mới, thì dictonary cũng đồng thời bị mất hết keys và items cũ. Có cách nào để vẫn giữ lại item cũ trong Dic không ạ. Đồng thời em muốn xuất data bằng một sub khác, nhưng khi gọi lại các biến của sub DicItem thì lại không đượ, mong nhận được sự giúp đỡ của các anh.
Mã:
Option Explicit
Sub DicItem()
Dim SArr, RArr, TmpArr, Dic1, MaxCols As Long
Dim i As Long, s As Long, EndR As Long, n As Long, Tmp As Long
Dim result()

Set Dic1 = CreateObject("Scripting.Dictionary")

With Dic1
EndR = Sheet1.[A100000].End(xlUp).Row
SArr = Sheet1.Range("A2:DF" & EndR).Value
For i = 1 To EndR - 1
    If Not .Exists(SArr(i, 105)) Then
        s = s + 1
        .Add SArr(i, 105), Array(SArr(i, 110), SArr(i, 18), SArr(i, 19))
        MaxCols = 1
    Else                                             '
        TmpArr = .item(SArr(i, 105))
        Tmp = UBound(.item(SArr(i, 105)))
        ReDim Preserve TmpArr(Tmp + 3)
        TmpArr(Tmp + 1) = SArr(i, 110)
        .item(SArr(i, 105)) = TmpArr
        TmpArr(Tmp + 2) = SArr(i, 18)
        .item(SArr(i, 105)) = TmpArr
        TmpArr(Tmp + 3) = SArr(i, 19)
        .item(SArr(i, 105)) = TmpArr
        If MaxCols < Tmp + 1 Then MaxCols = Tmp + 1
    End If
Next

Sheet8.[A4].Resize(s, 1) = Application.Transpose(.keys)
RArr = Sheet8.[A4].Resize(s, 1).Value

For i = 1 To .Count
Sheet8.Range("B" & i + 3).Resize(1, UBound(.item(RArr(i, 1))) + 1) = .item(RArr(i, 1))
Next

End With

End Sub
 
Upvote 0
Có anh cho em hỏi, về code này, bây giờ khi em xóa trắng data cũ và nhập vào data mới, thì dictonary cũng đồng thời bị mất hết keys và items cũ. Có cách nào để vẫn giữ lại item cũ trong Dic không ạ. Đồng thời em muốn xuất data bằng một sub khác, nhưng khi gọi lại các biến của sub DicItem thì lại không đượ, mong nhận được sự giúp đỡ của các anh.
Mã:
Option Explicit
Sub DicItem()
Dim SArr, RArr, TmpArr, Dic1, MaxCols As Long
Dim i As Long, s As Long, EndR As Long, n As Long, Tmp As Long
Dim result()

Set Dic1 = CreateObject("Scripting.Dictionary")

With Dic1
EndR = Sheet1.[A100000].End(xlUp).Row
SArr = Sheet1.Range("A2:DF" & EndR).Value
For i = 1 To EndR - 1
    If Not .Exists(SArr(i, 105)) Then
        s = s + 1
        .Add SArr(i, 105), Array(SArr(i, 110), SArr(i, 18), SArr(i, 19))
        MaxCols = 1
    Else                                             '
        TmpArr = .item(SArr(i, 105))
        Tmp = UBound(.item(SArr(i, 105)))
        ReDim Preserve TmpArr(Tmp + 3)
        TmpArr(Tmp + 1) = SArr(i, 110)
        .item(SArr(i, 105)) = TmpArr
        TmpArr(Tmp + 2) = SArr(i, 18)
        .item(SArr(i, 105)) = TmpArr
        TmpArr(Tmp + 3) = SArr(i, 19)
        .item(SArr(i, 105)) = TmpArr
        If MaxCols < Tmp + 1 Then MaxCols = Tmp + 1
    End If
Next

Sheet8.[A4].Resize(s, 1) = Application.Transpose(.keys)
RArr = Sheet8.[A4].Resize(s, 1).Value

For i = 1 To .Count
Sheet8.Range("B" & i + 3).Resize(1, UBound(.item(RArr(i, 1))) + 1) = .item(RArr(i, 1))
Next

End With

End Sub
Bạn khai báo biến Public nhé.Khai báo ngoài sub.Bạn thử xem.
 
Upvote 0
Xin chào mọi người
tôi có làm 1 sub để tạo mô hình mẫu
dùng application.inputbox để lựa chọn ô sẽ lưu mô hình mẫu

1. Nhưng chỉ ra kết quả mong muốn trong ActiveSheet là đúng (hình 1)- Sheet2 là sheet hiện hoạt
2. Còn những sheets (sheet KetQua không được kích hoạt) khác thì định đạng không đúng, vì sao vậy? (hình 2)
3. Khác phục như thế nào?
220159
220160
 

File đính kèm

  • format sheet.xlsm
    46 KB · Đọc: 5
Upvote 0
Web KT
Back
Top Bottom