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ác cao nhân cho em hỏi, giờ em có 1 vấn đề ntn
- em có 1 bảng (K9:X35), và đang cần điền dữ liệu bằng cách tham chiếu giá trị từ 1 dãy khác. Bảng K9:X35 sẽ được điền lần lượt từ trên xuống dưới (9 đến 35), rồi từ cột trái sang cột phải (K đến X), và giá trị sẽ nằm từ cột AN đến cột PA của dãy kia. Em đang định dùng 3 vòng lặp for cho i(dòng), j(cột) và k(cột tham chiếu), đang có code như sau
"
Dim i As Integer, j As Integer, k As Integer
For k = 40 To 417
For j = 11 To 24
For i = 9 To 35
Sheets("Laisuat").Cells(i, j).Value = Application.WorksheetFunction.VLookup(Ngay, Dulieu, k, False)
Next i
Next j
Next k"
*bảng K9:X35 ở sheet Laisuat, dãy tham chiếu là Dulieu.
Nếu thế này thì khi chạy macro tất cả các ô cần điền giá trị sẽ trả về giá trị ở cột cuối cùng của bảng tham chiếu (cột PA), giống nhau hết.
Có anh chị nào giúp em tìm ra code đúng với, xin cảm ơn nhiều ạ.
 
Upvote 0
Các cao nhân cho em hỏi, giờ em có 1 vấn đề ntn
- em có 1 bảng (K9:X35), và đang cần điền dữ liệu bằng cách tham chiếu giá trị từ 1 dãy khác. Bảng K9:X35 sẽ được điền lần lượt từ trên xuống dưới (9 đến 35), rồi từ cột trái sang cột phải (K đến X), và giá trị sẽ nằm từ cột AN đến cột PA của dãy kia. Em đang định dùng 3 vòng lặp for cho i(dòng), j(cột) và k(cột tham chiếu), đang có code như sau
"
Dim i As Integer, j As Integer, k As Integer
For k = 40 To 417
For j = 11 To 24
For i = 9 To 35
Sheets("Laisuat").Cells(i, j).Value = Application.WorksheetFunction.VLookup(Ngay, Dulieu, k, False)
Next i
Next j
Next k"
*bảng K9:X35 ở sheet Laisuat, dãy tham chiếu là Dulieu.
Nếu thế này thì khi chạy macro tất cả các ô cần điền giá trị sẽ trả về giá trị ở cột cuối cùng của bảng tham chiếu (cột PA), giống nhau hết.
Có anh chị nào giúp em tìm ra code đúng với, xin cảm ơn nhiều ạ.

Bạn không đưa File, mình đọc thật khó hình dung.
 
Upvote 0
Xin nhờ mọi người giúp giùm,

Mình có 1 sub như trên diễn đàn hướng dẫn:

Function PicFit(ByVal PictureFileName As String, Optional ByVal TargetCell As Range) As String
On Error Resume Next
If TargetCell Is Nothing Then Set TargetCell = Application.ThisCell
TargetCell.Worksheet.Shapes(TargetCell.Address).Delete
If CreateObject("Scripting.FileSystemObject").fileExists(PictureFileName) Then
TargetCell.Select
With TargetCell.Worksheet.Pictures.Insert(PictureFileName)
.Name = TargetCell.Address
.ShapeRange.LockAspectRatio = msoFalse
.Left = TargetCell.Left
.Top = TargetCell.Top
.Width = TargetCell.Width
.Height = TargetCell.Height
End With
End If
End Function

Sử dụng để add picture vào 1 worksheet rất ổn, nhưng khi send file cho máy khác thì lại không có link nên ko thấy hình. Có cách nào để add vĩnh viễn, sau khi mở ra nó không tự tìm link nữa hay không?

Cảm ơn mọi người giúp đỡ.
 
Upvote 0
Em có đoạn code gộp nhiều file sang 1 file mới chạy trên office 2007 không được. Folder "OK" chạy ổn nhưng folder "Khong duoc" chạy bị lỗi

Em muốn chèn nguồn của dữ liệu truy xuất, file Vidu (STT, dòng và sheet của các file 1,2,3 và 4,5,6 vào cột A trước các hàng gộp dữ liệu có được không). Ví dụ cột A dòng 2 thể hiện: C:\Documents and Settings\Admin\Desktop\OK\4.xls\Ngày1\row2


