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:
Cơ mà mình cho chế độ không phân biệt viết hoa thường đc ko, ví dụ như dưới đây là 1:
217246
Không hiểu từ đâu có dữ liệu như hình. Code của tôi coi như đã không phân biệt chữ Hoa - Thường.
 
Upvote 0
Em chào anh chị ạ,
Nhờ anh chị giúp em 1 code gửi mail tự động vừa đính kèm file vừa gửi một biểu đồ cụ thể trong file đó ở sheet 1 trong cùng một Email để trình bày biểu đồ ở phần body của mail được không ạ. Em cám ơn mọi người nhiều.
 

File đính kèm

Upvote 0
Upvote 0
Bạn xem code này đúng không nhé. [ICODE] [CODE]Sub tinhtonkhosach() Dim arr, arr1, dic As Object, i As Long, j As Long, lr As Long, a As Long Set dic = CreateObject("scripting.dictionary") With Sheets("sach") lr = .Range("D" & Rows.Count).End(xlUp).Row If lr < 6 Then Exit Sub arr = .Range("D6:D" & lr).Value ReDim arr1(1 To UBound(arr, 1), 1 To 2) For i = 1 To UBound(arr, 1) If Not dic.exists(arr(i, 1)) Then a = a + 1 dic.Add arr(i, 1), a arr1(a, 1) = arr(i, 1) arr1(a, 2) = 1 Else arr1(dic.Item(arr(i, 1)), 2) = arr1(dic.Item(arr(i, 1)), 2) + 1 End If Next i End With With Sheets("sachmuon") lr = .Range("G" & Rows.Count).End(xlUp).Row arr = .Range("G6:K" & lr).Value For i = 1 To UBound(arr, 1) If UCase(arr(i, 5)) = "MUON" Then If dic.exists(arr(i, 1)) Then arr1(dic.Item(arr(i, 1)), 2) = arr1(dic.Item(arr(i, 1)), 2) - 1 End If End If Next i End With With Sheets("tonkho") lr = .Range("G" & Rows.Count).End(xlUp).Row If lr > 5 Then .Range("B5:C" & lr).ClearContents If a Then .Range("B5:C5").Resize(a).Value = arr1 End With End Sub [/CODE]
[/ICODE]
Trong code này snow đã trừ phần mượn ở sheet Sachmuon chưa ạ? tại mình thấy nó ko trừ cho 1 quyển đã mượn ở sheet Sachmuon.
Cụ thể, sheet mượn sách, cột đã trả còn trống chưa ghi ngày trả thì có nghĩa là sách chưa trả, phải trừ, còn nếu không trống (đã ghi ngày trả) thì mình ko trừ vì đã thu hồi vào kho rồi.
 
Upvote 0
Trong code này snow đã trừ phần mượn ở sheet Sachmuon chưa ạ? tại mình thấy nó ko trừ cho 1 quyển đã mượn ở sheet Sachmuon.
Cụ thể, sheet mượn sách, cột đã trả còn trống chưa ghi ngày trả thì có nghĩa là sách chưa trả, phải trừ, còn nếu không trống (đã ghi ngày trả) thì mình ko trừ vì đã thu hồi vào kho rồi.
Bạn ấy đọc theo code của bạn trong bài #2090 có dòng này
PHP:
.Cells(i, 3) = Application.WorksheetFunction.CountIfs(Sheet3.Range("D1:D65000"), .Cells(i, 2)) - Application.WorksheetFunction.CountIfs(Sheet6.Range("G1:G65000"), .Cells(i, 2), Sheet6.Range("K1:K65000"), "Muon")
Vì thế muốn kết quả đúng phải nhập "Muon" vào cột "Ngày trả" sheet "Sachmuon"
 
Upvote 0
Bạn ấy đọc theo code của bạn trong bài #2090 có dòng này
PHP:
.Cells(i, 3) = Application.WorksheetFunction.CountIfs(Sheet3.Range("D1:D65000"), .Cells(i, 2)) - Application.WorksheetFunction.CountIfs(Sheet6.Range("G1:G65000"), .Cells(i, 2), Sheet6.Range("K1:K65000"), "Muon")
Vì thế muốn kết quả đúng phải nhập "Muon" vào cột "Ngày trả" sheet "Sachmuon"
AH AH, đã hiểu và đã sửa lại code chạy đúng rồi, đa tạ Ba Tê vs snow rất nhiều!
 
Upvote 0
TỰ ĐỘNG BACKUP FILE EXCEL!

