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:
Thầy nào viết giúp em đoạn code nào mà xóa được dữ lieu nhập trước đó không ạ.
Trước đó có 1 đoạn code. Khi em nhập. Nó tự động nhảy ra rất nhiều dữ liệu ở các cột khác.
Nếu em nhập sai dữ liệu đầu vào. Mà em muốn xóa đi. Thì các ô được nhảy dữ liệu trước đó sẽ cũng được xóa.
 
Upvote 0
Thầy nào viết giúp em đoạn code nào mà xóa được dữ lieu nhập trước đó không ạ.
Trước đó có 1 đoạn code. Khi em nhập. Nó tự động nhảy ra rất nhiều dữ liệu ở các cột khác.
Nếu em nhập sai dữ liệu đầu vào. Mà em muốn xóa đi. Thì các ô được nhảy dữ liệu trước đó sẽ cũng được xóa.
Vậy bạn xác định lại các vùng bạn ghi thêm vào đó rồi xóa nó đi.Ghi vào được chắc xác định vị trí cũng được chứ nhỉ.
 
Upvote 0

File đính kèm

  • huong.xlsm
    37.2 KB · Đọc: 5
Upvote 0
Bây giờ bạn muốn xóa dữ liệu ở sheets nào.
Ban đầu là khi em nhập dữ liệu từ cột C11 ( sheet Form) thì các ô B11,E11,F11,G11,H,J,L,M,N11 tự động nhảy theo. Nếu giờ em xóa C11 đi thì các ô còn lại cũng tự động xóa được không ạ
 
Upvote 0
Ban đầu là khi em nhập dữ liệu từ cột C11 ( sheet Form) thì các ô B11,E11,F11,G11,H,J,L,M,N11 tự động nhảy theo. Nếu giờ em xóa C11 đi thì các ô còn lại cũng tự động xóa được không ạ
Vậy bạn xóa luôn dòng đấy đi code chi cho mệt.
 
Upvote 0
Xin chào các bạn,
Oanh Thơ(OT) có sưu tầm một câu lệnh như sau để lấy dữ liệu bằng phương pháp GetOpenFilename.

Mã:
Sub GetImportValues()
'https://stackoverflow.com/questions/22248800/vba-how-to-import-values-from-several-excel-files-selected-by-users-via-dialog
    Dim filenames, f
    Dim myMsg As String
    Dim wb As Workbook
    Dim lastrow As Long
    'Get the filename
    filenames = Application.GetOpenFilename(FileFilter:="Excel VBA files (*.xls*), *.xls*", _
                                            FilterIndex:=1, _
                                            Title:="pls select the excel files to Import", _
                                            MultiSelect:=True)
    If IsArray(filenames) Then
        myMsg = "You selected:" & vbNewLine
        'Display full path and name of the files
        For Each f In filenames
            myMsg = myMsg & f & vbNewLine
        Next f
        MsgBox myMsg
    Else
        MsgBox "No excel file was selected."
        Exit Sub
    End If

    For Each f In filenames
        Set wb = Workbooks.Open(f)

        With ThisWorkbook.Sheets("Results")
            'determine last non empty row in column A sheet "Result" to past result
            lastrow = Application.Max(3, .Cells(.Rows.Count, "A").End(xlUp).Row + 1)
            .Range("A" & lastrow).Value = wb.Sheets("Sheet1").Range("I3").Value
        End With

        wb.Close SaveChanges:=False
        Set wb = Nothing
    Next f
End Sub

-------------
Mong muốn của OT làm sao chỉ chọn được 2 tập tin muốn lấy (2 tập tin này để trong cùng một thư mục, nhưng khác với thư mục chứa tập tin chạy code "ThisWorkbook.Name")
Và mỗi tập tin được chọn sẽ đưa dữ liệu vào sheet khác nhau của tập tin chạy code "ThisWorkbook.Name".

Ví dụ:
Khi chạy code hiện cửa sổ tìm đến thư mục XYZ
lựa chọn 2 tập tin A.xls và B.xls nằm trong cùng một thư mục : XYZ
Tập tin A.xls sẽ đổ dữ liệu vào ThisWorkbook.Sheets("Results1").range("A1")
Tập tin B.xls sẽ đổ dữ liệu vào ThisWorkbook.Sheets("Results2").range("A1")

Thì code trên phải sửa sao ạ?
 
Upvote 0
Nguyễn Hoàng Oanh Thơ
Hôm trước thấy OT trả lời "Lấy dữ liệu file đang đóng", hôm nay thấy OT thắc mắc gần giống với tiêu đề đấy.
Gặp vấn đề khó phải không OT?
 