Sub MergeFilesExcel()
Dim path As String, ThisWB As String, lngFilecounter As Long
Dim wbDest As Workbook, shtDest As Worksheet, ws As Worksheet
Dim Filename As String, Wkb As Workbook
Dim CopyRng As Range, Dest As Range
Dim RowofCopySheet As Integer
RowofCopySheet = 2
ThisWB = ActiveWorkbook.Name
'Dien duong dan folder chua cac tap tin excel can gom lai.
'Nhu ban thay toi tien duong dan thu muc chua cai file excel cua toi.
path = "D:\Test\Khong duoc"
Application.EnableEvents = False
Application.ScreenUpdating = False
Set shtDest = ActiveWorkbook.Sheets(1)
Filename = Dir(path & "\*.xls", vbNormal)
If Len(Filename) = 0 Then Exit Sub
Do Until Filename = vbNullString
If Not Filename = ThisWB Then
Set Wkb = Workbooks.Open(Filename:=path & "\" & Filename)
Set CopyRng = Wkb.Sheets(1).Range(Cells(RowofCopySheet, 1), Cells(ActiveSheet.UsedRange.Rows.Count, ActiveSheet.UsedRange.Columns.Count))
Set Dest = shtDest.Range("A" & shtDest.UsedRange.SpecialCells(xlCellTypeLastCell).Row + 1)
CopyRng.Copy Dest
Wkb.Close False
End If
Filename = Dir()
Loop
Range("A1").Select
Application.EnableEvents = True
Application.ScreenUpdating = True
MsgBox "Ket Thuc!"
End Sub
 

File đính kèm

Upvote 0
Chào anh chị GPE,
em muốn xóa từ sheets(8) trở về sau, nhưng đoạn code bên dưới khi chạy không xóa như yêu cầu,
anh chị xem giúp em code này chưa đúng ở đoạn nhé. em cám ơn

PHP:
Sub xoasheets()
Dim j As Integer
Application.DisplayAlerts = False
    For j = 8 To Sheets.Count
        Sheets(j).Delete
    Next j
Application.DisplayAlerts = True
End Sub
 
Upvote 0
Chào anh chị GPE,
em muốn xóa từ sheets(8) trở về sau, nhưng đoạn code bên dưới khi chạy không xóa như yêu cầu,
anh chị xem giúp em code này chưa đúng ở đoạn nhé. em cám ơn

PHP:
Sub xoasheets()
Dim j As Integer
Application.DisplayAlerts = False
    For j = 8 To Sheets.Count
        Sheets(j).Delete
    Next j
Application.DisplayAlerts = True
End Sub
Thử sửa Sheets(j). Delete thành Sheets(8).Delete xem sao
 
Upvote 0
Chào anh chị GPE,
em muốn xóa từ sheets(8) trở về sau, nhưng đoạn code bên dưới khi chạy không xóa như yêu cầu,
anh chị xem giúp em code này chưa đúng ở đoạn nhé. em cám ơn

PHP:
Sub xoasheets()
Dim j As Integer
Application.DisplayAlerts = False
    For j = 8 To Sheets.Count
        Sheets(j).Delete
    Next j
Application.DisplayAlerts = True
End Sub

PHP:
Sub XoaSheet()
    Dim Ws As Worksheet
    Set Ws = Worksheets(8)
    For Each Ws In Worksheets
        If Sheets.Count < 9 Then Exit For
        Ws.Delete
    Next Ws
End Sub
- Mình sẽ viết thế này, nhưng không biết sheets thứ 8 của bạn là 8 sheet, hay tên của sheet.
- Những mình nghĩ ràng buộc điều kiện loại trừ Sheet sẽ an toàn hơn.
 
Upvote 0
PHP:
Sub XoaSheet()
    Dim Ws As Worksheet
    Set Ws = Worksheets(8)
    For Each Ws In Worksheets
        If Sheets.Count < 9 Then Exit For
        Ws.Delete
    Next Ws
End Sub
- Mình sẽ viết thế này, nhưng không biết sheets thứ 8 của bạn là 8 sheet, hay tên của sheet.
- Những mình nghĩ ràng buộc điều kiện loại trừ Sheet sẽ an toàn hơn.
Chào bạn
sheets8 là thứ tự của sheets, bạn xem lại giúp mình nha
upload_2017-7-19_10-43-53.png
 
Upvote 0
Chào anh chị GPE,
em muốn xóa từ sheets(8) trở về sau, nhưng đoạn code bên dưới khi chạy không xóa như yêu cầu,
anh chị xem giúp em code này chưa đúng ở đoạn nhé. em cám ơn

PHP:
Sub xoasheets()
Dim j As Integer
Application.DisplayAlerts = False
    For j = 8 To Sheets.Count
        Sheets(j).Delete
    Next j
Application.DisplayAlerts = True
End Sub

Code này chỉ xoá sheet thứ 8, 10, ... thôi; sheets 9, 11,... sẽ bị bỏ sót.
Lý do: sau khi xoá 8 thì 9 sẽ trở thành 8, vòng lặp tới số 9 thực ra là xoá cái trước đó mang số 10, và cứ tiếp tục theo chiều hướng này mà lấy 1 sót 1.
Muốn xoá kể ừ 8 thì phải xoá ngược từ count trở về. Hoặc dùng vòng lặp while

For j=sheets.count to 8 step -1
sheets(j).delete
next j

Do while sheets.count >= 8
sheets(sheets.count).delete
loop

Chú thích quan trọng: làm việc với tập (collection) khác với mảng (array). Xóa 1 phần tử trong mảng không ảnh hưởng đến các phần tử còn lại. Trong khi đó, xóa 1 phần tử trong collection thì các phần tử sau nó sẽ tự dồn thứ tự lên.
 
Lần chỉnh sửa cuối:
Upvote 0
PHP:
Sub XoaSheet()
    Dim Ws As Worksheet
    Set Ws = Worksheets(8)
    For Each Ws In Worksheets
        If Sheets.Count < 9 Then Exit For
        Ws.Delete
    Next Ws
End Sub
- Mình sẽ viết thế này, nhưng không biết sheets thứ 8 của bạn là 8 sheet, hay tên của sheet.
- Những mình nghĩ ràng buộc điều kiện loại trừ Sheet sẽ an toàn hơn.

Code này làm ngược lại với yêu cầu chủ thớt. Tức là nó sẽ xoá tất cả các sheets, chừa lại 8 cái cuối cùng.
 
Upvote 0
Code này chỉ xoá sheet thứ 8, 10, ... thôi; sheets 9, 11,... sẽ bị bỏ sót.
Lý do: sau khi xoá 8 thì 9 sẽ trở thành 8, vòng lặp tới số 9 thực ra là xoá cái trước đó mang số 10, và cứ tiếp tục theo chiều hướng này mà lấy 1 sót 1.
Muốn xoá kể ừ 8 thì phải xoá ngược từ count trở về. Hoặc dùng vòng lặp while

For j=sheets.count to 8 step -1
sheets(j).delete
next j

Do while sheets.count >= 8
sheets(sheets.count).delete
loop

Chú thích quan trọng: làm việc với tập (collection) khác với mảng (array). Xóa 1 phần tử trong mảng không ảnh hưởng đến các phần tử còn lại. Trong khi đó, xóa 1 phần tử trong collection thì các phần tử sau nó sẽ tự dồn thứ tự lên.
Đây là cách người ta vẫn thường làm (vòng lập ngược từ dưới lên)... nhưng tôi xem code của tác giả thì thấy cách sửa nhanh gọn nhất là sửa Sheets(j) thành Sheets(8) cũng xong! (toàn bộ code để nguyên)
Nguyên tắc vẫn là: Xóa sheets(8) xong thì Sheets(9) lập tức trở thành Sheets(8)... ta lại cứ tiếp tục xóa Sheets(8) đến khi xong thì thôi
Vẫn về đến La Mã!
 
Upvote 0
Chào anh chị GPE,
Em có đoạn code muốn copy giá trị sheets như bên dưới, khi chạy báo lỗi dòng
PHP:
Sheets(j).Range("C1:S500").Select
anh chị kiểm tra giúp em nhé. em cám ơn ạ
PHP:
Sub copygiatri()
Dim j As Integer
Application.DisplayAlerts = False
    For j = 8 To Sheets.Count
        Sheets(j).Range("C1:S500").Select
        Selection.copy
    Selection.PasteSpecial Paste:=xlPasteValues
            Application.CutCopyMode = False
    Next j
Application.DisplayAlerts = True
End Sub
 
Upvote 0
Báo lỗi ra sao?
(tôi có thể đoán lỗi; nhưng bạn là người tập viết code thì cũng nên tập chú ý đến cách VBA báo lỗi)

Gợi ý: có một số trường hợp, thâu macro xong rồi chỉ việc bỏ vào vòng lặp là xong. Nhưng cũng có một số trường hợp code đó chỉ hoạt động được 1 lần (điển hình là chỉ trên 1 sheet). Muốn làm nhiều lần thì phải thâu macro trong lúc làm 2 hay 3 sheets.
 
Upvote 0
Báo lỗi ra sao?
(tôi có thể đoán lỗi; nhưng bạn là người tập viết code thì cũng nên tập chú ý đến cách VBA báo lỗi)

Gợi ý: có một số trường hợp, thâu macro xong rồi chỉ việc bỏ vào vòng lặp là xong. Nhưng cũng có một số trường hợp code đó chỉ hoạt động được 1 lần (điển hình là chỉ trên 1 sheet). Muốn làm nhiều lần thì phải thâu macro trong lúc làm 2 hay 3 sheets.
Em gửi hình lỗi
upload_2017-7-20_9-14-57.png
record macro nhiều sheets em sẽ chú ý.
 

File đính kèm

  • upload_2017-7-20_9-14-55.png
    upload_2017-7-20_9-14-55.png
    6.8 KB · Đọc: 1
Upvote 0
Web KT

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

Back
Top Bottom