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:
Em chào các anh chị!
Em có code lấy dữ liệu từ 1 workbook khác như bên dưới, nhưng khi vận hành nếu sarr(1,j) (j =25 to 28) có số ký tự >255 thì nó chỉ lấy đến 255 ký tự thôi ạ, cụ thể là file "An" trong cell B26 sẽ bị bỏ bớt nội dung khi sang file "z File Tong hop". Mong các anh chị giúp đỡ ạ, code này em đi xin bác snow25 nên không hiểu bản chất. Em cám ơn!

Mã:
Sub tonghop()

     Application.ScreenUpdating = False

     Application.AskToUpdateLinks = False

     Application.DisplayAlerts = False

     Dim cn As Object, sqlStr As String, i As Long, lr As Long, k, rst As Object, Pro As String, ext As String, arr(1 To 1000, 1 To 14), a As Long

     Dim sarr, j As Long

     Set cn = CreateObject("ADODB.Connection")

     Set rst = CreateObject("ADODB.recordset")

     With Application.FileDialog(msoFileDialogFilePicker)

         .AllowMultiSelect = True

    If Not .Show = -1 Then Exit Sub

    For Each k In .SelectedItems

       Pro = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source="

       ext = ";Extended Properties=""Excel 12.0;HDR=yes;IMEX= 1"";"

       cn.Open (Pro & k & ext)

       sqlStr = "Select * From [sheet1$a1:e30]"

       sarr = cn.Execute(sqlStr).GetRows

       a = a + 1

       arr(a, 1) = a

       arr(a, 2) = sarr(1, 3)

       arr(a, 3) = sarr(1, 0)

       arr(a, 4) = sarr(1, 2)

       arr(a, 5) = sarr(1, 1)

       arr(a, 9) = sarr(4, 7)

       arr(a, 10) = sarr(4, 8)

       arr(a, 11) = sarr(4, 9)

       arr(a, 12) = sarr(4, 10)

       arr(a, 13) = sarr(4, 11)

       arr(a, 14) = sarr(1, 24)

       For j = 25 To 28

          If sarr(1, j) <> Empty Then arr(a, 14) = arr(a, 14) & Chr(10) & sarr(1, j)

       Next j

       cn.Close

    Next

    End With

    With Sheets("sheet1")

         lr = .Range("A" & Rows.Count).End(xlUp).Row

         If lr > 12 Then .Range("A13:N" & lr).ClearContents

         If a Then .Range("A13:N13").Resize(a).Value = arr

     End With

End Sub
 

File đính kèm

  • Tong hop file.zip
    40 KB · Đọc: 4
Lần chỉnh sửa cuối:
Upvote 0
Cảm ơn anh chị đã giải đáp bài tập hôm bữa, Nay em lại xin nhờ anh chị giải đáp tiếp 1 bài tập như sau. Bài tập này bổ sung bài tập trước.

Yêu cầu: Đếm xem từng vật liệu có bao nhiêu ngày về trong tháng và tổng lượng hàng về trong tháng. ( có ngày về 2 lần, nên sẽ trùng ngày )
 

File đính kèm

  • VBA - DDP - Hỏi đáp 8.9.xlsm
    17.6 KB · Đọc: 2
Upvote 0
Đây là thớt "thắc mắc về code". Giành cho những người viết code và cần được chỉ dẫn chỗ bí hoặc thắc mắc.

Bài tập cần làm giùm thì đem qua thớt "thành viên giúp nhau" mà nhờ.
 