Upvote 0
Nguyễn Hoàng Oanh Thơ
Hôm trước thấy OT trả lời "Lấy dữ liệu file đang đóng", hôm nay thấy OT thắc mắc gần giống với tiêu đề đấy.
Gặp vấn đề khó phải không OT?
Dạ vâng, vấn đề làm sao để lựa chọn được 2 tập tin và mỗi tập tin lựa chọn sẽ trả dữ liệu về mỗi sheet khác nhau, như OT đã nêu ạ:
Ví dụ:
Khi chạy code hiện cửa sổ tìm đến thư mục XYZ
lựa chọn 2 tập tin A.xls và B.xls nằm trong cùng một thư mục : XYZ
Tập tin A.xls sẽ đổ dữ liệu vào ThisWorkbook.Sheets("Results1").range("A1")
Tập tin B.xls sẽ đổ dữ liệu vào ThisWorkbook.Sheets("Results2").range("A1")
Nhờ @HeSanbi và các bạn hỗ trợ ạ
 
Upvote 0
Upvote 0
Đoạn này chọn bằng tay hay VBA làm vậy OT. Nếu VBA làm thì không cần hiện cửa sổ
@HeSanbi
Đoạn này chọn tay ạ, sử dụng GetOpenFilename bởi vì đường dẫn và tên file tên sheet thường xuyên phải sửa tay ạ. Nên dùng code để xử lý thì không được.
 
Upvote 0
@HeSanbi
Đoạn này chọn tay ạ, sử dụng GetOpenFilename bởi vì đường dẫn và tên file tên sheet thường xuyên phải sửa tay ạ. Nên dùng code để xử lý thì không được.
Có nhiều cách để làm việc này:
1. Đổi tên sheets(1) ở file A.xls thành "Result1" Move sang ThisWorkbook
2. Xác định vùng sheets(1) chứa dữ liệu ở file A.xls copy sang Sheets("Result1") ThisWorkbook:
+ Nếu dữ liệu liền mảng thì dùng CurrentRegion sẽ hợp lý
+ Nếu dữ liệu rời rạc thì Copy cả sheet
Tham khảo thêm cách Select File / Folder ở đây nhé OT: Link
Với code dưới OT thêm bẫy lỗi nếu Hủy không chọn File
Mã:
Sub Test()
Dim Arr
  Arr =  FileOpen("D:\XYZ",  ""  ,"*.xls; *.xlsx; *.xlsm")
'dbPrint Arr
End Sub

Function FileOpen(initialFilename As String, _
  Optional sDesc As String = "Excel (*.xls)", _
  Optional sFilter As String = "*.xls") As Variant
  On Error GoTo Ends
  Dim Arr(), k, it
  With Application.FileDialog(msoFileDialogOpen)
    .ButtonName = "&Open"
    .initialFilename = initialFilename
    .Filters.Clear
    .Filters.Add sDesc, sFilter, 1
    .Title = "File Open"
    .AllowMultiSelect = True
    If .show = -1 Then
      For Each it In .SelectedItems
        ReDim Preserve Arr(k)
        Arr(k) = it
        k = k + 1
      Next it
    End If
    FileOpen = Arr
  End With
  Exit Function
Ends:
  FileOpen = Array()
End Function


If f Like "*\[A].xls" Then
'..........
Arr = wb.sheets(1).[A1].CurrentRegion.value
ThisWorkbook.Sheets("Result1").[A1].Resize(Ubound(Arr),Ubound(Arr, 2)).Value = Arr
'.........
End if
If f Like "*\[B].xls" Then
'..........
Arr = wb.sheets(1).[A1].CurrentRegion.value
ThisWorkbook.Sheets("Result2").[A1].Resize(Ubound(Arr),Ubound(Arr, 2)).Value = Arr
'.........
End if
 
Lần chỉnh sửa cuối:
Upvote 0
Cảm ơn @HeSanbi nhiều ạ,
Bạn có thể chỉ giúp OT cách sử dụng GetOpenFilename như bài 1797 được không ạ?
OT chưa tìm hiểu sự khác nhau giữa GetOpenFilename và FileDialog nhưng cảm thấy thích sử dụng GetOpenFilename hơn ạ.
 
Upvote 0
cách sử dụng GetOpenFilename như bài 1797
Tức là cái khó nhất với OT là GetOpenFilename
GetOpenFilename - Được định nghĩa là Hàm - "Thượng cổ" (Excel)
FileDialog
là Một Object - hướng đối tượng - "Hiện đại" (Office) , gồm thuộc tính của GetOpenFilename và nhiều hơn
OT vào đây nếu cảm thấy muốn hiểu sâu hơn: Microsoft Docs

Và OT thử nói ước muốn rõ ràng hơn tí đi
 
Upvote 0
@HeSanbi
Đoạn này chọn tay ạ, sử dụng GetOpenFilename bởi vì đường dẫn và tên file tên sheet thường xuyên phải sửa tay ạ. Nên dùng code để xử lý thì không được.
Nếu bắt buộc phải chọn 2 tập tin thì nên cho phương án xử lý khi: người dùng chọn 1, hoặc người dùng chọn 3, 4, 5, ... tập tin.