Xin chào cả nhà, mình viết một phần mềm, nhưng mình thận trọng và muốn TỰ ĐỘNG sao lưu file Excel đó ra một file mới (Save As) theo thời gian định sẵn (ví dụ vào lúc 10h sáng chẳn hạn), với tên là ngày_tháng_năm, lưu vào một thư mục do mình quy định. Để khi bị lỗi hoặc có vấn đề gì mình còn lấy lại được.

Mình đã tìm nát google và trên diễn đàn rồi mà chưa thấy bài nào nói về vấn đề này, mong anh em hướng dẫn! Đa tạ!
 
Upvote 0
TỰ ĐỘNG BACKUP FILE EXCEL!

Xin chào cả nhà, mình viết một phần mềm, nhưng mình thận trọng và muốn TỰ ĐỘNG sao lưu file Excel đó ra một file mới (Save As) theo thời gian định sẵn (ví dụ vào lúc 10h sáng chẳn hạn), với tên là ngày_tháng_năm, lưu vào một thư mục do mình quy định. Để khi bị lỗi hoặc có vấn đề gì mình còn lấy lại được.

Mình đã tìm nát google và trên diễn đàn rồi mà chưa thấy bài nào nói về vấn đề này, mong anh em hướng dẫn! Đa tạ!
Xin góp ý cho bài viết:

Xin góp ý cho bài viết:
1> Đã ở mức tìm tòi nát google rùi thì trình vba chác cũng vượt qua đẳng cấp: coppy và paste, và biết thế nào la module...Ghi và chạy một macro.
2> Tham khảo link này : https://www.extendoffice.com/vi/documents/excel/4409-excel-repeat-macro-every-minute.html >>> tạo thời gian chạy.
3> muốn có code lưu thì ghi lại một đoạn mã macro cho việc save as và đổi tên, nơi lưu>>>>sửa code và kết hợp code là OK
Mong bạn làm được
[/QUOTE]
 
Upvote 0
TỰ ĐỘNG BACKUP FILE EXCEL!

Xin chào cả nhà, mình viết một phần mềm, nhưng mình thận trọng và muốn TỰ ĐỘNG sao lưu file Excel đó ra một file mới (Save As) theo thời gian định sẵn (ví dụ vào lúc 10h sáng chẳn hạn), với tên là ngày_tháng_năm, lưu vào một thư mục do mình quy định. Để khi bị lỗi hoặc có vấn đề gì mình còn lấy lại được.

Mình đã tìm nát google và trên diễn đàn rồi mà chưa thấy bài nào nói về vấn đề này, mong anh em hướng dẫn! Đa tạ!

Bạn xem bài này, cũng tương tự như yêu cầu của bạn, chỉ khác là của bạn sẽ dễ hơn vì chỉ cần Save As. Dùng Task Schedule có sẳn trong Windows kết hơp VBScript.

Link: https://www.giaiphapexcel.com/diend...g-mở-file-khi-có-nhắc-nhở.141245/#post-909100

- Cách làm này thì bạn không cần phải mở file Excel cần lưu để chạy macro Save as bên trong nó.
- Copy đoạn code dứoi vào NotePad và lưu thành file .bat (đặt tên bất kỳ, Vd: saoluu.bat)
- Dùng Task Schedule để chạy file .bat này.

Mã:
Set objExcel = CreateObject("Excel.Application")
Set objWorkbook = objExcel.Workbooks.Open("D:\Test\Book1.xlsm")
objExcel.Application.Visible = False
NgayThang = Year(now) & Right("0" & Month(Now), 2) & Right("0" & Day(now), 2)

objExcel.Activeworkbook.SaveAs "D:\Test\Backup\Book1_" & NgayThang & ".xlsm"
objExcel.DisplayAlerts = False
objExcel.Activeworkbook.Close
objExcel.Quit
 
Lần chỉnh sửa cuối:
Upvote 0
Đây là công việc của Windows, đi Gú gồ Excel VBA thì lùng nát cũng chả ra.
Dùng TaskSchedule
1. VBScript:
dùng FileSystemObject, hàm CopyFile để copy file và nhấn thêm ngày tháng vào cuối.
2. Dùng Shell Script, lệnh:
copy C:\PATH\filename.ext C:\PATH\filename-%DATE%.ext
(đại khái vậy, có thể do định dạng date trong hệ thóng mà phải thay đổi một chút)
3. Dùng PowerShell, gợi ý thôi chứ nếu bạn đã phải hỏi câu này thì không nên dùng PS.
 
