Những câu hỏi về code, xin giải thích các code, đề nghị các bạn gửi vào đây

Liên hệ QC
Status
Không mở trả lời sau này.

ST-Lu!

Love Wingchun
Tham gia
19/8/08
Bài viết
730
Được thích
546
Nghề nghiệp
Xích lô một thời
Kể từ hôm nay, tất cả những câu hỏi nhờ giải thích dùm một đoạn code, hay là hỏi những vấn đề linh tinh gì liên quan đến cách viết code, đề nghị các bạn gửi chung vào đây.

Những đề tài mới với tiêu đề: "Nhờ giải thích dùm đoạn code", mà không nói rõ là code gì, code dùng để làm gì, sẽ bị xóa.

BQT

----------------------------------------------------------------------------------------------------------------


Em xin được hỏi 2 đoạn code sau có tương đương nhau ?

Cells(Cells.Rows.Count, 1).End(xlUp).Row có tương đương với [A65000].End(xlup).row

Cám ơn các anh chỉ giáo
 
Chỉnh sửa lần cuối bởi điều hành viên:
mình đã làm được rồi.
cám ơn các bạn nhiều.
chúc các bạn luôn may mắn và hạnh phúc
 
Lần chỉnh sửa cuối:
Upvote 0
vì các dòng của mình lên đến hơn 40000 dòng nên nó bão lỗi như vậy.
Mình tesr thư nếu dưới 32000 dòng thì không bị lỗi trên
còn nếu trên 33000 dòng thì bị lỗi trên
mong các bạn giúp mình
 
Lần chỉnh sửa cuối:
Upvote 0
Chắc bạn nên đổi lại kiểu khai báo bién sẽ OK thôi

Thay vì
Mã:
Dim i As Integer
  Dim k As Integer

Nên là
PHP:
Dim i As Long
  Dim k As Long
 
Upvote 0
cám ơn các bạn, mình làm được rồi.
Các bạn cho mình hỏi làm thế nào mình gửi file lên để các bạn xem hộ mình.
Mình tìm mãi mà không ra.
Thanks các bạn nhiều.
 
Lần chỉnh sửa cuối:
Upvote 0
Hình như bài của bạn dùng Dictionary được đấy, mình đã thử làm với Dictionary nhưng vì không rõ yêu cầu của bài nên chưa được. Bạn gởi bài lên đi, trích một ít ra (cho nhẹ) rồi gởi theo hướng dẫn.
 

File đính kèm

  • Các bước cơ bản để gởi bài lên diễn đàn.rar
    810.7 KB · Đọc: 35
Upvote 0
Bạn ơi! mình down về không mở được bạn ah.bạn kiểm tra giúp mình xem. thanks
 
