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:
Nếu bạn thích, bạn có thể dùng tinh năng Sort của Excel, để ghi lại Macro.
Mình dùng record macro nhưng khi bỏ ................vào thì phát sinh lỗi nên mình không sử sụng
PHP:
For i = 2 To 20
        If Sheets("Pickticket").Range("A" & i).Value <> Empty Then
            Sheets("Pickticket").Range("B" & i).copy
            Sheets("DN").Range("E6").PasteSpecial Paste:=xlPasteValues
            Application.CutCopyMode = False
            Dim lastRow As Long
    With Sheets("DN")
        lastRow = .Range("A10").Value
        .PageSetup.PrintArea = "C1:S" & lastRow
.............................
    End With
    With Sheets("DN").PageSetup
        .PrintTitleRows = "$10:$10"
    End With
        Sheets("DN").copy after:=Sheets("DN")
        End If
    Next i
 
Upvote 0
Mình dùng record macro nhưng khi bỏ ................vào thì phát sinh lỗi nên mình không sử sụng
Cứ ghi macro cái thao tác sort đi đã. Làm gì mà đã ghép mấy bài vô rồi.
Không dùng cái dòng nhiều chấm (......) đó, xóa nó đi vì nó đâu là code trong VBA (thêm dấu nháy đơn vào đầu dòng).

'-----
Tình hình hơi căng, chắc phải học lý thuyết trước thôi hoặc tìm người kèm.
 
Upvote 0
Xóa nội dung vì không phù hợp topic
 
Lần chỉnh sửa cuối:
Upvote 0
Đây là toàn bộ code hiện tại mình có, bạn xem có đúng và có thể rút gọn giúp mình không !
Giờ có 2 phương án:
1- Nếu tiếp tục ở box này (Giải đáp thắc mắc...) thì chỉ gửi cái khúc sort lên trước (kèm thêm file cho mọi người dễ xem hơn thì càng tốt).
2- Lập một topic mới, nêu toàn bộ yêu cầu.
 
Upvote 0
Giờ có 2 phương án:
1- Nếu tiếp tục ở box này (Giải đáp thắc mắc...) thì chỉ gửi cái khúc sort lên trước (kèm thêm file cho mọi người dễ xem hơn thì càng tốt).
2- Lập một topic mới, nêu toàn bộ yêu cầu.
mình xin lỗi, mình quên đây là topic giải đáp thắc mắc.
Các Mod xóa giúp mình những bài không liên quan topic này nhé. 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 ạ.
 
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

  • Khong duoc.rar
    270.7 KB · Đọc: 3
  • Ok.rar
    268 KB · Đọc: 2
  • Vidu.xlsx
    10.5 KB · Đọc: 2
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
Web KT
Back
Top Bottom