Chuyên đề giải đáp những thắc mắc về code VBA (2 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

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:
Em có đoạn code mọi người xem có rút ngắn gọn hơn được không ạ?
Mã:
Dim oSelFormulas As Range
    Sheet5.Select
        Cells.Locked = False
        Set oSelFormulas = Cells.SpecialCells(xlCellTypeFormulas)
        oSelFormulas.Locked = True
        Sheet5.Protect "123123", True, True, True, True
    Sheet10.Select
        Cells.Locked = False
        Set oSelFormulas = Cells.SpecialCells(xlCellTypeFormulas)
        oSelFormulas.Locked = True
        Sheet10.Protect "123123", True, True, True, True
    Sheet12.Select
        Cells.Locked = False
        Set oSelFormulas = Cells.SpecialCells(xlCellTypeFormulas)
        oSelFormulas.Locked = True
        Sheet12.Protect "123123", True, True, True, True
    Sheet13.Select
        Cells.Locked = False
        Set oSelFormulas = Cells.SpecialCells(xlCellTypeFormulas)
        oSelFormulas.Locked = True
        Sheet13.Protect "123123", True, True, True, True
    Sheet6.Select
        Cells.Locked = False
        Set oSelFormulas = Cells.SpecialCells(xlCellTypeFormulas)
        oSelFormulas.Locked = True
        Sheet6.Protect "123123", True, True, True, True
Có ai xem giúp em bài này với ạ.
Thân!
 
Upvote 0
Em có đoạn code mọi người xem có rút ngắn gọn hơn được không ạ?
Mã:
Dim oSelFormulas As Range
    Sheet5.Select
        Cells.Locked = False
        Set oSelFormulas = Cells.SpecialCells(xlCellTypeFormulas)
        oSelFormulas.Locked = True
        Sheet5.Protect "123123", True, True, True, True
    Sheet10.Select
        Cells.Locked = False
        Set oSelFormulas = Cells.SpecialCells(xlCellTypeFormulas)
        oSelFormulas.Locked = True
        Sheet10.Protect "123123", True, True, True, True
    Sheet12.Select
        Cells.Locked = False
        Set oSelFormulas = Cells.SpecialCells(xlCellTypeFormulas)
        oSelFormulas.Locked = True
        Sheet12.Protect "123123", True, True, True, True
    Sheet13.Select
        Cells.Locked = False
        Set oSelFormulas = Cells.SpecialCells(xlCellTypeFormulas)
        oSelFormulas.Locked = True
        Sheet13.Protect "123123", True, True, True, True
    Sheet6.Select
        Cells.Locked = False
        Set oSelFormulas = Cells.SpecialCells(xlCellTypeFormulas)
        oSelFormulas.Locked = True
        Sheet6.Protect "123123", True, True, True, True

Rút ngắn chi vậy?

Mã:
Dim vSh as Variant
for each vSh in array(Sheet5.name, Sheet10.name, Sheet12.name, Sheet13.name, Sheet6.name)
        Sheets(vSh).Select
        Cells.Locked = False
        Set oSelFormulas = Cells.SpecialCells(xlCellTypeFormulas)
        oSelFormulas.Locked = True
        Sheets(vSh).Protect "123123", True, True, True, True
next vSh
 
Upvote 0
Rút ngắn trước hết là để dễ nhìn hơn, thứ 2 là dài quá thì cũng ngại khi đọc lại code Bác VetMini à. Cảm ơn Bác đã giúp đỡ! Chúc bác một ngày tốt lành.
Thêm một ý nữa là ở trên bác có để vSh dạng Variant, nếu bây giờ em khai báo nó ở dạng vSh as Worksheet có được không, và trong vòng for phải chỉnh như thế nào ở chỗ "in array(...) để nó hiểu được. Cảm ơn bác nhiều.
Thân!
 
Lần chỉnh sửa cuối:
Upvote 0
Nhờ mọi người Giải thích code này giúp em:
Mã:
[COLOR=#0000BB][FONT=monospace]With Sheet1[/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]
     [/FONT][/COLOR][COLOR=#007700][FONT=monospace].[/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]Parent[/FONT][/COLOR][COLOR=#007700][FONT=monospace].[/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]Protect 123
End With[/FONT][/COLOR]

.parent ở đoạn code trên có mục đích gì đấy ạ, em thử seach gu gồ rồi mà chưa thấy???
 
Lần chỉnh sửa cuối:
Upvote 0
Nhờ mọi người Giải thích code này giúp em:
Mã:
[COLOR=#0000BB][FONT=monospace]With Sheet1[/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]
     [/FONT][/COLOR][COLOR=#007700][FONT=monospace].[/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]Parent[/FONT][/COLOR][COLOR=#007700][FONT=monospace].[/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]Protect 123
End With[/FONT][/COLOR]

.parent ở đoạn code trên có mục đích gì đấy ạ, em thử seach gu gồ rồi mà chưa thấy???
Ví dụ A là cha của B. Khi ta nói B.parent là ta đang nói đến A
 
Upvote 0
Parent theo mình thì nên hiểu là đấng sinh thành; Cũng có nghĩa nói mẹ cũng đúng!; Khì, khì, . . . .

Đã lâu quá không thấy bài của chàng này! Xin chào nha!

Đấng sinh thành của 1 trang tính không fải chúng ta, người sở hữu file; mà là WorkSheets

Bạn có thể dùng câu lệnh sau:

MsgBox .Parent.Name

ngay sau câu lệnh đó để được thêm thông tin bổ ích.
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Rút ngắn trước hết là để dễ nhìn hơn, thứ 2 là dài quá thì cũng ngại khi đọc lại code ...

Tôi rút ngắn là vì các đoạn code ây lặp lại nhiều lần. Chứ dễ nhìn hơn thì chưa chắc. Và đọc lại code có ngại hay không là do có chú thích kỹ càng hay không, chứ độ dài không quan trọng

...
để vSh dạng Variant, nếu bây giờ em khai báo nó ở dạng vSh as Worksheet có được không, và trong vòng for phải chỉnh như thế nào ở chỗ "in array(...) để nó hiểu được.

1. For Each luôn luôn đi với variant. Không có kiểu gì nữa hết. For each là lệnh duyệt phần tử của một tổ hợp (collection). Nó không phải là lệnh duyệt đếm kiểu for i = ...

2. Array chỉ làm một hàm tạo một mảng từ danh sách. Đối với VBA, array là một dạng collection nên có thể duyệt được bằng for each. Muốn dùng worksheet:
Dim vSh as Variant
for each vSh in array(Sheet5, Sheet10, Sheet12, Sheet13, Sheet6)
vSh.Select
Cells.Locked = False
Set oSelFormulas = Cells.SpecialCells(xlCellTypeFormulas)
oSelFormulas.Locked = True
vSh.Protect "123123", True, True, True, True
next vSh

Có lý do tại sao tôi dùng name thay vì worksheet trực tiêp. Nhưng giải thích dài dòng lắm.
 
Lần chỉnh sửa cuối:
Upvote 0
Cảm ơn bác QuangHai
@HYen17:
Đã lâu quá không thấy bài của chàng này! Xin chào nha!
Em chào bác. Lúc đầu hỏi theo kiểu không biết gì thì cứ đưa lên hỏi, biết được một ít thì vừa tự mày mò vừa hỏi để biết thêm nhiều nữa, chả thế mà con mắt em giờ nó cứ lờ đờ... Bác yên tâm là em còn nguyên cả một trang A4 câu hỏi mà em tự đặt ra mà chưa có lời giải thỏa mãn. Lâu lâu có mấy bác động viên lại cũng thấy được giải tỏa. ;;;;;;;;;;;
Chúc các bác happy trong công việc nha.
Thân!
P/s: em bỏ cái .parent ra thì nó vẫn protect được bình thường. nó khác nhau ở chỗ nào?
 
Lần chỉnh sửa cuối:
Upvote 0
Chào tất cả mọi người.
PHP:
Public Sub FilterData(ByVal Str As String)
 Dim r As Long, n As Long, matchRows() As Long, ftData As Variant


    UserForm1.ComboBox1.List = Array()
    LoadDT
    Str = TV(Str)
    If Str <> "" Then
        If IsArray(realDT) Then
            For r = 1 To UBound(realDT) Step 1
                If InStr(fakeDT(r), Str) > 0 Or InStr(realDT(r, 1), Str) > 0 Then
                    n = n + 1
                    ReDim Preserve matchRows(1 To n)
                    matchRows(n) = r
                End If
            Next
            
            If n > 0 Then
                ReDim ftData(1 To n, 1 To 2)
                For r = 1 To n Step 1
                    ftData(r, 1) = realDT(matchRows(r), 1)
                    ftData(r, 2) = realDT(matchRows(r), 2)
                Next
                UserForm1.ComboBox1.List = ftData
            End If
        End If
    End If
End Sub
Trong đoạn trên thì có đoạn
PHP:
ReDim Preserve matchRows(1 To n)
matchRows(n) = r
em không hiểu, nhờ mọi người chỉ giúp.
Nếu cần tải file ở #2 topic http://www.giaiphapexcel.com/forum/showthread.php?105218-Lọc-tìm-trên-Form&p=653301#post653301.
Em xin cảm ơn.
 
Lần chỉnh sửa cuối:
Upvote 0
DTDerror.jpg

Nhờ các Bác xem hộ đoạn code này. file chay trên excel 2003 thì ok khi chuyen sang excel 2007 thì báo loi vay/
 
Upvote 0
Chào các anh chị!
Em đang tập record macro, em muốn tô màu hết cho toàn bộ bảng tính (sheet "PH") chỉ trừ ô B2, sau khi record em có sửa code lại, nhưng sau khi sửa code thì nó báo lỗi và không chạy đúng theo như yêu cầu
Nhờ các anh chị chỉ chỗ sai và chỉnh lại code . Em cảm ơn
Mã:
Sub Macro4()
Dim Sh1 As Worksheet
    Set Sh1 = Sheets("PH")
    With Sh1
             .Interior.ColorIndex = 15
    End With
    Range("B2").Interior.ColorIndex = xlNone
End Sub
 
Upvote 0
Thêm 1 mệnh đề nữa là được:
PHP:
Sub Macro4()
Dim Sh1 As Worksheet
    Set Sh1 = Sheets("PH")
    With Sh1
        .UsedRange.Interior.ColorIndex = 35     '<=|'
    End With
    Range("B2").Interior.ColorIndex = xlNone
End Sub
 
Upvote 0
Mở khóa & bỏ tô màu theo điều kiện

Các anh chị giúp đỡ code cho trường hợp sau vì em không thể record macro được
em có sheet PH, sheet này đang bị khóa (pass là 123) và tô màu xám.Em muốn các trường hợp sau:


1/Em muốn khi chọn Validation ở ô B2 là "PhieuChi" thì code sẽ mở khóa và không tô màu cho các ô C2,D2, E5, A20 (các ô còn lại vẫn bị khóa và tô màu xám)

2/Em muốn khi chọn Validation ở ô B2 là "PhieuThu" thì code sẽ mở khóa và không tô màu cho các ô C2,D2, E7, A19
Em cảm ơn anh chị.
 

File đính kèm

Upvote 0
Anh chị giúp em câu lệnh sau
Câu lệnh đúng là
Mã:
 If .[B2].Value = "PhieuChi" Then
Em thêm và sửa
Mã:
If .[B2].Value = "PhieuChi" [B]Or "PhieuXuat"[/B] Then
Thì bị báo lỗi, cho em hỏi cách khắc phục lỗi
 
Upvote 0
[ThongBao]Anh chị giúp em câu lệnh sau
. . . . .
Em thêm và sửa
Mã:
If .[B2].Value = "PhieuChi" [B]Or "PhieuXuat" = .[B2].Value[/B] Then
Thì là cách khắc phục lỗi[/Thongbao]
 
Upvote 0
Code báo lỗi

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!
 

File đính kèm

Upvote 0
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

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
thầy ndu96081631 cho em hỏi thêm, em vẫn không tìm được chỗ nào có lệnh ẩn sheet mà kín vậy, click phải tên sheet không có unhide, của sổ VBAproject cũng không thấy có sheet hiện lên, cám ơn thầy
 
Upvote 0
em vẫn không tìm được chỗ nào có lệnh ẩn sheet mà kín vậy, click phải tên sheet không có unhide, của sổ VBAproject cũng không thấy có sheet hiện lên, cám ơn thầy
Ẩn bằng code luôn đó bạn. Ví dụ như file đó thì ẩn thế này: Sheets("Input").Visible = 2
 
Lần chỉnh sửa cuối:
Upvote 0
thầy ndu96081631 cho em hỏi thêm, em vẫn không tìm được chỗ nào có lệnh ẩn sheet mà kín vậy, click phải tên sheet không có unhide, của sổ VBAproject cũng không thấy có sheet hiện lên, cám ơn thầy

Có phải bạn tìm chỗ này?
Tại cửa sổ MS Excel, bạn nhấn tổ hợp phím Alt + F11. Tại cửa sổ Microsoft Visual Basic for Applications... hiện ra, bạn làm tiếp như hình dưới.

visible.jpg
 
Upvote 0
Hihi. Em biết chứ người hỏi đâu có biết đâu anh.

Code VBA không password, vào trong đó sẽ thấy ngay mà
Mã:
Sub ShowInput()
  With [COLOR=#ff0000]DialogSheets("Input")[/COLOR]
    [COLOR=#ff0000].Show[/COLOR]
    .EditBoxes("Input1").Text = ""
  End With
End Sub
(còn nếu không biết tí gì về VBA thì... không có gì để bàn nữa)
-----------------------------------
Có phải bạn tìm chỗ này?
Tại cửa sổ MS Excel, bạn nhấn tổ hợp phím Alt + F11. Tại cửa sổ Microsoft Visual Basic for Applications... hiện ra, bạn làm tiếp như hình dưới.

View attachment 145172

Trật lất! Bởi các sheet thuộc anh em nhà Macro4DialogSheet nó sẽ không cho bạn thấy dễ dàng thế đâu... Vậy nên việc dùng nó đễ viết virus cũng tỏ ra khá... nguy hiễm
(bạn cứ lấy file ở bài 242, vào cửa sổ VBA xem có thấy gì không?)
 
Upvote 0
Code VBA không password, vào trong đó sẽ thấy ngay mà
Mã:
Sub ShowInput()
  With [COLOR=#ff0000]DialogSheets("Input")[/COLOR]
    [COLOR=#ff0000].Show[/COLOR]
    .EditBoxes("Input1").Text = ""
  End With
End Sub
(còn nếu không biết tí gì về VBA thì... không có gì để bàn nữa)
-----------------------------------
(bạn cứ lấy file ở bài 242, vào cửa sổ VBA xem có thấy gì không?)
- em cũng biết tí về VBA, nhưng theo em tham khảo bài này của thầy http://www.giaiphapexcel.com/forum/showthread.php?31515-Tạo-Form-bằng-DialogSheet
thì code .EditBoxes("Input1").Text = "" là để gán cho cái input bằng rỗng thôi mà, đâu phải để ẩn sheet đó nhỉ, mong thầy nói rõ hơn, vì kiến thức nông cạn nhưng em muốn hiểu rõ vấn đề hơn
 
Upvote 0
Thông báo địa chỉ ờ

Em có câu lệnh
Mã:
eR = .[A50000].End(xlUp).Row + 1
em muống dùng " MsgBox eR" để nó thông báo đang ở địa chỉ nào? thì em fải sửa MsgBox như thế nào?
 
Upvote 0
Em có câu lệnh
Mã:
eR = .[A50000].End(xlUp).Row + 1
em muống dùng " MsgBox eR" để nó thông báo đang ở địa chỉ nào? thì em fải sửa MsgBox như thế nào?
Thử như thế này xem:
Mã:
Sub abc()
 Dim er
     er = Range("A" & Rows.Count).End(xlUp).Row + 1
       MsgBox "A" & er
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Thử như thế này xem:
Mã:
Sub abc()
 Dim er
     er = Range("A" & Rows.Count).End(xlUp).Row [COLOR=#ff0000][B]+ 1[/B][/COLOR]
       MsgBox "A" & er
End Sub
Cảm ơn bạn!
Các bạn cho tôi hỏi thêm
Bây giờ muốn thay +1 thành 1 hằng số bất kỳ, hằng số này nằm ở ô F2 (ô màu vàng) thì
Mã:
er = Range("A" & Rows.Count).End(xlUp).Row [COLOR=#FF0000][B]+ 1[/B][/COLOR]
sẽ viết lại như thế nào?
xin cảm ơn các bạn
 

File đính kèm

Upvote 0
- em cũng biết tí về VBA, nhưng theo em tham khảo bài này của thầy http://www.giaiphapexcel.com/forum/showthread.php?31515-Tạo-Form-bằng-DialogSheet
thì code .EditBoxes("Input1").Text = "" là để gán cho cái input bằng rỗng thôi mà, đâu phải để ẩn sheet đó nhỉ, mong thầy nói rõ hơn, vì kiến thức nông cạn nhưng em muốn hiểu rõ vấn đề hơn

Tôi tô đỏ là cho bạn chú ý mà bạn lại chẳng chịu xem. Nhìn câu lệnh With DialogSheets("Input") thì phải biết trong file có 1 DialogSheet tên là "Input". Biết tên sheet rồi làm gì mà chẳng được (ẩn hiện tùy ý)
 
Upvote 0
Cảm ơn bạn!
Các bạn cho tôi hỏi thêm
Bây giờ muốn thay +1 thành 1 hằng số bất kỳ, hằng số này nằm ở ô F2 (ô màu vàng) thì
Mã:
er = Range("A" & Rows.Count).End(xlUp).Row [COLOR=#FF0000][B]+ 1[/B][/COLOR]
sẽ viết lại như thế nào?
xin cảm ơn các bạn
Thử như thế này:
Mã:
er = Range("A" & Rows.Count).End(xlUp).Row + [F2].Value
 
Upvote 0
Tôi tô đỏ là cho bạn chú ý mà bạn lại chẳng chịu xem. Nhìn câu lệnh With DialogSheets("Input") thì phải biết trong file có 1 DialogSheet tên là "Input". Biết tên sheet rồi làm gì mà chẳng được (ẩn hiện tùy ý)

Ý em hỏi ban đầu thầy dùng lệnh gì mà ẩn sheets("input"), chẳng lẽ thầy cho sheets("input").visible = false rồi sau đó xóa dòng code này đi à,
 
Upvote 0
Ý em hỏi ban đầu thầy dùng lệnh gì mà ẩn sheets("input"), chẳng lẽ thầy cho sheets("input").visible = false rồi sau đó xóa dòng code này đi à,

Chính xác là Sheets("Input").Visible = 2
Gõ dòng lệnh ấy trong cửa số Immediate là được rồi (khỏi cần phải tạo sub rồi lại mất công xóa đi)
Nói thêm: Trong cửa sổ VBA, cứ bấm Ctrl + G sẽ hiện ra cửa sổ Immediate
 
Upvote 0
Sự khác nhau giữa FormulaR1C1Local FormulaR1C1 là như thế nào?
vì tôi đi dạy tôi sử dụng
FormulaR1C1 và học viên hỏi FormulaR khác nhau như thế nào? và tôi đã giải thích rõ ràng về vấn đề này, tiếp tục tới Formulaarray vẫn ok, nhưng tới so sánh FormulaR1C1Local là bó tay, vì từ trước tới giờ thực hành cũng không thấy nó có sự khác biệt gì? mong được biết sự khác biệt giữa chúng và cho ví dụ cụ thể, xin chân thành cảm ơn các thành viên trên GPE

 
Upvote 0
Sự khác nhau giữa FormulaR1C1Local FormulaR1C1 là như thế nào?


Theo tôi được biết thì FormulaR1C1Local có liên quan đến Local's Language Settings. Cụ thể chúng khác nhau như thế nào thì ta phải cài Windows theo ngôn ngữ khác tiếng Anh để thử nghiệm mới biết (chắc là chúng sẽ có sự hiển thị tương ứng với ngôn ngữ thiết lập trên máy)
 
Upvote 0
Sự khác nhau giữa FormulaR1C1Local FormulaR1C1 là như thế nào?
vì tôi đi dạy tôi sử dụng
FormulaR1C1 và học viên hỏi FormulaR khác nhau như thế nào? và tôi đã giải thích rõ ràng về vấn đề này, tiếp tục tới Formulaarray vẫn ok, nhưng tới so sánh FormulaR1C1Local là bó tay, vì từ trước tới giờ thực hành cũng không thấy nó có sự khác biệt gì? mong được biết sự khác biệt giữa chúng và cho ví dụ cụ thể, xin chân thành cảm ơn các thành viên trên GPE

Trong link này, phần ví dụ còn thiếu nên có thể gây hiểu lầm. Ví dụ trong đó khi dùng Excel bản tiếng Anh - Mỹ, công thức A11=SUM(A1:A10). Khi mở file ở máy dùng Excel tiếng Đức, các công thức sẽ tự chuyển sang tiếng Đức, property Range("A11").FormulaR1C1Local sẽ trả về "=SUMME(Z1S1:Z10S1)".
Theo mình thì ví dụ trên sẽ rõ ngay khi đưa thêm
Range("A11").FormulaR1C1 trả về "=SUM(R1C1:R10C1)". Nghĩa là FormulaR1C1 luôn trả về chuỗi chứa công thức như ở bản Excel tiếng Anh, kể cả khi đang dùng Excel ngôn ngữ khác; FormulaR1C1Local trả về chuỗi chứa công thức tùy thuộc vào ngôn ngữ của bản Excel đang dùng. Khi ô không chứa công thức thì 2 thuộc tính trên đều trả về giá trị giống nhau là range("A11").text
 
Lần chỉnh sửa cuối:
Upvote 0
Nếu dạy học sinh thì chỉ nên dạy những cái căn bản.
Nếu học trò tôi hỏi những câu hỏi như thế thì tôi trả lời:
"Ký tự A trong VBA là từ Application. Excel và VBA vì là ngôn ngữ thực dụng cho nên chúng có trăm vạn methods và attributes để tuỳ theo từng trường hợp mà sử dụng. Học hết thì bạc cả đầu. Là người thực tế, ta chỉ nên học nguyên tắc cấu trúc, cách thiết kế dữ liệu, và cách test/debug kết quả thôi. Tất cả những chuyện chi tiết còn lại, nếu ta chịu khó dùng debug sẽ nghiệm ra hết"
 
Upvote 0
Chắc phải học theo cách trả lời của anh VetMini rồi, chứ tìm hiểu mấy cái đó đau đầu thật đó, lúc trước tìm hiểu range và cells và các kiểu viết tắt, tại sao lúc gõ dấu . nó ra các thuộc tính lúc gõ nó không ra, và tại sao khi gán sheets(“abc”).range(“a1:b1”) nó không chịu mà sheet1.range(“a1:b1”) thì nó chịu ..v..v, mấy cái đó nghiên cứu lâu lắm mới hiểu quy tắc của nó để trả lời, và bây giờ lại phải nghiên cứu tới FormulaR1C1Local và ... nữa.Thật là để dạy được món nào đó, phải hiểu cặn kẽ từng cái thì mới có thể dạy tốt được, làm được thôi không nói được gì mà phải biết giải thích nữa ...
 
Upvote 0
Bạn có từng nói mình là dân chuyên C++ phải không?
Nếu bạn dạy C++, bạn chỉ có thể dạy sơ qua STL làm việc như thế nào, và một vài lớp/mấu (class/template) căn bản thông dụng của nó thôi. Chứ nếu bạn dạy cho hêt cả thư viện STL thì khoá học của bạn chắc 5 năm mới dứt.
 
Upvote 0
Bạn có từng nói mình là dân chuyên C++ phải không?
Nếu bạn dạy C++, bạn chỉ có thể dạy sơ qua STL làm việc như thế nào, và một vài lớp/mấu (class/template) căn bản thông dụng của nó thôi. Chứ nếu bạn dạy cho hêt cả thư viện STL thì khoá học của bạn chắc 5 năm mới dứt.
anh nghía dùm em đường link này bài 349. anh xem giải thích giúp em nguyên nhân gì đâu mà nó không ra dữ liệu đủ trên 1 cột. cảm ơn anh nhiều
http://www.giaiphapexcel.com/forum/showthread.php?75143-Bài-tập-về-ADO-căn-bản/page35
 
Upvote 0
Chào các bạn,

Có bạn nào xài office 2003 test giúp tôi đoạn code copy sheet -> save as thành file .xls bị báo lỗi
Tôi dùng đoạn code sau mục đích để copy và save as 1 sheet thành file excel khác đuôi .xls. Chạy code trên excel 2007 trở lên thì bình thường. Qua máy win xp - office 2003 chạy thì nó báo lỗi, không thể chạy được. Không hiểu tại sao...

Cảm ơn các bạn!
Mã:
Sub TestCopy()
    Sheet1.Copy
    ActiveWorkbook.SaveAs Filename:=ThisWorkbook.Path & "\" & Sheet1.Name & Sheet2.Name & Sheet3.Name & ".xls", FileFormat:=56
    ActiveWorkbook.Close
End Sub
Hiện tôi cũng không xài Excel 2003 nhưng tôi nghĩ vấn đề nằm ở chỗ FileFormat:=56, bạn thử xóa nó đi xem sao.
 
Upvote 0
Chào các bạn,

Có bạn nào xài office 2003 test giúp tôi đoạn code copy sheet -> save as thành file .xls bị báo lỗi
Tôi dùng đoạn code sau mục đích để copy và save as 1 sheet thành file excel khác đuôi .xls. Chạy code trên excel 2007 trở lên thì bình thường. Qua máy win xp - office 2003 chạy thì nó báo lỗi, không thể chạy được. Không hiểu tại sao...

Cảm ơn các bạn!
Mã:
Sub TestCopy()
    Sheet1.Copy
    ActiveWorkbook.SaveAs Filename:=ThisWorkbook.Path & "\" & Sheet1.Name & Sheet2.Name & Sheet3.Name & ".xls", FileFormat:=56
    ActiveWorkbook.Close
End Sub
Máy mình Xp +Office 2010 chay tốt .....nhưng thấy mấy cái Name kỳ kỳ.......
 
Upvote 0
Chào các bạn,

Có bạn nào xài office 2003 test giúp tôi đoạn code copy sheet -> save as thành file .xls bị báo lỗi
Tôi dùng đoạn code sau mục đích để copy và save as 1 sheet thành file excel khác đuôi .xls. Chạy code trên excel 2007 trở lên thì bình thường. Qua máy win xp - office 2003 chạy thì nó báo lỗi, không thể chạy được. Không hiểu tại sao...

Cảm ơn các bạn!
Mã:
Sub TestCopy()
    Sheet1.Copy
    ActiveWorkbook.SaveAs Filename:=ThisWorkbook.Path & "\" & Sheet1.Name & Sheet2.Name & Sheet3.Name & ".xls", FileFormat:=56
    ActiveWorkbook.Close
End Sub
Tham khảo thêm nè
XlFileFormat = xlExce l8 <=> File Extension = "xls" : Value = 56
XlFileFormat = xlOpenXMLWorkbook <=> File Extension = "xlsx" : Value = 51
XlFileFormat = xlExcel 12 <=> File Extension = "xlsb" : Value = 50
XlFileFormat = xlOpenXMLWorkbookMacroEnabled <=> File Extension = "xlsm" : Value = 52
 
Upvote 0
Thầy ơi! nhờ Thầy "soi sáng" em viết thành công "ép" người ta phải nhập số tờ (hoặc bấm Cancel) rồi @$@!^%, đúng là "Không thầy đố mày làm nên", em cám ơn thấy rất rất nhiều.

Code thế này

Mã:
Dim SoTo, Text1 As String, Text2 As String, Text3 As String
      Const default = 1
  Text1 = "Ha4y nha65p so61 to72 nha65p xong click OK ma85c d9inh la2 1 to72"
  SoTo = Application.InputBox(UniConvert(Text1, "VNI"), "THÔNG BÁO", default)
  If SoTo = "False" Then
    Sheets(23).Select
    Exit Sub
  ElseIf SoTo = "" Then
    Text2 = "Ba5n chu7a nha65p so61 to72 hãy nha65p la5i"
    Text3 = "Hay nhap so to"
    MessageBox Application.hwnd, StrPtr(UniConvert(Text2, "VNI")), StrPtr("THÔNG BÁO"), vbOKOnly
Do Until SoTo <> ""
     SoTo = Application.InputBox(UniConvert(Text3, "VNI"), "THÔNG BÁO")
     If SoTo = "False" Then Exit Sub
Loop
     'Làm gì nữa tùy bạn
    Else
    'Làm gì nữa tùy bạn
End If
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Checkbox=True thì gán số liệu từ sheet này sang sheet kia

Em có thử viết code
Nếu Checkbox = True thì gán các số liệu từ Sheet Form Sang Sheet Data, nhưng em thấy code chạy xong thì nó không gán số liệu qua. Em không biết code em sai ở đâu, nhờ các anh chị hướng dẫn giúp, em cảm ơn
Mã:
Sub Text()
    Dim eR As Long
    Dim Rng3 As Range
    On Error Resume Next
    '******************* tim dong cuoi cua Sheet Data
    Set Rng3 = ActiveSheet.UsedRange
    eR = Sheets("Data").Columns("A:AB").Find("*", Rng3(1, 1), , , xlByRows, xlPrevious).Row + 1


    MsgBox eR
    '********************


    If CheckBox1 = True Then
        With S002
            .Cells(eR, 1).Value = S001.[E2]
            .Cells(eR, 2).Value = S001.[G2]
        End With
    End If
End Sub
Cho em hỏi thêm nếu thay AB thành B trong
Mã:
eR = Sheets("Data").Columns("A:[COLOR=#0000ff][B]AB[/B][/COLOR]").Find("*", Rng3(1, 1), , , xlByRows, xlPrevious).Row + 1
thì MgsBox eR thông báo là o ???? đúng ra là 10
 

File đính kèm

Upvote 0
cho em chen ngang với
Mã:
Sub msgboxx()
test = MsgBox("ba" & ChrW(803) & "n v" & ChrW(432) & ChrW(768) & "a cha" & ChrW(803) & "y code", 1, "Thông ba" & ChrW(769) & "o")
End Sub
tại sao xuất hộp thoại lại ra chữ tùm lum hết vậy ạ.
 
Upvote 0
Em có thử viết code
Nếu Checkbox = True thì gán các số liệu từ Sheet Form Sang Sheet Data, nhưng em thấy code chạy xong thì nó không gán số liệu qua. Em không biết code em sai ở đâu, nhờ các anh chị hướng dẫn giúp, em cảm ơn
Mã:
Sub Text()
    Dim eR As Long
    Dim Rng3 As Range
    On Error Resume Next
    '******************* tim dong cuoi cua Sheet Data
    Set Rng3 = ActiveSheet.UsedRange
    eR = Sheets("Data").Columns("A:AB").Find("*", Rng3(1, 1), , , xlByRows, xlPrevious).Row + 1


    MsgBox eR
    '********************


    If CheckBox1 = True Then
        With S002
            .Cells(eR, 1).Value = S001.[E2]
            .Cells(eR, 2).Value = S001.[G2]
        End With
    End If
End Sub
Cho em hỏi thêm nếu thay AB thành B trong
Mã:
eR = Sheets("Data").Columns("A:[COLOR=#0000ff][B]AB[/B][/COLOR]").Find("*", Rng3(1, 1), , , xlByRows, xlPrevious).Row + 1
thì MgsBox eR thông báo là o ???? đúng ra là 10
Bạn thử dùng code này xem sao:

Mã:
Sub Test()
    If S001.CheckBox1 Then
        Dim eR As Long
        With S002
            '******************* tim dong cuoi cua Sheet Data
            eR = .Range("A65536").End(xlUp).Row + 1
            '********************
            MsgBox eR
            '********************
            .Cells(eR, 1).Value = S001.Range("E2")
            .Cells(eR, 2).Value = S001.Range("G2")
        End With
    End If
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Bạn thử dùng code này xem sao:

Mã:
Sub Test()
    If S001.CheckBox1 Then
        Dim eR As Long
        With S002
            '******************* tim dong cuoi cua Sheet Data
            eR = .Range("A65536").End(xlUp).Row + 1
            '********************
            MsgBox eR
            '********************
            .Cells(eR, 1).Value = S001.Range("E2")
            .Cells(eR, 2).Value = S001.Range("G2")
        End With
    End If
End Sub
Chuyển qua xác định eR kiểu của anh nó chạy còn làm như của em code kg chạy -> không hiểu tại sao
Có cách nào xác định eR giống như bài trên (#276) của em khg, vì em đang dùng chung cho 1 bảng tính. Em cảm ơn
 
Upvote 0
cho em chen ngang với
Mã:
Sub msgboxx()
test = MsgBox("ba" & ChrW(803) & "n v" & ChrW(432) & ChrW(768) & "a cha" & ChrW(803) & "y code", 1, "Thông ba" & ChrW(769) & "o")
End Sub
tại sao xuất hộp thoại lại ra chữ tùm lum hết vậy ạ.
Bạn phải có một hàm để điều khiển MsgBox chuyển nội dung thành tiếng Việt mới được!
 
Upvote 0
Chuyển qua xác định eR kiểu của anh nó chạy còn làm như của em code kg chạy -> không hiểu tại sao
Có cách nào xác định eR giống như bài trên (#276) của em khg, vì em đang dùng chung cho 1 bảng tính. Em cảm ơn
Vậy làm thế này đi:

Mã:
        Set Rng3 = S002.UsedRange
        eR = S002.Columns("A:B").Find("*", Rng3(1, 1), , , xlByRows, xlPrevious).Row + 1
 
Upvote 0
vậy làm thế nào ạ. cái đso là em dùng hàm unitovba để chuyển từ unicode qua vba rồi.
Bạn có chuyển nó cũng vậy thôi, vì đó không phải là hàm tạo UniMsgBox.

Bạn cũng có thể không dùng hàm gì cả, chỉ cần làm như sau thì nó vẫn hiển thị MsgBox tiếng Việt, vả lại rất mượt mà:

Mã:
Sub Test()
    Dim TestMsgBox As Long
    Dim MsgTitle As String, MsgText As String
    
    MsgTitle = "Thông Báo"
    MsgText = "Ba" & ChrW(803) & "n v" & ChrW(432) & ChrW(768) & "a cha" & ChrW(803) & "y code"


    TestMsgBox = Application.Assistant.DoAlert( _
                                                MsgTitle, _
                                                MsgText, _
                                                msoAlertButtonOK, _
                                                msoAlertIconInfo, _
                                                msoAlertDefaultFirst, _
                                                msoAlertCancelDefault, _
                                                False)
End Sub
 
Upvote 0
Mình cũng có Tham khảo được hàm API Việt hóa 100% có dấu Và chỉnh sửa lại một tí mới chạy được úp lên cho các Bạn Tham khảo
PHP:
Function HookProc(ByVal nCode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long    Dim hStatic1 As Long, hStatic2 As Long, hButton As Long, hFont As Long    HookProc = CallNextHookEx(hDlgHook, nCode, wParam, lParam)    If nCode = HCBT_ACTIVATE Then        hFont = CreateFont(13, 0, 0, 0, 500, 0, 0, 0, 0, 0, 0, 0, 0, FONT_FACE)        ''''''''''''''''''''''        hStatic1 = FindWindowEx(wParam, 0&, "Static", vbNullString)        hStatic2 = FindWindowEx(wParam, hStatic1, "Static", vbNullString)        If hStatic2 = 0 Then hStatic2 = hStatic1        SendMessage hStatic2, WM_SETFONT, hFont, ByVal 1&        Rem Dong        hButton = FindWindowEx(wParam, 0&, "Button", "OK")        SendMessage hButton, WM_SETFONT, hFont, 0        SetWindowTextW hButton, StrPtr(ChrW(272) & ChrW(243) & "ng")        Rem Co        hButton = FindWindowEx(wParam, 0&, "Button", "&Yes")        SendMessage hButton, WM_SETFONT, hFont, 0        SetWindowTextW hButton, StrPtr("C" & ChrW(243))        Rem Khong        hButton = FindWindowEx(wParam, 0&, "Button", "&No")        SendMessage hButton, WM_SETFONT, hFont, 0        SetWindowTextW hButton, StrPtr("Kh" & ChrW(244) & "ng")        Rem Thu lai        hButton = FindWindowEx(wParam, 0&, "Button", "&Retry")        SendMessage hButton, WM_SETFONT, hFont, 0        SetWindowTextW hButton, StrPtr("Th" & ChrW(&H1EED) & " L" & ChrW(&H1EA1) & "i")        Rem Thoat        hButton = FindWindowEx(wParam, 0&, "Button", "Cancel")        SendMessage hButton, WM_SETFONT, hFont, 0        SetWindowTextW hButton, StrPtr("Tho" & ChrW(225) & "t")        ''''''''''''''''''''''        UnhookWindowsHookEx hDlgHook    End IfEnd Function
đầy dủ trong File
 

File đính kèm

Upvote 0
Thầy ơi! nhờ Thầy "soi sáng" em viết thành công "ép" người ta phải nhập số tờ (hoặc bấm Cancel) rồi @$@!^%, đúng là "Không thầy đố mày làm nên", em cám ơn thấy rất rất nhiều.

Code thế này

Mã:
Dim SoTo, Text1 As String, Text2 As String, Text3 As String
      Const default = 1
  Text1 = "Ha4y nha65p so61 to72 nha65p xong click OK ma85c d9inh la2 1 to72"
  SoTo = Application.InputBox(UniConvert(Text1, "VNI"), "THÔNG BÁO", default)
  If SoTo = "False" Then
    Sheets(23).Select
    Exit Sub
  ElseIf SoTo = "" Then
    Text2 = "Ba5n chu7a nha65p so61 to72 hãy nha65p la5i"
    Text3 = "Hay nhap so to"
    MessageBox Application.hwnd, StrPtr(UniConvert(Text2, "VNI")), StrPtr("THÔNG BÁO"), vbOKOnly
Do Until SoTo <> ""
     SoTo = Application.InputBox(UniConvert(Text3, "VNI"), "THÔNG BÁO")
     If SoTo = "False" Then Exit Sub
Loop
     'Làm gì nữa tùy bạn
    Else
    'Làm gì nữa tùy bạn
End If
End Sub

Vầy gọn hơn:
Mã:
  Dim SoTo, Text1 As String, Text2 As String, default
  default = 1
  Text1 = "Ha4y nha65p so61 to72 nha65p xong click OK ma85c d9inh la2 1 to72"
  Text2 = "Ba5n chu7a nha65p so61 to72 hãy nha65p la5i"
  Do While SoTo = ""
    SoTo = Application.InputBox(UniConvert(Text1, "VNI"), "THÔNG BÁO", default)
    If SoTo = "" Then MessageBox Application.hwnd, StrPtr(UniConvert(Text2, "VNI")), StrPtr("THÔNG BÁO"), vbOKOnly
  Loop
  If SoTo = "False" Then
    Sheets(23).Select
    Exit Sub
  Else
    ''Làm gì tuy ý
  End If
 
Upvote 0
Vầy gọn hơn:
Mã:
  Dim SoTo, Text1 As String, Text2 As String, default
  default = 1
  Text1 = "Ha4y nha65p so61 to72 nha65p xong click OK ma85c d9inh la2 1 to72"
  Text2 = "Ba5n chu7a nha65p so61 to72 hãy nha65p la5i"
  Do While SoTo = ""
    SoTo = Application.InputBox(UniConvert(Text1, "VNI"), "THÔNG BÁO", default)
    If SoTo = "" Then MessageBox Application.hwnd, StrPtr(UniConvert(Text2, "VNI")), StrPtr("THÔNG BÁO"), vbOKOnly
  Loop
  If SoTo = "False" Then
    Sheets(23).Select
    Exit Sub
  Else
    ''Làm gì tuy ý
  End If

Quả đúng Thầy vẫn là "Thầy" em vẫn là "Ếch ngồi đáy giếng", code vừa ngắn vừa hay chạy cũng gọn nhẹ hơn. Em xin cám ơn Thầy rất nhiều ạ.
 
Upvote 0
Làm cácnh nào để checkbox bị đóng băng

Cho em hỏi trường hợp sau

Tại sheet này em có 1 checkbox
Em muốn tại ô A1, khi nhập chữ A thì mới có thể đánh dấu check trên Checkbox (ý là có thể đáng dấu hoặc không đáng dấu), ngoài ra thì chechbox bị đóng băng (nghĩa là không thể chọn hay bỏ dấu check)
Cho em hỏi code fải viết như thế nào, em cảm ơn!
 
Upvote 0
Hình như, như thế này thì phải

If (Range("A1").Value = "A") Then
CheckBox1.Enabled = True
Else
CheckBox1.Enabled = False
End If
 
Upvote 0
Hình như, như thế này thì phải

If (Range("A1").Value = "A") Then
CheckBox1.Enabled = True
Else
CheckBox1.Enabled = False
End If

Thường thường thì đặt thuộc tính cho control chỉ dùng 1 dòng thôi. Logic block (If-then-else) giành cho trường hợp cần đặt nhiều thuộc tính.
CheckBox1.Enabled = (Range("A1").Value = "A")
 
Upvote 0
Chào các Thầy các anh, em xin các Thầy các anh trợ giúp, em đang gặp bế tắt như sau, em muốn viết code sao cho khi click kép tại ô đã Paste Link , ActiveCell(khung chọn ô) chọn chính xác đến vị trí ô của sheet theo đường dẫn trích từ công thức Paste link của ô đó.


Ví dụ:
Copy vùng A1:A5 của sheet2 rồi dán theo kiểu Paste special / Paste Link tại A2 của sheet TongHop,tương tự copy vùng B1:B7 của sheet3 dán Paste Link tại A7 của sheet TongHop ta được vùng dử liệu từ A2:A13 là nơi chứa các công thức từ việc Paste Link.

Điều mong muốn:
Tại sheet TongHop nếu click kép vào A2 --> khung chọn ô(activecell) theo đường dẫn công thức tại A2 là Sheet2!A1 chọn đúng ô A1 của sheet2, tương tự tại TongHop nếu click kép vào A4 --> khung chọn theo đường dẫn Sheet2!A3 chọn đúng ô A3 của sheet2, tại sheet TongHop nếu click kép vào A9 --> khung chọn theo đường dẫn Sheet3!B3 chọn đúng ô B3 của sheet3
....

Để thực hiện được ý đồ này em nhận xét tại những ô có Paste Link (vùng A2:A13 của TongHop) điều có công thức: dấu =, tên sheet, dấu ! , tên ô ( ví dụ =Sheet2!A3 )

Như vậy nếu có một code nào đó có thể nhận dạng công thức rồi lọc trích ra tên sheet và tên ô ghép vào code này Sheets(tênSheet). Range(tên ô).Select sẻ dạt được mong muốn trên.

Code mô phỏng:

Mã:
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
Dim TenSh, TenCell As String
 If Target.Column = 1 Then
    If Target <> "" Then
    
    [COLOR=#ff0000]'Hàm hay code trích xuất tên sheet tên ô từ công thức Paste Link đang cần trợ giúp[/COLOR]
        
        Sheets("TenSh").Range("TenCell").Select
        End If
    End If
End Sub

Em đã chuyễn bài hỏi này sang http://www.giaiphapexcel.com/forum/showthread.php?107492-Link-nhanh-từ-cell-đến-cell vì lo hỏi sai chủ đề
 
Lần chỉnh sửa cuối:
Upvote 0
Chào tất cả mọi người. Nhờ mọi người xem giúp em đoạn code trích lọc dữ liệu theo tháng dưới đây bị sai ở đâu ạ, em nghĩ mãi mà vẫn không biết mình sai ở chỗ nào. Đoạn code của em đây ạ :

Sub trich()
Range("I3:L22").ClearContents


For i = 3 To 22
If Month(Range("B" & i).Value) = Range("O1").Value Then
Range("A" & i & ":D" & i).Copy Range("I" & i)
End If
Next i
End Sub

Em đính kèm File bên dưới luôn cho mọi người dễ hiều ạ. Em cảm ơn mọi người
 

File đính kèm

Upvote 0
Chào tất cả mọi người. Nhờ mọi người xem giúp em đoạn code trích lọc dữ liệu theo tháng dưới đây bị sai ở đâu ạ, em nghĩ mãi mà vẫn không biết mình sai ở chỗ nào. Đoạn code của em đây ạ :

Sub trich()
Range("I3:L22").ClearContents


For i = 3 To 22
If Month(Range("B" & i).Value) = Range("O1").Value Then
Range("A" & i & ":D" & i).Copy Range("I" & i)
End If
Next i
End Sub

Em đính kèm File bên dưới luôn cho mọi người dễ hiều ạ. Em cảm ơn mọi người

Điều đầu tiên bạn cần làm là kiểm tra kiểu dữ liệu trong cột B. Cụ thể cell B13 không phải là Date, dẫn đến câu lệnh If Month(Range("B" & i).Value)... bị lỗi
Ngoài lề:
- Hỏi về code VBA, sao lại đưa file có đuôi XLSX? Bởi file dạng này thì làm gì có code cơ chứ?
- Mới học VBA nên tập thói quen khai báo biến đầy đủ và rõ ràng bạn à
 
Upvote 0
ủa đây là topic về VBA mà sao bạn gửi file .xlsx là sao ?

Đoạn code của em bị sai lên Excel không cho lưu lại cả đoạn code đó được nên em chỉ lưu đc ở dạn File Excel bình thường thôi ạ. Anh tải File đó về rồi Copy đoạn code của chạy thử hộ em với xem nó bị sai ở đâu ạ
 
Upvote 0
Điều đầu tiên bạn cần làm là kiểm tra kiểu dữ liệu trong cột B. Cụ thể cell B13 không phải là Date, dẫn đến câu lệnh If Month(Range("B" & i).Value)... bị lỗi
Ngoài lề:
- Hỏi về code VBA, sao lại đưa file có đuôi XLSX? Bởi file dạng này thì làm gì có code cơ chứ?
- Mới học VBA nên tập thói quen khai báo biến đầy đủ và rõ ràng bạn à

Thưa chú, tại vì code sai lên Excel không cho lưu lại ạ. Con đã sửa lại cell B13 về dạng Date rồi mà vẫn không được chú ơi. VBA báo lỗi thế này :

hoi.jpg

con không biết sao nữa -0-/.-0-/.-0-/.
 
Upvote 0
Đoạn code của em bị sai lên Excel không cho lưu lại cả đoạn code đó được nên em chỉ lưu đc ở dạn File Excel bình thường thôi ạ. Anh tải File đó về rồi Copy đoạn code của chạy thử hộ em với xem nó bị sai ở đâu ạ
bài của bạn đâu có làm cách đó .
bạn record macro rồi filter xem coi nó ghi lại làm sao . bạn bắt chước làm vậy
 
Upvote 0
Thưa chú, tại vì code sai lên Excel không cho lưu lại ạ. Con đã sửa lại cell B13 về dạng Date rồi mà vẫn không được chú ơi. VBA báo lỗi thế này :
View attachment 146323


con không biết sao nữa -0-/.-0-/.-0-/.

Lỗi nó tô màu ở chỗ nào sao bạn không ghi rõ?
Tôi đoán: Bạn có sửa nhưng chưa đúng. Hãy kiểm chứng bằng công thức =ISNUMBER(B13) nếu cho kết quả =TRUE thì mới là đúng
 
Upvote 0
Lỗi nó tô màu ở chỗ nào sao bạn không ghi rõ?
Tôi đoán: Bạn có sửa nhưng chưa đúng. Hãy kiểm chứng bằng công thức =ISNUMBER(B13) nếu cho kết quả =TRUE thì mới là đúng

Chính xác luôn chú ạ, trời ơi nó dành dành 2 ký tự "//" như vầy mà con không nhìn ra

haha.PNG

Bảo sao mà nó không ra kết quả là phải rồi . Bây giờ thì hoàn toàn ok rồi ạ. Cũng gần đến giờ nghỉ trưa rồi đáy ạ. Chúc chú bữa trưa zui zẻ . Con cảm ơn chú nhiều !
 
Lần chỉnh sửa cuối:
Upvote 0
Chào tất cả mọi người. Nhờ mọi người xem giúp em đoạn code trích lọc dữ liệu theo tháng dưới đây bị sai ở đâu ạ, em nghĩ mãi mà vẫn không biết mình sai ở chỗ nào. Đoạn code của em đây ạ :
Sub trich()
Range("I3:L22").ClearContents
For i = 3 To 22
If Month(Range("B" & i).Value) = Range("O1").Value Then
Range("A" & i & ":D" & i).Copy Range("I" & i)
End If
Next i
End Sub
Em đính kèm File bên dưới luôn cho mọi người dễ hiều ạ. Em cảm ơn mọi người
Vẫn theo code của bạn, sửa lại như vậy để kết quả nhìn cho đẹp...
PHP:
Sub trich()
Dim i&, r&
r = 1
Sheet1.Range("I3:L22").Clear
For i = 3 To 22
    If Month(Sheet1.Range("B" & i).Value) = Sheet1.Range("O1").Value Then
        Sheet1.Range("A" & i & ":D" & i).Copy Sheet1.Range("I3").Offset(r - 1)
        r = r + 1
    End If
Next i
End Sub
 
Upvote 0
Vẫn là nối tiếp của bài tập bên trên. Lời giải của bài tập này em tham khảo được đoạn code trong File đính kèm dưới đây của tác giả Anhtuan1066 .

Trong đoạn code đó , có chỗ tác giả viết (dòng thứ 3 từ cuối lên) : Range("Sheet2!A9:E2000").Sort Key1:=Range("A9"), Order1:=xlAscending

Tuy nhiên em không hiểu câu lệnh trên có ngụng ý gì ? Em đã thử xóa nó đi nhưng thấy code vẫn chạy bình thường ạ. Em muốn mọi người

giải thích hộ em câu lệnh trên , tác dụng của nó để làm gì ạ.



 

File đính kèm

Upvote 0
Để sort dữ liệu theo ngày tháng thôi (sort cột A). Không thích sort thì bỏ đi
(Nhìn lại code ngày xưa mình viết thấy mắc cười quá --=0)

Có xem lại mấy bài tập toán mình làm ngày xưa chưa vậy? Hồi còn "uổng chờ tứa măm" đó.
Chắc cũng "mắc cười" lắm.
"Tuổi nhỏ làm việc nhỏ" thôi mà. Ẹc..
 
Upvote 0
Để sort dữ liệu theo ngày tháng thôi (sort cột A). Không thích sort thì bỏ đi
(Nhìn lại code ngày xưa mình viết thấy mắc cười quá --=0)

Oa..... Oa!!!! --=0 --=0. Người đó chính là chú ạ. Trên diễn đàn, vào lại các bài cũ cũ , con có được đọc nhiều bài viết của tác giả Anhtuan1066 này và thấy rất hay (con thấy khoái nhất là cái vụ dùng hàm để tách riêng các số lẫn với các ký tự khác trong 1 chuỗi, phương pháp làm quả thất là rất bá đạo :-=:-=:-= hi hi.) không ngờ hôm nay con mới biết 2 người lại là một. Thì ra tên thật của chú là chú Tuấn , hi hi..../-*+//-*+/
 
Lần chỉnh sửa cuối:
Upvote 0
Oa..... Oa!!!! --=0 --=0. Người đó chính là chú ạ. Trên diễn đàn, vào lại các bài cũ cũ , con có được đọc nhiều bài viết của tác giả Anhtuan1066 này và thấy rất hay (con thấy khoái nhất là cái vụ dùng hàm để tách riêng các số lẫn với các ký tự khác trong 1 chuỗi, phương pháp làm quả thất là rất bá đạo :-=:-=:-= hi hi.) không ngờ hôm nay con mới biết 2 người lại là một. Thì ra tên thật của chú là chú Tuấn , hi hi..../-*+//-*+/
Trời ơi, nhờ bạn mà giờ tôi mới biết là tuy 2 mà 1 đó nha! --=0--=0--=0
 
Upvote 0
Trời ơi, nhờ bạn mà giờ tôi mới biết là tuy 2 mà 1 đó nha! --=0--=0--=0

Anh Trọng Nghĩa đây tham gia diễn đàn cũng khá là lâu rồi, hơn nữa lại còn là thành viên trong BQT nữa, vậy mà giờ cũng mới biết thì chứng tỏ 1 điều hành tung của chú ndu quả thật quá bí ẩn....||||||||||||||||||||
 
Upvote 0
Bạn tham khảo cặp macro này thử coi:

PHP:
Option Explicit
Sub GPE(Sh As Worksheet)
 MsgBox Sh.Name
End Sub
Mã:
Sub Main()
 Dim ShName As String, J As Byte
 For J = 1 To 3
    GPE Worksheets("sheet" & CStr(J))
 Next J
End Sub
 
Upvote 0

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

Back
Top Bottom