Upvote 0
Bạn xem bài này, cũng tương tự như yêu cầu của bạn, chỉ khác là của bạn sẽ dễ hơn vì chỉ cần Save As. Dùng Task Schedule có sẳn trong Windows kết hơp VBScript.

Link: https://www.giaiphapexcel.com/diend...g-mở-file-khi-có-nhắc-nhở.141245/#post-909100

- Cách làm này thì bạn không cần phải mở file Excel cần lưu để chạy macro Save as bên trong nó.
- Copy đoạn code dứoi vào NotePad và lưu thành file .bat (đặt tên bất kỳ, Vd: saoluu.bat)
- Dùng Task Schedule để chạy file .bat này.

Mã:
Set objExcel = CreateObject("Excel.Application")
Set objWorkbook = objExcel.Workbooks.Open("D:\Test\Book1.xlsm")
objExcel.Application.Visible = False
NgayThang = Year(now) & Right("0" & Month(Now), 2) & Right("0" & Day(now), 2)

objExcel.Activeworkbook.SaveAs "D:\Test\Backup\Book1_" & NgayThang & ".xlsm"
objExcel.DisplayAlerts = False
objExcel.Activeworkbook.Close
objExcel.Quit
Mình áp dụng cho file trong máy của mình nhưng ko hiểu sao khi chạy file nó ko sao lưu, ko biết sai chỗ nào, bạn xem giúp mình

217710
 
Upvote 0
Mình áp dụng cho file trong máy của mình nhưng ko hiểu sao khi chạy file nó ko sao lưu, ko biết sai chỗ nào, bạn xem giúp mình

Lỗi tại tôi, tôi quên thêm cái khai báo WScript.Shell
Làm theo cái gợi ý của anh Vetmini cho nhanh, khỏi mở file Excel rồi SaveAs cho mất công :) .
Bạn copy đoạn code dưới đây rồi lưu thành file "saoluu.vbs":

Mã:
Dim FSO
Dim strSourcePath, strBackupPath
Dim NgayThang

NgayThang = Year(now) & Right("0" & Month(Now), 2) & Right("0" & Day(now), 2)
strSourcePath="C:\SampleData.xlsx"
strBackupPath="C:\Temp\SampleData_" & NgayThang & ".xlsx"

Set FSO = CreateObject("Scripting.FileSystemObject")
FSO.CopyFile strSourcePath, strBackupPath
Set FSO = Nothing
 
Upvote 0
Lỗi tại tôi, tôi quên thêm cái khai báo WScript.Shell
Làm theo cái gợi ý của anh Vetmini cho nhanh, khỏi mở file Excel rồi SaveAs cho mất công :) .
Bạn copy đoạn code dưới đây rồi lưu thành file "saoluu.vbs":

Mã:
Dim FSO
Dim strSourcePath, strBackupPath
Dim NgayThang

NgayThang = Year(now) & Right("0" & Month(Now), 2) & Right("0" & Day(now), 2)
strSourcePath="C:\SampleData.xlsx"
strBackupPath="C:\Temp\SampleData_" & NgayThang & ".xlsx"

Set FSO = CreateObject("Scripting.FileSystemObject")
FSO.CopyFile strSourcePath, strBackupPath
Set FSO = Nothing
Cảm ơn bạn rất nhiều, mình đã làm được! May quá!
 
Upvote 0
Lỗi tại tôi, tôi quên thêm cái khai báo WScript.Shell
Làm theo cái gợi ý của anh Vetmini cho nhanh, khỏi mở file Excel rồi SaveAs cho mất công :) .
Bạn copy đoạn code dưới đây rồi lưu thành file "saoluu.vbs":

Mã:
Dim FSO
Dim strSourcePath, strBackupPath
Dim NgayThang

NgayThang = Year(now) & Right("0" & Month(Now), 2) & Right("0" & Day(now), 2)
strSourcePath="C:\SampleData.xlsx"
strBackupPath="C:\Temp\SampleData_" & NgayThang & ".xlsx"

Set FSO = CreateObject("Scripting.FileSystemObject")
FSO.CopyFile strSourcePath, strBackupPath
Set FSO = Nothing
Sao không dùng file Batch cho nhanh gọn
 
Upvote 0
có anh nào giúp em lập trình cái này trong VBA mới
Em lấy giá trị lớn nhất của cột A gán giá trị vào ô B2
Em cảm ơn ah
 
Upvote 0
Web KT

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

Back
Top Bottom