1. Lặp lại, nhưng không quá 10 lần (20 lần), cho tới tận khi chọn đúng 2 tập tin?
2. Không lặp lại mà kết thúc cuộc chơi?
3. Nếu chọn > 2 thì cũng không lặp lại mà chỉ lấy 2 tập tin đầu, hoặc 2 tập tin cuối, hoặc tung đồng xu rút thăm 2 tập tin?
 
Upvote 0
Nếu bắt buộc phải chọn 2 tập tin thì nên cho phương án xử lý khi: người dùng chọn 1, hoặc người dùng chọn 3, 4, 5, ... tập tin.

1. Lặp lại, nhưng không quá 10 lần (20 lần), cho tới tận khi chọn đúng 2 tập tin?
2. Không lặp lại mà kết thúc cuộc chơi?
3. Nếu chọn > 2 thì cũng không lặp lại mà chỉ lấy 2 tập tin đầu, hoặc 2 tập tin cuối, hoặc tung đồng xu rút thăm 2 tập tin?

Con chào bác Siwtom,
Dạ bác xem giúp con trường hợp lấy dữ liệu theo phương án 1 ạ:
1. Lặp lại, nhưng không quá 3 lần, cho tới tận khi chọn đúng 2 tập tin?
Con cảm ơn bác.
 
Upvote 0
Con chào bác Siwtom,
Dạ bác xem giúp con trường hợp lấy dữ liệu theo phương án 1 ạ:
1. Lặp lại, nhưng không quá 3 lần, cho tới tận khi chọn đúng 2 tập tin?
Con cảm ơn bác.
Mã:
Sub GetImportValues()
Const startdir = "D:\XYZ"
Const allowcount = 3
Const filescount = 2
Dim filenames
Dim repeat As Long
    ChDrive Left(startdir, 1)
    ChDir startdir
    repeat = 1
    Do While repeat <= allowcount
        filenames = Application.GetOpenFilename("Excel files (*.xls; *.xlsx; *.xlsm; *.xlsb),*.xls; *.xlsx; *.xlsm; *.xlsb", , _
                                            "H" & ChrW(227) & "y ch" & ChrW(7885) & "n 2 t" & ChrW(7853) & "p tin", , True)
        If IsArray(filenames) Then
            If UBound(filenames) = filescount Then Exit Do
        End If
        repeat = repeat + 1
    Loop
    MsgBox repeat
    If repeat > allowcount Then Exit Sub
'    o cho nay trong filenames co 2 tap tin. Tiep theo lam gi thi lam
End Sub
 
Upvote 0
Mã:
Sub GetImportValues()
Const startdir = "D:\XYZ"
Const allowcount = 3
Const filescount = 2
Dim filenames
Dim repeat As Long
    ChDrive Left(startdir, 1)
    ChDir startdir
    repeat = 1
    Do While repeat <= allowcount
        filenames = Application.GetOpenFilename("Excel files (*.xls; *.xlsx; *.xlsm; *.xlsb),*.xls; *.xlsx; *.xlsm; *.xlsb", , _
                                            "H" & ChrW(227) & "y ch" & ChrW(7885) & "n 2 t" & ChrW(7853) & "p tin", , True)
        If IsArray(filenames) Then
            If UBound(filenames) = filescount Then Exit Do
        End If
        repeat = repeat + 1
    Loop
    MsgBox repeat
    If repeat > allowcount Then Exit Sub
'    o cho nay trong filenames co 2 tap tin. Tiep theo lam gi thi lam
End Sub

Cảm ơn bác Siwtom,
Con muốn đưa dữ liệu từ 2 file lấy được trong filenames:
Lấy dữ liệu sheets(1) file vị trí 1 (file chọn trước) đưa vào sheet1 của file Laydulieu.xlsm
Lấy dữ liệu sheets(1) file vị trí 2 (file chọn sau) đưa vào sheet2 của file Laydulieu.xlsm
Laydulieu.xlsm là file chứa code trên "sub GetImportValues" ạ.
Con chưa biết cách làm tiếp bước này, bác chỉ giúp con ạ.
Bài đã được tự động gộp:

Tức là cái khó nhất với OT là GetOpenFilename
GetOpenFilename - Được định nghĩa là Hàm - "Thượng cổ" (Excel)
FileDialog là Một Object - hướng đối tượng - "Hiện đại" (Office) , gồm thuộc tính của GetOpenFilename và nhiều hơn
OT vào đây nếu cảm thấy muốn hiểu sâu hơn: Microsoft Docs
Và OT thử nói ước muốn rõ ràng hơn tí đi
Cảm ơn @HeSanbi,
Thì ra GetOpenFilename là đồ cổ, OT lạc hậu thật..hihi
Nhờ bạn mà OT lại biết thêm một thông tin mới.
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT
Back
Top Bottom