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 bạn xem giúp lỗi như sau:
Tôi muốn copy khối A9:C13 của sheet Form sang dán ở sheet Data1 ( dán liên tục và nối tiếp)
Mã:
Sub capnhat()
    Dim Nguon1 As Range, Nguon2 As Range, Dich1 As Range, Dich2 As Range
    [COLOR=#ff0000]Set Nguon1 = Sheets("Sheet1").Range("A9:C13")[/COLOR]
    Set Nguon2 = Sheets("Sheet1").Range("A19:D28")
    Set Dich1 = Sheet2.Cells(Sheet2.[A65536].End(xlUp).Row + 1, 1)
    Set Dich2 = Sheet3.Cells(Sheet3.[A65536].End(xlUp).Row + 1, 1)
    Nguon1.Copy
    Dich1.PasteSpecial Paste:=xlPasteValues
    Dich1.Clear
    Application.CutCopyMode = False
End Sub
nhưng nó báo lỗi ở dòng tô màu đỏ
lỗi bị báo là "subscript out of range"
Nhờ anh chị hướng dẫn bỏ lỗi!cảm ơn các bạn!

Bạn muốn copy từ sheet Form thì phải là Sheets("Form") chứ sao lại là Sheets("Sheet1"). Những chỗ khác sửa tương tự.
Lưu ý: Tôi chỉ trả lời theo những gì bạn mô tả, chưa xem file.
 
Upvote 0
Các anh chị xem giúp code sau nó báo lỗi
Mã:
Sub ThuNghiem()
      
    Sheets("Data2").Range("A1").Select
    
End Sub
Nó báo lỗi "Select method of range class failed"
Xin cảm ơn!
 
Upvote 0
Các anh chị xem giúp code sau nó báo lỗi
Mã:
Sub ThuNghiem()
      
    Sheets("Data2").Range("A1").Select
    
End Sub
Nó báo lỗi "Select method of range class failed"
Xin cảm ơn!

Đang ở sheet khác sheet data thì câu lệnh trên sẽ bị lỗi
có thể sửa lại
Sheets("Data2").select
Range("A1").Select
 
Upvote 0
Chào các bạn!

Cho tôi hỏi làm sao để khi nhập vào Application.InputBox mà ký tự khi gõ tự động ẩn (hiện dấu chấm đen, hoặc dấu * ) thay vì hiển thị ký tự được nhiền thấy
Ví dụ ghi gõ ký tự là: 123 thì ô InputBox sẽ chuyển sang dấu chấm đen hoặc * khi vừa gõ xong từng ký tự

Các bạn code giúp tôi!
Xin cảm ơn!
Mã:
Sub Test()
Dim Pass
    Pass = Application.InputBox("Nhap mat khau", "Mo Khoa")
    MsgBox Pass
End Sub
hình như chức năng Application.InputBox không có chức năng đó thì phải?, cái đó chỉ có nhập trong textbox trong form thôi, mình chọn kiểu hiển thị là password
 
Upvote 0
Chào các bạn!

Cho tôi hỏi làm sao để khi nhập vào Application.InputBox mà ký tự khi gõ tự động ẩn (hiện dấu chấm đen, hoặc dấu * ) thay vì hiển thị ký tự được nhiền thấy
Ví dụ ghi gõ ký tự là: 123 thì ô InputBox sẽ chuyển sang dấu chấm đen hoặc * khi vừa gõ xong từng ký tự

Các bạn code giúp tôi!
Xin cảm ơn!
Mã:
Sub Test()
Dim Pass
    Pass = Application.InputBox("Nhap mat khau", "Mo Khoa")
    MsgBox Pass
End Sub
Thử với mấy mớ này coi sao nhé (32bit)
Mã:
Private Declare Function CallNextHookEx _
Lib "user32" ( _
ByVal hHook As Long, _
ByVal ncode As Long, _
ByVal wParam As Long, _
lParam As Any) _
As Long
 
Private Declare Function GetModuleHandle _
Lib "kernel32" _
Alias "GetModuleHandleA" ( _
ByVal lpModuleName As String) _
As Long
 
Private Declare Function SetWindowsHookEx _
Lib "user32" _
Alias "SetWindowsHookExA" ( _
ByVal idHook As Long, _
ByVal lpfn As Long, _
ByVal hmod As Long, _
ByVal dwThreadId As Long) _
As Long
 
Private Declare Function UnhookWindowsHookEx _
Lib "user32" ( _
ByVal hHook As Long) _
As Long
 
Private Declare Function SendDlgItemMessage _
Lib "user32" Alias "SendDlgItemMessageA" ( _
ByVal hDlg As Long, _
ByVal nIDDlgItem As Long, _
ByVal wMsg As Long, _
ByVal wParam As Long, _
ByVal lParam As Long) _
As Long
 
Private Declare Function GetClassName _
Lib "user32" _
Alias "GetClassNameA" ( _
ByVal hWnd As Long, _
ByVal lpClassName As String, _
ByVal nMaxCount As Long) _
As Long
 
Private Declare Function GetCurrentThreadId _
Lib "kernel32" () _
As Long
 


Private Const EM_SETPASSWORDCHAR = &HCC
Private Const WH_CBT = 5
Private Const HCBT_ACTIVATE = 5
Private Const HC_ACTION = 0
 
Private hHook As Long
 
Public Function NewProc(ByVal lngCode As Long, _
    ByVal wParam As Long, _
    ByVal lParam As Long) As Long
     
    Dim RetVal
    Dim strClassName As String, lngBuffer As Long
     
    If lngCode < HC_ACTION Then
        NewProc = CallNextHookEx(hHook, lngCode, wParam, lParam)
        Exit Function
    End If
     
    strClassName = String$(256, " ")
    lngBuffer = 255
     
    If lngCode = HCBT_ACTIVATE Then
        RetVal = GetClassName(wParam, strClassName, lngBuffer)
        If Left$(strClassName, RetVal) = "#32770" Then
            SendDlgItemMessage wParam, &H1324, EM_SETPASSWORDCHAR, Asc("*"), &H0
        End If
    End If


    CallNextHookEx hHook, lngCode, wParam, lParam
     
End Function


Public Function InputBoxDK(Prompt As String, Optional Title As String, _
    Optional Default As String, _
    Optional Xpos As Long, _
    Optional Ypos As Long, _
    Optional Helpfile As String, _
    Optional Context As Long) As String
     
    Dim lngModHwnd As Long, lngThreadID As Long
     
    On Error GoTo ExitProperly
    lngThreadID = GetCurrentThreadId
    lngModHwnd = GetModuleHandle(vbNullString)
     
    hHook = SetWindowsHookEx(WH_CBT, AddressOf NewProc, lngModHwnd, lngThreadID)
    If Xpos Then
        InputBoxDK = InputBox(Prompt, Title, Default, Xpos, Ypos, Helpfile, Context)
    Else
        InputBoxDK = InputBox(Prompt, Title, Default, , , Helpfile, Context)
    End If
     
ExitProperly:
    UnhookWindowsHookEx hHook
     
End Function
 
Sub hpkhuong()
    Dim x
     
    x = InputBoxDK("Nhap mat khau", "Mo Khoa")
    If x = "" Then End
    If x <> "hpkhuong" Then
        MsgBox "Sai mat roi!!!"
        End
    End If
     
    MsgBox "Dang nhap thanh cong", vbExclamation
     
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Chào các bạn!

Cho tôi hỏi làm sao để khi nhập vào Application.InputBox mà ký tự khi gõ tự động ẩn (hiện dấu chấm đen, hoặc dấu * ) thay vì hiển thị ký tự được nhiền thấy
Ví dụ ghi gõ ký tự là: 123 thì ô InputBox sẽ chuyển sang dấu chấm đen hoặc * khi vừa gõ xong từng ký tự

Các bạn code giúp tôi!
Xin cảm ơn!
Mã:
Sub Test()
Dim Pass
    Pass = Application.InputBox("Nhap mat khau", "Mo Khoa")
    MsgBox Pass
End Sub

Cái đó gọi là tạo khung nhập password bằng InputBox.
Chuyện chẳng phải không làm được nhưng vì ta cố dùng con dao gọt trái cây đi chặt cây cổ thụ nên sẽ chịu rất nhiều "áp lực"
Lời khuyên: Tốt nhất là đừng nên nghiên cứu mấy cái này, bởi lợi ích nó mang lại chẳng bao nhiêu mà sợ bạn tiêu hóa không nỗi (vì code điều khiển cái vụ biến ký tự thành * có khi còn dài hơn cả code chính làm việc của bạn)
Tại sao không dùng TextBox trên UserForm (hoặc trên DialogSheet) để làm việc này? Nó hỗ trợ PasswordChar đấy
 
Upvote 0
Hix em chỉ biết mỗi cái InputBox là làm như vậy.
Vậy phiền anh cho em đoạn code (ví dụ) đáp ứng được mong muốn trên .
Cho code 2 loại luôn để học hỏi (Textbox trên UForm + DialogSheet)
Cảm ơn anh!
cái đó nó có sẵn trong properties luôn rồi bạn
 
Upvote 0
Hix em chỉ biết mỗi cái InputBox là làm như vậy.
Vậy phiền anh cho em đoạn code (ví dụ) đáp ứng được mong muốn trên .
Cho code 2 loại luôn để học hỏi (Textbox trên UForm + DialogSheet)
Cảm ơn anh!

Tức là:
- Bạn cứ vẽ ra cái UserForm
- Xong lại vẽ cái TextBox trên UserForm ấy.
- Bây giờ bấm F4 rồi nhìn sang khung bên trái sẽ thấy có mục PasswordChar, gõ dấu * vào là được rồi

Trên DialogSheet cũng gần tương tự:
- Click phải lên SheetTab, chọn Insert\MS Excel 5.0 Dialog
- Chuyển sang tab Developer, chọn Insert\Text Field (Form Control)
- Click phải TextBox vừa vẽ, chọn Format Control. Chuyển sang tab Control, check mục Password Edit
Kể từ giờ, khi chạy UserForm hoặc DialogSheet, gõ gì vào TextBox nó cũng đều hiện dấu *
 
Upvote 0
DTDerror.jpg

Sub timfile()

Dim i As Long, mydir As String, ii As String
mydir = ThisWorkbook.Path & "\data"
With User.ComboBox2
.Clear
.ColumnCount = 1
.ColumnWidths = "100pt"
End With
With Application.FindFile

.LookIn = mydir
.Filename = "*.mdb"
If .Execute() > 0 Then
For i = 1 To .FindFile.Count
ii = Replace(.FindFile(i), mydir & "\", "")
User.ComboBox2.AddItem ii
Next i
User.ComboBox2.value = ii
End If
End With


End Sub

Cảm ơn bác quanghai1969 e sửa nhưng vẫn bị lỗi đoạn code đầu.
 
Lần chỉnh sửa cuối:
Upvote 0
Sub timfile()
Dim i As Long, mydir As String, ii As String
mydir = ThisWorkbook.Path & "\data"
With User.ComboBox2
.Clear
.ColumnCount = 1
.ColumnWidths = "100pt"
End With
With Application.FindFile

.LookIn = mydir
.Filename = "*.mdb"
If .Execute() > 0 Then
For i = 1 To .FindFile.Count
ii = Replace(.FindFile(i), mydir & "\", "")
User.ComboBox2.AddItem ii
Next i
User.ComboBox2.value = ii
End If
End With


End Sub

Cảm ơn bác quanghai1969 e sửa nhưng vẫn bị lỗi đoạn code đầu.

Code trật lất thì lấy đâu mà chạy! Hổng có cái vụ With Application.FindFile đâu
 
Upvote 0
Đoạn code này e chạy trên office 2003 thì được sang office 2007 thì lỗi. Sửa mãi chưa được.

DTDerror.jpg
 
Lần chỉnh sửa cuối:
Upvote 0
Cảm ơn bác, test thử trên máy Xp-32 bit thì ok rồi đó. Nhưng không chạy được trên máy 64 bit. Có anh/chị nào rảnh chỉnh giúp code trên chạy trên 64Bit giúp mình!

Cảm ơn!
Inputbox tiếng viết có dấu hay Pass Sao làm được hết có diều nó quá rắc rối thôi....làm trên DialogSheet đó rất hay mà dễ làm ... làm xong hide nó đi hết thấy Form....
 
Upvote 0
E gửi file đính kèm. Bác xem giúp em. Thanks bác trước.
http://www.mediafire.com/download/scqu0v5fphiwo6s/2003.rar
 
Lần chỉnh sửa cuối:
Upvote 0
E gửi file đính kèm. Bác xem giúp em. Thanks bác trước.
http://www.mediafire.com/download/scqu0v5fphiwo6s/2003.rar

Bạn sửa Sub Timfile thành vầy:
Mã:
Sub timfile()
  Dim i As Long, mydir As String, ii As String
 [COLOR=#ff0000] Dim item As Object, FSO As Object[/COLOR]
  mydir = ThisWorkbook.Path & "\data"
  [COLOR=#ff0000]Set FSO = CreateObject("Scripting.FileSystemObject")[/COLOR]
  With User.ComboBox2
    .Clear
    .ColumnCount = 1
    .ColumnWidths = "100pt"
  End With
  [COLOR=#ff0000]If FSO.FolderExists(mydir) Then
    For Each item In FSO.GetFolder(mydir).Files
      User.ComboBox2.AddItem item.Name
    Next
  End If[/COLOR]
End Sub
Chỗ màu đỏ là chỗ sửa lại
 
Lần chỉnh sửa cuối:
Upvote 0

File đính kèm

  • hỏi lọc dữ liệu trùng tính tổng kết quả, số lần xuất hiện2.xls
    43 KB · Đọc: 30
Upvote 0
Cái đấy gọi là Dialogsheet và cái sheet Input ấy đã bị ẩn đi rồi. Muốn hiện nó lên, bạn chép đoạn code này vào module rồi chạy.
Mã:
Sub GPE()  
Dim I
  For I = 1 To Sheets.Count
    Sheets(I).Visible = -1
  Next
End Sub

Đã biết tên cái sheet ẩn ấy là "Input" rồi sao còn For.. Next làm gì chứ
Vầy là được rồi: Sheets("Input").Visible = -1
 
Upvote 0
Web KT

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

Back
Top Bottom