Upvote 0
Các cụ cho em hỏi dòng code này sai ở đâu ạ :(
Sheet1.Range("G2").Formula = "=E2= Sheet4.Range("B1")"



Nếu em để dạng tex thì như này lại đúng:
Sheet1.Range("G2").Formula = "=E2="""& Sheet4.Range("B1") & """"



Code full đây ạ T___T
Sub Search_BDS()

Sheet4.Range("A3:F1000").Clear
Sheet1.Range("G2").Formula = "=E2= Sheet4.Range("B1")"
Sheet1.Range("A1:F67010").AdvancedFilter Action:=xlFilterCopy, _
CriteriaRange:=Sheet1.Range("G1:G2"), CopyToRange:=Sheet4.Range("A3"), _
Unique:=False
End Sub
 
Upvote 0
Các cụ cho em hỏi dòng code này sai ở đâu ạ :(
Sheet1.Range("G2").Formula = "=E2= Sheet4.Range("B1")"



Nếu em để dạng tex thì như này lại đúng:
Sheet1.Range("G2").Formula = "=E2="""& Sheet4.Range("B1") & """"



Code full đây ạ T___T
Sub Search_BDS()

Sheet4.Range("A3:F1000").Clear
Sheet1.Range("G2").Formula = "=E2= Sheet4.Range("B1")"
Sheet1.Range("A1:F67010").AdvancedFilter Action:=xlFilterCopy, _
CriteriaRange:=Sheet1.Range("G1:G2"), CopyToRange:=Sheet4.Range("A3"), _
Unique:=False
End Sub
Bạn chạy debug 2 câu lệnh xem nó có gì khác nhau là biết.
 
Upvote 0
Sheet1.Range("G2").Formula = "=E2= Sheet4.Range("B1")"
VBA báo đỏ mng ạ
Ý của em là muốn ô G2 đc gán công thức là =E2=B1 (của sheet 4 ạ) trả về kết quả true hoặc false
 
Upvote 0
Các Thầy cho em hỏi có đoạn code nào có thể enable protect view và enable contents ngay khi mở file *.xlsm không ạ?
Em muốn chạy 1 sự kiện open workbook ngay khi vừa mở file lên mà không cần phải click enable lên 2 thanh màu vàng khi mở file.
Em muốn dùng code để thực hiện mà không phải vào excel option để chỉnh lại phần trust, vì file có thể gửi cho người khác sử dụng.
Mong nhận được phản hồi của các Thầy. Em cảm ơn!
 
Upvote 0
Các Thầy cho em hỏi có đoạn code nào có thể enable protect view và enable contents ngay khi mở file *.xlsm không ạ?
Em muốn chạy 1 sự kiện open workbook ngay khi vừa mở file lên mà không cần phải click enable lên 2 thanh màu vàng khi mở file.
Em muốn dùng code để thực hiện mà không phải vào excel option để chỉnh lại phần trust, vì file có thể gửi cho người khác sử dụng.
Mong nhận được phản hồi của các Thầy. Em cảm ơn!
Cái bạn muốn đó cũng là cái mà bọn viết vi rút muốn.
"chỉnh lại phần trust" là nguyên tắc căn bản để người ta tránh vi rút. Bi giờ nếu VBA nó có khả năng vượt qua chỗ đó thì hỏi còn gì để bảo vệ ngừoi dùng nữa.

Tôi không nói là không làm được. Nhưng cái bạn muốn đó thuộc về kỹ thuật đặt vi rút.
Cách chân thức để truyền bá files có macros là dùng "digital signature"
 
Upvote 0
Xin chào mọi người. Kính nhờ các anh chị chỉ giúp mình 1 đoạn code về tìm ngày trong dữ liệu.
Giả sử cột A chứa dữ liệu dạng Date, format dd/mm/yyyy, sắp xếp tăng dần (các giá trị có thể không liên tục, có thể có nhiều dòng có cùng giá trị).
Yêu cầu là tìm một ngày X cho trước (ví dụ ở ô C2) trong cột A và trả về kết quả là dòng đầu tiên có dữ liệu là ngày X. Nếu không tìm thấy thì trả về kết quả là dòng đầu tiên của ngày gần nhất sau ngày X.
Ví dụ như hình đính kèm nhé.
Cám ơn cả nhà.
 

File đính kèm

  • Untitled.jpg
    Untitled.jpg
    30.3 KB · Đọc: 7
Upvote 0
Xin chào mọi người. Kính nhờ các anh chị chỉ giúp mình 1 đoạn code về tìm ngày trong dữ liệu.
Giả sử cột A chứa dữ liệu dạng Date, format dd/mm/yyyy, sắp xếp tăng dần (các giá trị có thể không liên tục, có thể có nhiều dòng có cùng giá trị).
Yêu cầu là tìm một ngày X cho trước (ví dụ ở ô C2) trong cột A và trả về kết quả là dòng đầu tiên có dữ liệu là ngày X. Nếu không tìm thấy thì trả về kết quả là dòng đầu tiên của ngày gần nhất sau ngày X.
Ví dụ như hình đính kèm nhé.
Cám ơn cả nhà.
Cái này có phải là thắc mắc về code đâu.Đây là hỏi bài mà bạn.
 
Upvote 0
Chào mọi người,
E mới tìm hiểu về VBA.
Khi e làm record Macrođể thực thi một số thao tác đơn giản thì thấy VBA không chạy với sheet tên Tiếng Việt.
Có cách nào để xử lý đơn gian nhất không ạ, mong mọi người giúp e.1569864042240.png
 
Upvote 0
Chào mọi người,
E mới tìm hiểu về VBA.
Khi e làm record Macrođể thực thi một số thao tác đơn giản thì thấy VBA không chạy với sheet tên Tiếng Việt.
Có cách nào để xử lý đơn gian nhất không ạ, mong mọi người giúp e.View attachment 225920
Bạn đổi tên sheet từ dạng tiếng Việt có dấu về dạng không dấu.
 
Upvote 0
Không phải là Sheets("Nh" & ChrW(7853) & "p"").select mà là Sheets("Nh" & ChrW(7853) & "p").select

Nếu vẫn báo lỗi thì ắt là tên sheet và chuỗi "Nh" & ChrW(7853) & "p" là 2 loại unicode khác nhau - một là unicode dựng sẵn còn cái kia là unicode tổ hợp.

Mà tốt nhất nên dùng tên sheet không dấu.
 
Upvote 0
Chao các anh chị
Em có đoạn code sưu tầm trên GPE về tạo PivotTable
1570005674025.png
Ngồi ngẫm cả chiều mà chưa biết nên làm thế nào.
Khu vực khoanh đỏ là phần PivotTable được tạo trên sheet mới toanh. Em muốn PivotTable được tạo trên Sheet chỉ đinh sẵn (Chẳng hạn sheet TONGHOP) Thì sửa thế nào ạ
Em có gửi file đính kèm.
Cảm ơn các anh chị nhiều ạ
 

File đính kèm

  • FILE TH.xlsm
    188.6 KB · Đọc: 4
Upvote 0
Chao các anh chị
Em có đoạn code sưu tầm trên GPE về tạo PivotTable
View attachment 226007
Ngồi ngẫm cả chiều mà chưa biết nên làm thế nào.
Khu vực khoanh đỏ là phần PivotTable được tạo trên sheet mới toanh. Em muốn PivotTable được tạo trên Sheet chỉ đinh sẵn (Chẳng hạn sheet TONGHOP) Thì sửa thế nào ạ
Em có gửi file đính kèm.
Cảm ơn các anh chị nhiều ạ
Thử thay thành
"TONGHOP!R5C1"

Và sau đó thay tất cả ActiveSheet thành Sheets("TONGHOP")

xem nó đi đâu về đâu
 
Upvote 0
Chao các anh chị
Em có đoạn code sưu tầm trên GPE về tạo PivotTable
View attachment 226007
Ngồi ngẫm cả chiều mà chưa biết nên làm thế nào.
Khu vực khoanh đỏ là phần PivotTable được tạo trên sheet mới toanh. Em muốn PivotTable được tạo trên Sheet chỉ đinh sẵn (Chẳng hạn sheet TONGHOP) Thì sửa thế nào ạ
Em có gửi file đính kèm.
Cảm ơn các anh chị nhiều ạ
Có 1 cách là bạn thêm dòng dưới đây vào Code của bạn:
PHP:
ActiveSheet.Range("A1").CurrentRegion.Copy Sheets("TONGHOP").Range("A1")
 
Upvote 0
Web KT
Back
Top Bottom