Upvote 0
bạn ơi. mình đown về mà không giải nén dc.
Bạn thử kiểm tra lại đc ko
Mình rất muốn down bài lên để nhờ các bạn check hộ
Cám ơn các bạn nhiều.
ah. Nhân tiện các bạn cho mình hỏi.
Giả sử mình làm một file (có đoạn code). Bây giờ mình muốn làm thế nào để mình mở bất kỳ file excel mới (tất nhiên file đó chỉ chạy đựoc trên máy của mình) mình cũng chạy được (tất nhiên là không copy code. (tóm lại ý của mình là làm thế nào để không phải copy code mà khi mở file excel mới .Các bạn làm ơn chỉnh cho mình nhé
 
Lần chỉnh sửa cuối:
Upvote 0
bạn ơi. mình đown về mà không giải nén dc.
Bạn thử kiểm tra lại đc ko
Mình rất muốn down bài lên để nhờ các bạn check hộ
Cám ơn các bạn nhiều.
ah. Nhân tiện các bạn cho mình hỏi.
Giả sử mình làm một file (có đoạn code). Bây giờ mình muốn làm thế nào để mình mở bất kỳ file excel mới (tất nhiên file đó chỉ chạy đựoc trên máy của mình) mình cũng chạy được (tất nhiên là không copy code. (tóm lại ý của mình là làm thế nào để không phải copy code mà khi mở file excel mới .Các bạn làm ơn chỉnh cho mình nhé
- Bạn nói không mở được mình nghĩ là do mình đặt dấu tiếng Việt nên không giải nén được, nhưng mình thử tải lại và giải nén được mà, Bạn thử đặt lại tên file không dấu xem có giải nén được không? (File này là do một người gởi qua mail hỏi mình nên sẵn tiện gởi cho Bạn).
- Muốn dùng code được cho file mới bạn hãy lưu file với định dạng .xla (Bạn hãy tìm hiểu về Add ins có trên diễn đàn).
 
Lần chỉnh sửa cuối:
Upvote 0
dù mình chưa làm nhưng cũng cám ơn bạn rất nhiều.
mình sẽ gửi bài lên diễn đàn và nhờ các bạn kiểm tra nhé.
Chúc các bạn một ngày may mắn.
mình sẽ down về và làm theo hướng dẫn
 
Upvote 0
Nhờ các bạn diễn nôm những dòng lệnh (màu đỏ) trong code này. Thanks!
Mã:
Function GetListFile(ByVal Folder As String, ByVal Search As String, ByVal InSub As Boolean)
    Dim sComm As String, tmpFile
    On Error GoTo ExitSub
    If Right(Folder, 1) <> "\" Then Folder = Folder & ""
    Folder = """" & Folder & """"
    With CreateObject("Scripting.FileSystemObject")
     [COLOR="red"]  tmpFile = .GetTempName
       sComm = "DIR " & Folder & "*" & Search & "* /ON /B /A-D " & IIf(InSub, "/S", " ") & " >" & tmpFile
       CreateObject("Wscript.Shell").Run "cmd /c " & sComm, 0, True
       GetListFile = Split(.OpenTextFile(tmpFile, 1).ReadAll, vbCrLf)[/COLOR]
    End With
    [COLOR="red"]Kill tmpFile[/COLOR]
ExitSub:
End Function
 
Upvote 0
Nhờ các bạn diễn nôm những dòng lệnh (màu đỏ) trong code này. Thanks!
Mã:
Function GetListFile(ByVal Folder As String, ByVal Search As String, ByVal InSub As Boolean)
    Dim sComm As String, tmpFile
    On Error GoTo ExitSub
    If Right(Folder, 1) <> "\" Then Folder = Folder & ""
    Folder = """" & Folder & """"
    With CreateObject("Scripting.FileSystemObject")
     [COLOR=red]  tmpFile = .GetTempName
       sComm = "DIR " & Folder & "*" & Search & "* /ON /B /A-D " & IIf(InSub, "/S", " ") & " >" & tmpFile
       CreateObject("Wscript.Shell").Run "cmd /c " & sComm, 0, True
       GetListFile = Split(.OpenTextFile(tmpFile, 1).ReadAll, vbCrLf)[/COLOR]
    End With
    [COLOR=red]Kill tmpFile[/COLOR]
ExitSub:
End Function
tmpFile = .GetTempName ---> Tạo 1 file TXT tạm mà ta không cần biết nó nằm ở đâu, tên gì (mỗi lần chạy code là mỗi lần nó có tên khác nhau, dạng ngẫu nhiên) ---> Điều này có cái hay là ta không cần xác định đường dẫn, tên file... Vì biết đâu sẽ bị trùng với 1 file có sẳn trên máy tính

sComm = "DIR " & Folder & "*" & Search & "* /ON /B /A-D " & IIf(InSub, "/S", " ") & " >" & tmpFile ---> Đây chỉ là câu lệnh DOS mà thôi (hôm trước em có gữi 1 file, bên trong file, ở sheet2 có giải thích rõ và lệnh DIR này rồi)... Kết quả cuối cùng của lệnh trên sẽ được lưu vào tmpFile

CreateObject("Wscript.Shell").Run "cmd /c " & sComm, 0, True ---> Dùng VBA để chạy lệnh DOS ở trên... Giá trị True chổ này khá quan trọng, nó sẽ chờ cho lệnh thực thi xong thì mới làm tiếp câu lệnh bên dưới (Nếu không, tmpFile chưa kịp hình thành thì ta sẽ chẳng có gì để lấy cả)

GetListFile = Split(.OpenTextFile(tmpFile, 1).ReadAll, vbCrLf) ---> Mở file TXT, đọc toàn bộ nội dung, đưa vào mảng bằng cách dùng hàm Split. cắt theo từ khóa xuống dòng

Kill tmpFile ---> Làm xong mọi thứ, xóa luôn tmpFile
---------------------------------------
Nói chung, code ở trên là em biến đổi sau khi thắc mắc tại topic này:
http://www.giaiphapexcel.com/forum/showthread.php?37051-L%C3%A0m-sao-%E1%BA%A9n-c%E1%BB%ADa-s%E1%BB%95-Command-Prompt-khi-th%E1%BB%B1c-thi-l%E1%BB%87nh-DOS-trong-VBA
Anh mở đường link trên, đọc kỹ từng bài sẽ thấy mọi thứ đều có trong đó, chẳng hạn:
- Làm sao để chạy lệnh DOS trong VBA
- Làm sao để ẩn cửa sổ DOS khi lệnh này chạy trong VBA
- Làm sao để lưu kết quả của lệnh DOS trong 1 file text
- Làm sao để chắc chắn rằng file text lưu kết quả của DOS đã được hình thành (để không phải "bắt" hụt)
- vân vân...
---------------------------------------
Em nói thêm: nếu anh cảm thấy DOS có thể làm được điều anh cần thì hãy dùng nó, vì DOS luôn cho tốc độ "khủng" nhất ---> Với code anh đưa ở trên, em tin chắc không có code nào khác có thể qua mặt được về việc lấy tên file trong thư mục
 
Lần chỉnh sửa cuối:
Upvote 0
Mình chạy thủ tục này:
PHP:
Sub Enumerate_Refs()
    For Each ref In Application.VBE.ActiveVBProject.References
        Debug.Print ref.Name & " " & ref.GUID
    Next ref
End Sub
Sao có máy chạy được, có máy thì báo lỗi ngay dòng For Each ref In Application.VBE.ActiveVBProject.References
(các máy đều dùng WinXP và Office2003)
Thông báo lỗi nh] sau:
Run-time error ‘1004’:

Method 'VBE' of object '_Application' failed

Nhờ các Bạn chỉ cho nguyên nhân. Thanks
 
Lần chỉnh sửa cuối:
Upvote 0
Mình chạy thủ tục này:
PHP:
Sub Enumerate_Refs()
    For Each ref In Application.VBE.ActiveVBProject.References
        Debug.Print ref.Name & " " & ref.GUID
    Next ref
End Sub
Sao có máy chạy được, có máy thì báo lỗi ngay dòng For Each ref In Application.VBE.ActiveVBProject.References
(các máy đều dùng WinXP và Office2003)
Thông báo lỗi nh] sau:
Nhờ các Bạn chỉ cho nguyên nhân. Thanks
Có khi nào anh chưa chỉnh giống cái này không:
http://www.giaiphapexcel.com/forum/showthread.php?43681-Tạo-và-xóa-UserForm&p=285195#post285195
 
Upvote 0

Rất chính xác, mình cũng vừa tìm ra (vì đã quên), vậy tốt nhất là thêm vào như thế này cho khỏi quên (hoặc khi đưa file cho người khác dùng):
PHP:
Sub Enumerate_Refs() 
    On Error Resume Next
    For Each ref In Application.VBE.ActiveVBProject.References
        Debug.Print ref.Name & " " & ref.GUID
        '------------------------
    Next ref
 
    Dim vbp As Object    ' as VBProject
    If Val(Application.Version) >= 10 Then
        Set vbp = ActiveWorkbook.VBProject
        If Err.Number <> 0 Then
            MsgBox "Your security settings do not allow this procedure to run." _
                   & vbCrLf & vbCrLf & "To change your security setting:" _
                   & vbCrLf & vbCrLf & " 1. Select Tools - Macro - Security." & vbCrLf _
                   & " 2. Click the 'Trusted Sources' tab" & vbCrLf _
                   & " 3. Place a checkmark next to 'Trust access to Visual Basic Project.'", _
                   vbCritical
            Exit Sub
        End If
    End If
End Sub
 
Upvote 0
Rất chính xác, mình cũng vừa tìm ra (vì đã quên), vậy tốt nhất là thêm vào như thế này cho khỏi quên (hoặc khi đưa file cho người khác dùng):
PHP:
Sub Enumerate_Refs() 
    On Error Resume Next
    For Each ref In Application.VBE.ActiveVBProject.References
        Debug.Print ref.Name & " " & ref.GUID
        '------------------------
    Next ref
 
    Dim vbp As Object    ' as VBProject
    If Val(Application.Version) >= 10 Then
        Set vbp = ActiveWorkbook.VBProject
        If Err.Number <> 0 Then
            MsgBox "Your security settings do not allow this procedure to run." _
                   & vbCrLf & vbCrLf & "To change your security setting:" _
                   & vbCrLf & vbCrLf & " 1. Select Tools - Macro - Security." & vbCrLf _
                   & " 2. Click the 'Trusted Sources' tab" & vbCrLf _
                   & " 3. Place a checkmark next to 'Trust access to Visual Basic Project.'", _
                   vbCritical
            Exit Sub
        End If
    End If
End Sub
Trời má ơi! Không ngờ anh thanhlanh giờ toàn nghiên cứu các vụ "độc chiêu"
Không ngại xấu hổ mà khai thiệt rằng: Code anh ghi ở trên (cái vụ ref.Name & " " & ref.GUID) từ trước đến giờ em... CHƯA TỪNG BIẾT ĐẾN luôn
Ẹc... Ẹc.. Quá ngầu luôn
Nhân tiện anh bật mí luôn đi: Anh dùng code trên để làm gì vậy? (hổng lẽ chỉ để xem có bao nhiều mục được check trong References thôi sao?)
 
Upvote 0
Trời má ơi! Không ngờ anh thanhlanh giờ toàn nghiên cứu các vụ "độc chiêu"
Không ngại xấu hổ mà khai thiệt rằng: Code anh ghi ở trên (cái vụ ref.Name & " " & ref.GUID) từ trước đến giờ em... CHƯA TỪNG BIẾT ĐẾN luôn
Ẹc... Ẹc.. Quá ngầu luôn
Nhân tiện anh bật mí luôn đi: Anh dùng code trên để làm gì vậy? (hổng lẽ chỉ để xem có bao nhiều mục được check trong References thôi sao?)

Là mình đang nghiên cứu về thư viện liên kết ngoài và biên dịch thành dll, kiểm tra xem thư viện được check, nếu chưa check thì code tự động check luôn đó mà.

Nếu muốn kiểm tra các References kỹ hơn thì như sau:
PHP:
Sub Get_References_In_This_Project()
    Dim refIsBroken As String
    For Each ref In Application.VBE.ActiveVBProject.References
        refIsBroken = "OK"
        refName = ref.Name
        refDesc = ref.Description
        refPath = ref.FullPath
        refGUID = ref.GUID
        If ref.IsBroken = True Then
            refIsBroken = "***Missing/Broken***"
        Else
            refIsBroken = "OK"
        End If
        Debug.Print refName & ":  " & refDesc & " - " & refGUID & " - " & refPath & " -> " & refIsBroken
    Next ref
End Sub
(Mình chỉ là sưu tầm được thôi chớ cao siêu gì đâu. Khà khà ...)
 
Upvote 0
Code bị lỗi

Nhờ các bạn kiểm tra và sửa lại cho mình cái Code liên kết dữ liệu này với,mình đã sử dụng được một thời
rồi,hôm qua thế nào lại bị lỗi,các bạn giúp mình nhé,Cảm ơn các bạn.
Code:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim LastRow As Long
LastRow = KM.Cells.Find(What:="*", After:=[A1], _
SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
'Sheet3.Range("BY1:BY69" & LastRow).Value = KM.Range("G2:G70" & LastRow).Value
'Sheet6.Range("A13:E80" & LastRow).Value = KM.Range("A3:E70" & LastRow).Value
'Sheet6.Range("L13:L80" & LastRow).Value = KM.Range("F3:F70" & LastRow).Value
End Sub
 
Upvote 0
Nó báo lỗi gì vậy bạn

Có thể chụp màn hình hay chép dòng báo lỗi lên để cộng đồng cùng chiêm ngưỡng, được không?

Thân ái & chúc ngon giấc!
 
Upvote 0
Nhờ các bạn kiểm tra và sửa lại cho mình cái Code liên kết dữ liệu này với,mình đã sử dụng được một thời
rồi,hôm qua thế nào lại bị lỗi,các bạn giúp mình nhé,Cảm ơn các bạn.
Code:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim LastRow As Long
LastRow = KM.Cells.Find(What:="*", After:=[A1], _
SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
'Sheet3.Range("BY1:BY69" & LastRow).Value = KM.Range("G2:G70" & LastRow).Value
'Sheet6.Range("A13:E80" & LastRow).Value = KM.Range("A3:E70" & LastRow).Value
'Sheet6.Range("L13:L80" & LastRow).Value = KM.Range("F3:F70" & LastRow).Value
End Sub
Code chỉ có 1 dòng. Vậy chắc là lỗi xảy ra do sheet KM không có dữ liệu.
Còn mấy dòng có dấu nháy (') đầu tiên. Không biết bạn có sử dụng không. Ai lại làm kỳ cục như thế.
 
Upvote 0
Các cậu ơi, không biết có ai ghi giúp mình 1 đoạn code ví dụ như
Có 2 cột A1 và B1
Côt A1 để diền số và B1 để hiện thị thời gian tại lúc điền or thay đổi số ở cột A1 ( thời gian này chỉ và củng chỉ thay đổi nếu A1 thay đổi)
đại loại như thế này

=If(A1>0),now"")
 
Upvote 0
Status
Không mở trả lời sau này.
Web KT

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

Back
Top Bottom