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:
    Hay dở tôi không dám nói, mà nhanh hay chậm cũng không test được luôn... vì đằng nào cũng tìm có 1 giá trị, vèo cái là xong
    Tuy nhiên khi tôi viết code thì rất hạn chế dùng WorksheetFunction, trừ trường hợp bất khả kháng...
    (mà dù cho dùng VLOOKUP thì sao bạn vẫn bỏ qua vụ bẫy lỗi nhỉ?)

    Hàm em đâu có biết gì đâu mà bẩy lỗi ...Họ viết cho sao biết vậy thôi chứ ...Anh thấy trên GPE có bao giờ Em viết Hàm đâu mà..!$@!!
     
    Upvote 0
    Hàm em đâu có biết gì đâu mà bẩy lỗi ...Họ viết cho sao biết vậy thôi chứ ...Anh thấy trên GPE có bao giờ Em viết Hàm đâu mà..!$@!!

    Thì Find hay VLOOKUP cũng vậy, lỗi sẽ xuất hiện khi không tìm thấy, như nhau cả mà... nên cuối cùng vẫn không nên bỏ qua công đoạn bẫy lỗi
    Muốn biết phải bẫy ra sao, bạn có test các trường hợp
     
    Upvote 0
    Thì Find hay VLOOKUP cũng vậy, lỗi sẽ xuất hiện khi không tìm thấy, như nhau cả mà... nên cuối cùng vẫn không nên bỏ qua công đoạn bẫy lỗi
    Muốn biết phải bẫy ra sao, bạn có test các trường hợp


    oK Anh ...Em mới thử Empty hết là code nhảy vàng lên hết
     
    Upvote 0
    mọi người giúp em lỗi này với nhé. ngồi cả ngày search google rồi, không biết cách khắc phục
    nội dung lỗi em có nêu trong file đính kèm
    mình đã tìm ra lỗi (không biết phải không) nhưng hiện tại chưa có cách khắc phục
    cụ thể là class làm việc với đối tượng textbox
    khi gọi Class thì nội dung class đó có code làm việc với textbox nhưng trong sheet không có textbox vì thế nó bị lỗi 438 và code không làm việc được
    vậy làm sao để kiểm tra textbox có tồn tại không
    nếu không thì chèn textbox và thực hiện code tiếp tục (code vẫn tiếp tục làm việc - sự kiện vẫn còn chứ không phải dừng lại mất luôn sự kiện)
    vì code kiểm tra và chèn đối tượng trong khi chạy code thì hình như nó không được cập nhật hay sao ấy. Việc set đối tượng mới vừa chèn không thành công. Chỉ khi có đối tượng rồi thì chạy code mới set được.
    ps: diễn đạt có thể hơi khó hiểu. Chắc tự xử luôn quá
     
    Upvote 0
    mình đã tìm ra lỗi (không biết phải không) nhưng hiện tại chưa có cách khắc phục
    cụ thể là class làm việc với đối tượng textbox
    khi gọi Class thì nội dung class đó có code làm việc với textbox nhưng trong sheet không có textbox vì thế nó bị lỗi 438 và code không làm việc được
    vậy làm sao để kiểm tra textbox có tồn tại không
    nếu không thì chèn textbox và thực hiện code tiếp tục (code vẫn tiếp tục làm việc - sự kiện vẫn còn chứ không phải dừng lại mất luôn sự kiện)
    vì code kiểm tra và chèn đối tượng trong khi chạy code thì hình như nó không được cập nhật hay sao ấy. Việc set đối tượng mới vừa chèn không thành công. Chỉ khi có đối tượng rồi thì chạy code mới set được.
    ps: diễn đạt có thể hơi khó hiểu. Chắc tự xử luôn quá

    Kiểu này giống chưa đẻ trứng đã lo nuôi gà chọi đây

    nên kiểm tra tồn tại textbox trước khi tạo object, đoạn code sau là ví dụ ktra tồn tại của textbox chưa
    Mã:
    [LEFT][COLOR=#222222][FONT=&amp]Dim TextBox As Shape[/FONT][/COLOR]
    [COLOR=#222222][FONT=&amp]On Error Resume Next[/FONT][/COLOR]
    [COLOR=#222222][FONT=&amp]Set TextBox = ThisWorkbook.Sheets("Sheet[/FONT][/COLOR][COLOR=#222222][FONT=&amp]1").Shapes[/FONT][/COLOR][COLOR=#222222][FONT=&amp]("txtFullN[/FONT][/COLOR][COLOR=#222222][FONT=&amp]ame")[/FONT][/COLOR]
    [COLOR=#222222][FONT=&amp]On Error GoTo 0[/FONT][/COLOR]
    [COLOR=#222222][FONT=&amp]If Not TextBox Is Nothing Then MsgBox "txtFullName exists."[/FONT][/COLOR][/LEFT]
     
    Upvote 0
    Kiểu này giống chưa đẻ trứng đã lo nuôi gà chọi đây

    nên kiểm tra tồn tại textbox trước khi tạo object, đoạn code sau là ví dụ ktra tồn tại của textbox chưa
    Mã:
    [LEFT][COLOR=#222222][FONT=&amp]Dim TextBox As Shape[/FONT][/COLOR]
    [COLOR=#222222][FONT=&amp]On Error Resume Next[/FONT][/COLOR]
    [COLOR=#222222][FONT=&amp]Set TextBox = ThisWorkbook.Sheets("Sheet[/FONT][/COLOR][COLOR=#222222][FONT=&amp]1").Shapes[/FONT][/COLOR][COLOR=#222222][FONT=&amp]("txtFullN[/FONT][/COLOR][COLOR=#222222][FONT=&amp]ame")[/FONT][/COLOR]
    [COLOR=#222222][FONT=&amp]On Error GoTo 0[/FONT][/COLOR]
    [COLOR=#222222][FONT=&amp]If Not TextBox Is Nothing Then MsgBox "txtFullName exists."[/FONT][/COLOR][/LEFT]
    trong file mình có rồi nhé
    Mã:
    Private Sub Insert0(ByVal mObj As String, _
                Optional ByVal Ws As Worksheet, _
                Optional ByVal nObj As String, _
                Optional ByVal mLeft As Double = 10, _
                Optional ByVal mTop As Double = 10, _
                Optional ByVal mWidth As Double = 10, _
                Optional ByVal mHeight As Double = 10)
        Dim Obj As Object 'OLEObject
        Dim oldEvent As Boolean
        'Dim NamesDoiTuong As String
        oldEvent = Application.EnableEvents
        Application.EnableEvents = False
        'NamesDoiTuong = Replace(Replace(NameObj, ".", ""), "Forms", "")
        If Ws Is Nothing Then Set Ws = ActiveSheet
        With Ws
        Dim i As Byte
    [COLOR=#ff0000]        'duyet qua het cac doi tuong
            For i = 1 To .Shapes.Count
                'neu doi tuong da ton tai thi thoat, ko chen nua
                If .Shapes.Item(i).Name = nObj Then GoTo Thoat
            Next i[/COLOR]
            'chen doi tuong
            Set Obj = .OLEObjects.Add(ClassType:=mObj, Link:=False, _
                    DisplayAsIcon:=False, Left:=mLeft, Top:=mTop, Width:=mWidth, Height:=mHeight)
            With Obj 'an doi tuong di
                '.Name = nObj
                .Visible = False
            End With
        End With
    Thoat:
        Application.EnableEvents = oldEvent
        Set Obj = Nothing
        Set Ws = Nothing
    End Sub
     
    Upvote 0
    trong file mình có rồi nhé
    Mã:
    Private Sub Insert0(ByVal mObj As String, _
                Optional ByVal Ws As Worksheet, _
                Optional ByVal nObj As String, _
                Optional ByVal mLeft As Double = 10, _
                Optional ByVal mTop As Double = 10, _
                Optional ByVal mWidth As Double = 10, _
                Optional ByVal mHeight As Double = 10)
        Dim Obj As Object 'OLEObject
        Dim oldEvent As Boolean
        'Dim NamesDoiTuong As String
        oldEvent = Application.EnableEvents
        Application.EnableEvents = False
        'NamesDoiTuong = Replace(Replace(NameObj, ".", ""), "Forms", "")
        If Ws Is Nothing Then Set Ws = ActiveSheet
        With Ws
        Dim i As Byte
    [COLOR=#ff0000]        'duyet qua het cac doi tuong
            For i = 1 To .Shapes.Count
                'neu doi tuong da ton tai thi thoat, ko chen nua
                If .Shapes.Item(i).Name = nObj Then GoTo Thoat
            Next i[/COLOR]
            'chen doi tuong
            Set Obj = .OLEObjects.Add(ClassType:=mObj, Link:=False, _
                    DisplayAsIcon:=False, Left:=mLeft, Top:=mTop, Width:=mWidth, Height:=mHeight)
            With Obj 'an doi tuong di
                '.Name = nObj
                .Visible = False
            End With
        End With
    Thoat:
        Application.EnableEvents = oldEvent
        Set Obj = Nothing
        Set Ws = Nothing
    End Sub

    thế thì tốt rùi, vì bạn hỏi
    ...
    vậy làm sao để kiểm tra textbox có tồn tại không......

    nên mới có trả lời trên
     
    Upvote 0
    Các bác cho em hỏi cái code này với.
    Em muốn tạo 1 macro phím tắt là Ctrl + T, khi nhấn phím tắt này thì ô đang được chọn sẽ được paste format từ ô A1 của sheet 2 sang.
     
    Upvote 0
    Thì bạn tiến hành ghi các lệnh về Format Sheet2.[A1] vô 1 macro;

    Sau đó gán fím nóng cho nó như bạn muốn.

    Tiếp theo là macro sự kiện tại ô mà bạn muốn chép Format từ Sheet2.[A1]
     
    Upvote 0
    - Các bác cho e hỏi về code kiểm tra CheckBox đã được Tích hay chưa ạ

    - Tại TextBox 5 e nhập như sau:

    Private Sub TextBox5_Change()
    With Me
    If .CheckBox1.Enabled = True Then
    .....
    End If
    End Sub

    Nhưnh hình như cái bôi đậm e thấy nó k đúng thì phải. Vì lúc nào cũng là True hết ạ
     

    File đính kèm

    • Untitled.png
      Untitled.png
      784 bytes · Đọc: 40
    Upvote 0
    Kiểm tra thuộc tính Value (so sánh với xlOn)
    Thuọc tính Enabled dùng để báo cho Form biết nó có sử dụng hay không. Nếu Enabled = false thì checkbox sẽ bị mờ (greyed out), và ngừoi dùng sẽ chẳng tick hay unltick gì được cả.
     
    Upvote 0
    Kiểm tra thuộc tính Value (so sánh với xlOn)
    Thuọc tính Enabled dùng để báo cho Form biết nó có sử dụng hay không. Nếu Enabled = false thì checkbox sẽ bị mờ (greyed out), và ngừoi dùng sẽ chẳng tick hay unltick gì được cả.

    E làm được rùi. Thanks bác :D
     
    Upvote 0
    Bạn nào biết xin chỉ dùm ngôn ngữ sau là ngôn ngữ Gì ...Mình nghi là Delphi quá
    Mã:
    Object acAddObjectForm: TacAddObjectForm
      Left = 345
      Top = 238
      BorderIcons = [biSystemMenu, biMaximize]
      BorderStyle = bsDialog
      Caption = 'Add new object'
      ClientHeight = 396
      ClientWidth = 422
      Color = clBtnFace
      Constraints.MinHeight = 423
      Constraints.MinWidth = 428
      Font.Charset = DEFAULT_CHARSET
      Font.Color = clWindowText
      Font.Height = -11
      Font.Name = 'Tahoma'
      Font.Style = []
      OldCreateOrder = False
      Position = poMainFormCenter
      OnHide = FormHide
      PixelsPerInch = 96
      TextHeight = 13
      Object pcObjects: TPageControl
        Left = 0
        Top = 60
        Width = 422
        Height = 302
        ActivePage = tsSynonyms
        Align = alClient
        TabOrder = 0
        OnChange = pcObjectsChange
        Object tsTables: TTabSheet
          Caption = 'Tables'
          Object lTables: TListView
            Left = 0
            Top = 0
            Width = 414
            Height = 247
            Anchors = [akLeft, akTop, akRight, akBottom]
            Columns = <>
            MultiSelect = True
            ReadOnly = True
            TabOrder = 0
            ViewStyle = vsList
            OnDblClick = lListViewDblClick
          End
          Object cbAddFK: TCheckBox
            Left = 6
            Top = 253
            Width = 406
            Height = 17
            Anchors = [akLeft, akBottom]
            Caption = 'Create links from foreign keys'
            Checked = True
            State = cbChecked
            TabOrder = 1
          End
        End
        Object tsViews: TTabSheet
          Caption = 'Views'
          ImageIndex = 1
          Object lViews: TListView
            Left = 0
            Top = 0
            Width = 414
            Height = 274
            Align = alClient
            Columns = <>
            MultiSelect = True
            ReadOnly = True
            TabOrder = 0
            ViewStyle = vsList
            OnDblClick = lListViewDblClick
          End
        End
        Object tsProcedures: TTabSheet
          Caption = 'Procedures'
          ImageIndex = 2
          Object lProcedures: TListView
            Left = 0
            Top = 0
            Width = 414
            Height = 274
            Align = alClient
            Columns = <>
            ReadOnly = True
            TabOrder = 0
            ViewStyle = vsList
            OnDblClick = lListViewDblClick
          End
        End
        Object tsSynonyms: TTabSheet
          Caption = 'Synonyms'
          ImageIndex = 3
          Object lSynonyms: TListView
            Left = 0
            Top = 0
            Width = 414
            Height = 274
            Align = alClient
            Columns = <>
            ReadOnly = True
            TabOrder = 0
            ViewStyle = vsList
            OnDblClick = lListViewDblClick
          End
        End
      End
      Object pTop: TPanel
        Left = 0
        Top = 0
        Width = 422
        Height = 60
        Align = alTop
        TabOrder = 1
        Object lInstruction: TLabel
          Left = 8
          Top = 6
          Width = 390
          Height = 13
          Anchors = [akLeft, akTop, akRight]
          Caption =
            'Select an object and press the "Add Object" button to add new ob' +
            'ject to the query'
          Font.Charset = DEFAULT_CHARSET
          Font.Color = clWindowText
          Font.Height = -11
          Font.Name = 'Tahoma'
          Font.Style = []
          ParentFont = False
          WordWrap = True
        End
        Object lFilterBySchema: TLabel
          Left = 8
          Top = 36
          Width = 147
          Height = 13
          Caption = 'Filter objects by Schema name:'
        End
        Object cbSchemas: TComboBox
          Left = 163
          Top = 32
          Width = 253
          Height = 21
          Style = csDropDownList
          Anchors = [akLeft, akTop, akRight]
          ItemHeight = 0
          TabOrder = 0
          OnChange = cbSchemasChange
        End
      End
      Object pBottom: TPanel
        Left = 0
        Top = 362
        Width = 422
        Height = 34
        Align = alBottom
        TabOrder = 2
        Object bAdd: TButton
          Left = 4
          Top = 4
          Width = 120
          Height = 25
          Anchors = [akLeft, akBottom]
          Caption = '&Add Object'
          Enabled = False
          TabOrder = 0
          OnClick = bAddClick
        End
        Object bClose: TButton
          Left = 340
          Top = 4
          Width = 75
          Height = 25
          Anchors = [akRight, akBottom]
          Cancel = True
          Caption = 'Close'
          Default = True
          TabOrder = 1
          OnClick = bCloseClick
        End
      End
      Object Localizer: TacQBLocalizerForm
        Properties.Strings = (
          'Caption'
          'pcObjects.tsTables.Caption'
          'pcObjects.tsTables.cbAddFK.Caption'
          'pcObjects.tsViews.Caption'
          'pcObjects.tsProcedures.Caption'
          'pcObjects.tsSynonyms.Caption'
          'pTop.lInstruction.Caption'
          'pTop.lFilterBySchema.Caption'
          'pBottom.bAdd.Caption'
          'pBottom.bClose.Caption')
        Left = 16
        Top = 94
      End
    End
     
    Upvote 0
    Cho em hỏi chút là hàm Countif có sử dụng được ở dạng mảng trong vba không ạ? Nếu có thì cách viết như thế nào?

    Em dùng code này nhưng không biết sai ở đâu:

    PHP:
         'Phat hien trung lap
    
    Set Dic1 = CreateObject("Scripting.Dictionary")
    
     Arr() = [C9].Resize(Rws).Value
    
     ReDim dArr(1 To Rws, 1 To 1)
    
     For J = 1 To UBound(Arr())
    
        If Not IsEmpty(Arr(J, 1)) And Not Dic1.exists(Arr(J, 1)) Then
    
                J = J + 1
    
                 Dic1.Add Arr(J, 1), J
    
                 dArr(J, 1) = Arr(J, 1)
    
        Else
    
                 dArr(J, 1) = 2
    
        End If
    
     Next J
    
     [A9].Resize(Rws).Value = dArr()
     
    Lần chỉnh sửa cuối:
    Upvote 0
    Cho em hỏi chút là hàm Countif có sử dụng được ở dạng mảng trong vba không ạ? Nếu có thì cách viết như thế nào?

    Em dùng code này nhưng không biết sai ở đâu:
    PHP:
         'Phat hien trung lap
    Set Dic1 = CreateObject("Scripting.Dictionary")
     Arr() = [C9].Resize(Rws).Value
     ReDim dArr(1 To Rws, 1 To 1)
     For J = 1 To UBound(Arr())
        If Not IsEmpty(Arr(J, 1)) And Not Dic1.exists(Arr(J, 1)) Then
                J = J + 1
                 Dic1.Add Arr(J, 1), J
                 dArr(J, 1) = Arr(J, 1)
        Else
                 dArr(J, 1) = 2
        End If
     Next J
     [A9].Resize(Rws).Value = dArr()
    dùng Dic tương đối khó, phải làm nhiều mới quen được, bạn xem code cột A đếm số lần trùng của cột C
    Mã:
    Set dic1 = CreateObject("Scripting.Dictionary")
     Arr() = [C9].Resize(Rws).Value
    ' gan so lan trung vao Item cua Dic1
     For J = 1 To UBound(Arr())
        If Not IsEmpty(Arr(J, 1)) Then
          If Not dic1.exists(Arr(J, 1)) Then
            dic1.Add Arr(J, 1), 1
          Else
            dic1.Item(Arr(J, 1)) = dic1.Item(Arr(J, 1)) + 1
          End If
        End If
     Next J
    'gan so lan trung vao Darr
     ReDim Darr(1 To Rws, 1 To 1)
     For J = 1 To UBound(Darr())
        If Not IsEmpty(Arr(J, 1)) Then Darr(J, 1) = dic1.Item(Arr(J, 1))
     Next J
    [A9].Resize(Rws).Value = Darr()
     
    Upvote 0
    dùng Dic tương đối khó, phải làm nhiều mới quen được, bạn xem code cột A đếm số lần trùng của cột C
    Mã:
    Set dic1 = CreateObject("Scripting.Dictionary")
     Arr() = [C9].Resize(Rws).Value
    ' gan so lan trung vao Item cua Dic1
     For J = 1 To UBound(Arr())
        If Not IsEmpty(Arr(J, 1)) Then
          If Not dic1.exists(Arr(J, 1)) Then
            dic1.Add Arr(J, 1), 1
          Else
            dic1.Item(Arr(J, 1)) = dic1.Item(Arr(J, 1)) + 1
          End If
        End If
     Next J
    'gan so lan trung vao Darr
     ReDim Darr(1 To Rws, 1 To 1)
     For J = 1 To UBound(Darr())
        If Not IsEmpty(Arr(J, 1)) Then Darr(J, 1) = dic1.Item(Arr(J, 1))
     Next J
    [A9].Resize(Rws).Value = Darr()

    Ồ được rồi, cảm ơn HieuCD nhé :)
     
    Upvote 0
    Cho em hỏi

    Rws = [B9].CurrentRegion.Rows.Count - 8
    Cells(Rws + 9, 1).Resize(65000, 45).Delete

    Em dùng để delete các ô kẻ định dạng... mà không có dữ liệu nhưng càng chạy lệnh file càng phình to hơn. Kiểm tra dòng cuối cùng của sheet thì ban đầu giả sử chưa chạy lệnh là A, sau khi chạy lệnh dòng cuối cùng là A+65000. Tại sao lại như vậy nhỉ. Có cách nào để xóa toàn bộ ô cột định dạng sau dòng dữ liệu cuối cùng không ạ?
     
    Upvote 0
    Web KT

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

    Back
    Top Bottom