Chuyên mục xử lý, gỡ rối code VBA

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

ndu96081631

Huyền thoại GPE
Thành viên BQT
Super Moderator
Tham gia
5/6/08
Bài viết
30,703
Được thích
53,930
Thử như thế này rồi tính tiếp
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
    Application.EnableEvents = False
    If Left(Target.Address(0, 0), 1) = "E" Then
        Target.Offset(, -4).Activate
        MsgBox ActiveCell.Address
        ' Code cua ban
    Else
        Target.Offset(, 2).Activate
    End If
    Application.EnableEvents = True
End Sub

Em chào các thầy các anh, em đang gặp rắc rối ở cái code này

If Target.Column = 3 Then Target.Offset(, 2).Select
If Target.Column = 5 Then Target.Offset(, 1).Select
If Target.Column = 6 Then Target.Offset(1, -3).Select

Nó không còn hoạt động đúng nữa. Em gởi file các thầy các anh xem giúp nhé (ở sheet Lenh.giao.hang ),em xin cám ơn ạ.
 

File đính kèm

  • List box thong minh2.rar
    31.6 KB · Đọc: 25
Upvote 0
Cám ơn Thầy đã quan tâm giúp đỡ em !, em đã chạy thử thấy code rất gọn, chạy êm và nhanh hơn rất nhiều, tuy nhiên khi Prin Priview vẫn bị mờ các nút chức năng Thầy ạ, hơn nữa khi thoát từ nút thoát thì vẫn không thoát hết cả phần excel. em đã thử bằng cách thêm 1 nút lệnh để mở form từ excel (Không cho mở form ngay khi Enable ) thì không mắc lỗi mờ khi Prin Priview, em không hiểu lỗi này là lỗi gì. Rất mong Thầy quan tâm giúp đỡ. Trân trọng biết ơn Thầy
Bạn muốn thoát Excel thì dùng thủ tục này cho nút Đóng:

Mã:
Private Sub cmdThoat_Click()
    Unload Me
    ThisWorkbook.Save
    If Workbooks.Count = 1 Then
        Application.Quit
    Else
        Application.Visible = True
        ThisWorkbook.Close False
    End If
End Sub

Còn việc các nút chức năng bị mờ khi bấm Print Preview như bạn mô tả thì tôi không biết, đây là hình chụp, không thấy nút nào bị mờ cả.
 

File đính kèm

  • Picture1.jpg
    Picture1.jpg
    17.6 KB · Đọc: 92
Upvote 0
Em chào các thầy các anh, em đang gặp rắc rối ở cái code này
If Target.Column = 3 Then Target.Offset(, 2).Select
If Target.Column = 5 Then Target.Offset(, 1).Select
If Target.Column = 6 Then Target.Offset(1, -3).Select
Nó không còn hoạt động đúng nữa. Em gởi file các thầy các anh xem giúp nhé (ở sheet Lenh.giao.hang ),em xin cám ơn ạ.

bạn tải file về kiểm tra xem còn bị ko nhé,

- mình nghĩ lỗi đó là do Sub thaydoi, cụ thể là dòng .Visible = True.
- ko biết làm sao mà nó kich hoạt lại Target tại cột F (Target.column=6) lần thứ 2 --> Sub Hide bị kích hoạt, nếu bạn dùng Msgbox để stop từng đoạn code sẽ thấy việc WS_Selectionchange được kích hoạt như thế nào khi Private Sub Worksheet_Change xảy ra tại Target.Column = 6.
=> đã chuyển sang dùng .BackStyle cho Textbox1 -> hết bị.

'----
- mình đã di chuyển Sub thaydoi và Sub hide vào thẳng module Sheet1 để dễ theo dõi, và có sửa 1 tí code.

Link: https://www.mediafire.com/?jp399bbwr8b8rqu
 
Lần chỉnh sửa cuối:
Upvote 0
Bạn muốn thoát Excel thì dùng thủ tục này cho nút Đóng:

Mã:
Private Sub cmdThoat_Click()
    Unload Me
    ThisWorkbook.Save
    If Workbooks.Count = 1 Then
        Application.Quit
    Else
        Application.Visible = True
        ThisWorkbook.Close False
    End If
End Sub

Còn việc các nút chức năng bị mờ khi bấm Print Preview như bạn mô tả thì tôi không biết, đây là hình chụp, không thấy nút nào bị mờ cả.
Cám ơn Thầy rất nhiều! em cũng không hiểu làm sao em mở vẫn bị mờ, có thể máy của em bị lỗi gì đó, em sẽ thử sang máy khác xem thế nào. Một lần nữa cám ơn Thầy! và chúc Thầy cùng gia đình luôn mạnh khỏe, hạnh phúc. Trân trọng
Em đã thử mở sang máy khác thì không bị lỗi, có thể lỗi này do máy của em có vấn đề Thầy ạ.
 
Lần chỉnh sửa cuối:
Upvote 0
bạn tải file về kiểm tra xem còn bị ko nhé,

- mình nghĩ lỗi đó là do Sub thaydoi, cụ thể là dòng .Visible = True.
- ko biết làm sao mà nó kich hoạt lại Target tại cột F (Target.column=6) lần thứ 2 --> Sub Hide bị kích hoạt, nếu bạn dùng Msgbox để stop từng đoạn code sẽ thấy việc WS_Selectionchange được kích hoạt như thế nào khi Private Sub Worksheet_Change xảy ra tại Target.Column = 6.
=> đã chuyển sang dùng .BackStyle cho Textbox1 -> hết bị.

'----
- mình đã di chuyển Sub thaydoi và Sub hide vào thẳng module Sheet1 để dễ theo dõi, và có sửa 1 tí code.

Ồ! được rồi được rồi anh ơi ! nó chạy được rồi,vui quá. Em cám ơn anh phucbugis rất nhiều ạ.
 
Upvote 0
Dear các bạn!
các bạn nào có thể giúp mình chuyển từ số sang chữ bằng tiếng anh mà đơn vị tiền tệ nằm ngay đầu dòng .. ví dụ trong code mình sẽ post lên đây sẽ mặc định trong excel là (719.43 --> seven hundred nineteen US Dollars and fourty three Cents Only) ... bây giờ trong hợp đồng của công ty mình lại viết đơn vị tiền tệ đứng trước , ví dụ là (719.43 --> US Dollars seven hundred nineteen and fourty three Cents Only).. bây giờ mình phải sửa lại mã code của mình lại sao cho để (US Dollars ) luôn đứng trước hả các bạn? và phải có dấu gạch (-) ở đây nữa (US Dollars seven hundred nineteen and fourty - three Cents Only ).... các bạn biết sửa lại mã code sau thì sửa giúp mình nhé.. hoặc không được thì các bạn cho mã code khác cũng được,miễn sao thoã điều kiện mình là được... Sau đây là mã code của mình :
Public Function USD(WhatNumber)
Dim ToRead, NumString, Group, Word As String
Dim I, J As Byte, W, X, Y, Z As Double
Dim FristColum, SecondColum, ReadMetho
If WhatNumber = 0 Then
ToRead = "None"
Else
If Abs(WhatNumber) >= 1E+15 Then
ToRead = "Too long number ???"
Else
FristColum = Array("None", "One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine", "Ten", "Eleven", "Twelve", "Thirteen", "Fourteen", "Fifteen", "Sixteen", "Seventeen", "Eightteen", "Nineteen")
SecondColum = Array("None", "None", "Twenty", "Thirty", "Forty", "Fifty", "Sixty", "Seventy", "Eighty", "Ninety")
ReadMetho = Array("None", "Trillion", "Billion", "Million", "Thousand", "", "Cents Only.")
If WhatNumber < 0 Then
ToRead = "Minus" & Space(1)
Else
ToRead = Space(0)
End If
NumString = Format(Abs(WhatNumber), "##############0.00")
NumString = Right(Space(15) & NumString, 18)
For I = 1 To 6
Group = Mid(NumString, I * 3 - 2, 3)
If Group <> Space(3) Then
Select Case Group
Case "000"
If I = 5 And Abs(WhatNumber) > 1 Then
Word = Space(1)
Else
Word = Space(0)
End If
Case ".00"
Word = "Cents Only"
Case Else
X = Val(Left(Group, 1))
Y = Val(Mid(Group, 2, 1))
Z = Val(Right(Group, 1))
W = Val(Right(Group, 2))
If X = 0 Then
Word = Space(0)
Else
Word = FristColum(X) & Space(1) & "Hundred" & Space(1)
If W > 0 And W < 21 Then
Word = Word & Space(1)
End If
End If
If I = 6 And Abs(WhatNumber) > 1 Then
Word = "And" & Space(1) & Word
End If
If W < 20 And W > 0 Then
Word = Word & FristColum(W) & Space(1)
Else
If W >= 20 Then
Word = Word & SecondColum(Y) & Space(1)
If Z > 0 Then
Word = Word & FristColum(Z) & Space(1)
End If
End If
End If
Word = Word & ReadMetho(I) & Space(1)
End Select
ToRead = ToRead & Word
End If
Next I
End If
End If
USD = UCase(Left(ToRead, 1)) & Mid(ToRead, 2)
End Function
 
Upvote 0
bạn tải file về kiểm tra xem còn bị ko nhé,

- mình nghĩ lỗi đó là do Sub thaydoi, cụ thể là dòng .Visible = True.
- ko biết làm sao mà nó kich hoạt lại Target tại cột F (Target.column=6) lần thứ 2 --> Sub Hide bị kích hoạt, nếu bạn dùng Msgbox để stop từng đoạn code sẽ thấy việc WS_Selectionchange được kích hoạt như thế nào khi Private Sub Worksheet_Change xảy ra tại Target.Column = 6.
=> đã chuyển sang dùng .BackStyle cho Textbox1 -> hết bị.

'----
- mình đã di chuyển Sub thaydoi và Sub hide vào thẳng module Sheet1 để dễ theo dõi, và có sửa 1 tí code.

Chào anh phucbugis anh có thể sửa lại listbox file List box thong min (1).rar để khi gõ vào textbox, listbox show ra có thêm 3 cột nữa như mẩu file này không ? . 3 cột này chỉ để xem, khi enter chỉ có tên hàng được nhập vào textbox ,3 cột còn lại không cần nhập vào bảng tín( không cần nhập vào textbox và ô nào cả)

Cám ơn các anh đã quan tâm xem giúp, nhưng hôm nay em đã tự mò tìm làm được rồi té ra không cần làm gì nhiều, chỉ cần tăng thêm cột ở listbox và thêm cột ở sub loc là được rồi vui ghê@$@!^%
 

File đính kèm

  • file mau show listbox.rar
    32.8 KB · Đọc: 22
Lần chỉnh sửa cuối:
Upvote 0
Dear các bạn!
các bạn nào có thể giúp mình chuyển từ số sang chữ bằng tiếng anh mà đơn vị tiền tệ nằm ngay đầu dòng .. ví dụ trong code mình sẽ post lên đây sẽ mặc định trong excel là (719.43 --> seven hundred nineteen US Dollars and fourty three Cents Only) ... bây giờ trong hợp đồng của công ty mình lại viết đơn vị tiền tệ đứng trước , ví dụ là (719.43 --> US Dollars seven hundred nineteen and fourty three Cents Only).. bây giờ mình phải sửa lại mã code của mình lại sao cho để (US Dollars ) luôn đứng trước hả các bạn? và phải có dấu gạch (-) ở đây nữa (US Dollars seven hundred nineteen and fourty- three Cents Only ).... các bạn biết sửa lại mã code sau thì sửa giúp mình nhé.. hoặc không được thì các bạn cho mã code khác cũng được,miễn sao thoã điều kiện mình là được... Sau đây là mã code của mình :

Hàm của bạn thì tôi không sửa gì cả, mà tôi chỉ viết hàm chỉ dành riêng cho trường hợp của bạn thôi:

Mã:
Function USD(ByVal Series As String) As String
    Application.Volatile
    Series = Replace(Series, " ", "")
    If Not IsNumeric(Series) Then Exit Function
    Dim IsNegative As Boolean
    If Left(Series, 1) = "-" Then
        IsNegative = True
        Series = Replace(Series, "-", "")
    End If
    If Series = "" Then Exit Function
    If Val(Series) = 0 Then
        USD = "US dollar zero."
        Exit Function
    ElseIf Val(Series) = 1 Then
        USD = "US dollar one."
        Exit Function
    End If
    If Val(Series) >= 1E+15 Then
        USD = "No result (huge number)."
        Exit Function
    End If
    Static DigitString
    Dim Deci As String, Digi As String
    Dim arrUnits, SplitArr, SplitArray, JoinArr()
    Dim i As Long, n As Long, m As Long, Ubd As Long
    arrUnits = DecimalSpelling(Series)
    Digi = arrUnits(0)
    Deci = arrUnits(1)
    If Digi = 0 Then
        USD = "US dollar zero" & Deci
    ElseIf Digi = 1 Then
        USD = "US dollar one" & Deci
    Else
        If Not IsArray(DigitString) Then
            DigitString = Array("Hundred", " thousand", " million", " billion", " trillion")
        End If
        SplitArray = Split(Digi, ",")
        Ubd = UBound(SplitArray)
        ReDim SplitArr(0 To Ubd)
        For i = Ubd To 0 Step -1
            SplitArr(n) = SplitArray(i)
            n = n + 1
        Next
        Dim Itm As String
        For i = Ubd To 0 Step -1
            Itm = SplitArr(i)
            If i = 0 Then
                ReDim Preserve JoinArr(0 To m)
                JoinArr(m) = Hundreds(Itm)
            Else
                ReDim Preserve JoinArr(0 To m)
                JoinArr(m) = Hundreds(Itm) & DigitString(i)
            End If
            m = m + 1
        Next
        Digi = Join(JoinArr, " ")
        If Left(Digi, 4) = "zero" Then
            Digi = "US dollar " & Digi
        Else
            Digi = "US dollars " & Digi
        End If
        If Deci > "" Then
            USD = Digi & Deci
        Else
            USD = Digi & "."
        End If
    End If
    If IsNegative Then
        USD = "(Negative) " & USD 'You can use "Minus" instead of "Negative"
    End If
End Function

Và còn một số hàm hỗ trợ trong file đính kèm.

Cách mà hàm thực hiện như sau:

Là số âm, thêm (Negative) ở đầu:

-2 : (Negative) US dollars two.
-0.35 : (Negative) US dollar zero and thirty-five cents.

Là số đứng trước số thập phân bằng 0 hoặc bằng 1 thì "dollar" không có "s":

0 : US dollar zero.
0.59 : US dollar zero and fifty-nine cents.
-0.02 : (Negative) US dollar zero and two cents.
1 : US dollar one.

Là số đứng trước số thập phân lớn hơn 1 thì "dollar" có "s":

2.09 : US dollars two and nine cents.
234.56 : US dollars two hundred thirty-four and fifty-six cents.
2,323.00 : US dollars two thousand three hundred twenty-three.
78.00 : US dollars seventy-eight.

Với các số thập phân có nhiều đơn vị thì chỉ rút gọn thành 2 đơn vị (hàng chục và hàng đơn vị):

100.5679 : US dollars one hundred and fifty-seven cents.
1.7957 : US dollar one and eighty cents.

Với các số thập phân bằng n.01 thì "cent" không có "s":

39.01 : US dollars thirty-nine and one cent.
1.01 : US dollar one and one cent.
-0.01 : (Negative) US dollar zero and one cent.

Nếu là rỗng hay là chuỗi thì không hiện kết quả:

"" : ""
Hoàng Trọng Nghĩa : ""
 

File đính kèm

  • USdollars.xls
    53 KB · Đọc: 11
Lần chỉnh sửa cuối:
Upvote 0
Cho mình hỏi code này sai chỗ nào?

Mình có dữ liệu ở Sheets("PL Result"), giờ muốn copy dữ liệu sang 1 sheet khác theo điều kiện lọc là giá trị của ô: Sheets("KQ Theo doi").Cells(1, 6), những thấy báo lỗi ở: Arr(iR, 1) = Selection.Cells(i, 1).Value
Mọi người giúp mình với.

Code:


Sub KQTheodi_Chay()


Dim Arr(1 To 40, 1 To 6), i, j As Long
Dim iR As Long


Range("A25:F65").ClearContents
i = 1
Sheets("PL Result").Select
Range("A4:F4").Select
Range(Selection, Selection.End(xlDown)).Select
j = Selection.Rows.Count
For iR = 1 To j Step 1
If Selection.Cells(iR, 2).Value = Sheets("KQ Theo doi").Cells(1, 6).Value Or Selection.Cells(iR, 4).Value = Sheets("KQ Theo doi").Cells(1, 6).Value Then
Arr(iR, 1) = Selection.Cells(i, 1).Value
Arr(iR, 2) = Selection.Cells(i, 2).Value
Arr(iR, 3) = Selection.Cells(i, 3).Value
Arr(iR, 4) = Selection.Cells(i, 4).Value
Arr(iR, 5) = Selection.Cells(i, 5).Value
Arr(iR, 6) = Selection.Cells(i, 6).Value
i = i + 1
End If
Next iR
Sheets("KQ Theo doi").Select
Range("A25:F65").Value = Arr



End Sub
 
Upvote 0
Mình có dữ liệu ở Sheets("PL Result"), giờ muốn copy dữ liệu sang 1 sheet khác theo điều kiện lọc là giá trị của ô: Sheets("KQ Theo doi").Cells(1, 6), những thấy báo lỗi ở: Arr(iR, 1) = Selection.Cells(i, 1).Value
Mọi người giúp mình với.

Code:


Sub KQTheodi_Chay()


Dim Arr(1 To 40, 1 To 6), i, j As Long
Dim iR As Long


Range("A25:F65").ClearContents
i = 1
Sheets("PL Result").Select
Range("A4:F4").Select
Range(Selection, Selection.End(xlDown)).Select
j = Selection.Rows.Count
For iR = 1 To j Step 1
If Selection.Cells(iR, 2).Value = Sheets("KQ Theo doi").Cells(1, 6).Value Or Selection.Cells(iR, 4).Value = Sheets("KQ Theo doi").Cells(1, 6).Value Then
Arr(iR, 1) = Selection.Cells(i, 1).Value
Arr(iR, 2) = Selection.Cells(i, 2).Value
Arr(iR, 3) = Selection.Cells(i, 3).Value
Arr(iR, 4) = Selection.Cells(i, 4).Value
Arr(iR, 5) = Selection.Cells(i, 5).Value
Arr(iR, 6) = Selection.Cells(i, 6).Value
i = i + 1
End If
Next iR
Sheets("KQ Theo doi").Select
Range("A25:F65").Value = Arr



End Sub
Lướt sơ qua thì thấy code "mém" trúng nhưng không có file thì chẳng biết sửa chỗ nào
 
Upvote 0
Bạn khai báo biến Arr() 40 dòng, bạn cho chạy iR từ 1 đến 446, và bạn gán giá trị cho Arr(iR, 1) thì báo lỗi từ dòng thứ 41 trở đi.
Bạn sửa lại vòng lặp thế này:
PHP:
For i = 1 To j Step 1
    If Selection.Cells(i, 2).Value = Sheets("KQ Theo doi").Cells(1, 6).Value Or _
    Selection.Cells(i, 4).Value = Sheets("KQ Theo doi").Cells(1, 6).Value Then
        iR = iR + 1
        Arr(iR, 1) = Selection.Cells(i, 1).Value
        Arr(iR, 2) = Selection.Cells(i, 2).Value
        Arr(iR, 3) = Selection.Cells(i, 3).Value
        Arr(iR, 4) = Selection.Cells(i, 4).Value
        Arr(iR, 5) = Selection.Cells(i, 5).Value
        Arr(iR, 6) = Selection.Cells(i, 6).Value
    End If
Next i

Bạn đã sử dụng mảng thì nghiên cứu sử dụng 1 mảng cho dữ liệu nguồn luôn, khỏi selection.Cells()
Ngoài ra 6 cột được gán giá trị lần lượt, thì dùng thêm 1 vòng lặp For con.

Đại khái như vầy:
PHP:
Sub KQTheodi_Chay()


Dim Arr(1 To 41, 1 To 6), i, jcount As Long
Dim iR As Long, EndRw As Long, SArr()
Range("A25:F65").ClearContents
EndRw = Sheets("PL Result").Range("A4").End(xlDown).Row
SArr = Sheets("PL Result").Range("A4:F" & EndRw).Value
jcount = UBound(SArr, 1)
For i = 1 To jcount Step 1
    If SArr(i, 2) = Cells(1, 6).Value Or _
    SArr(i, 4) = Cells(1, 6).Value Then
        iR = iR + 1
        For k = 1 To 6
            Arr(iR, k) = SArr(i, k)
        Next k
    End If
Next i
Range("A25:F65").Value = Arr
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
bạn tải file về kiểm tra xem còn bị ko nhé,

- mình nghĩ lỗi đó là do Sub thaydoi, cụ thể là dòng .Visible = True.
- ko biết làm sao mà nó kich hoạt lại Target tại cột F (Target.column=6) lần thứ 2 --> Sub Hide bị kích hoạt, nếu bạn dùng Msgbox để stop từng đoạn code sẽ thấy việc WS_Selectionchange được kích hoạt như thế nào khi Private Sub Worksheet_Change xảy ra tại Target.Column = 6.
=> đã chuyển sang dùng .BackStyle cho Textbox1 -> hết bị.

'----
- mình đã di chuyển Sub thaydoi và Sub hide vào thẳng module Sheet1 để dễ theo dõi, và có sửa 1 tí code.

Chào các Thầy và các anh, xin cho em hỏi file List box thong min (1).rar em đã dùng thử nhiều lần chạy rất tốt, khi gõ vào textbox --> ra listbox --> chọn tên --> enter --> tên được nhập vào textbox.

Nhưng còn khuyết điểm: không hiểu sao đến bước enter --> tên ta vừa chọn không cập nhật nhập ngay vào ô có textbox mà vẫn là từ ta vừa nhập lúc nảy, đến khi xuống dòng,ô có textbox mới được chọn --> xuất hiện textbox, lúc này tên mới được nhập vào ô textbox củ. Chỉ thỉnh thoảng 1 vài lần tên có nhập ngay vào textbox.

Ví dụ cụ thể: chọn C9 --> hiện textbox --> gỏ b --> listbox hiện --> chọn dòng Hàng B --> enter --> listbox biến mất, lẻ ra ở bước này dòng chữ Hàng B phải nhập vào C9 nhưng không, ô C9 vẫn là chữ b. Đến khi chọn ô C10 --> hiện textbox mới, lúc này ô C9 mới được cập nhật nhập vào dòng chữ Hàng B.

Tiếp tục gỏ c vào textbox mới hiện ở C10 --> hiện listbox --> chọn dòng Hàng C --> enter --> listbox biến mất, lẻ ra dòng chử Hàng C phải được nhập vào C10 luôn, nhưng không vẫn là chử c . Đến khi C11 được chọn, textbox xuất hiện, C10 mới được cập nhật dòng chử Hàng C, tiếp tục cứ như vậy, phải hiện textbox mới thì dòng tên ta chọn trong listbox của textbox củ mới được nhập vào ô củ. Điều này dẫn đến cái bất tiện khác là khi listbox có nhiều dòng tên, lở chọn sai tên --> gõ enter --> do không không cập nhật ngay --> không phát hiện mình đã chọn sai, phải gõ hết một dòng cho đến khi xuống dòng mới mới phát hiện sai.

Trong khi đó file List box thong minh2.rar ở bài #101 không bị cập nhật trể như thế.

Vậy phải làm sao để khắc phục, em xin các Thầy các Anh giúp đỡ nhé. Em rất cám ơn ạ.
 
Lần chỉnh sửa cuối:
Upvote 0
Chào các Thầy và các anh, xin cho em hỏi file List box thong min (1).rar ....
hehe,
- thấy bạn vọc tới vọc lui cái này lâu nay rồi mà vẫn "chưa nhuyễn" được --=0,
- khi làm việc với các ActiveX Controls tại sheet sẽ gặp khá nhiều hạn chế (đặc biệt là các sự kiện tại Sheet)
---> để giải quyết triệt để và phải tính đến chuyện lâu dài về sau, thay vì theo đuổi cái đó bạn chịu khó đi thêm bước nữa là làm việc trên UserForm --> rất nhiều ưu điểm.
 
Upvote 0
Các anh chị ơi, mình tạo hàm liên kết tới 1 class nhưng sao nó lại báo [#REF!] vậy các anh chị? Mình làm sai chỗ nào hả?
Còn nữa, với hai hàm [ham1,ham2] này thì làm sao để quy định lược rút dữ liệu từ class ra sao cho [ham1] phải chạy luôn luôn trước [ham2]?


MODULE:
Mã:
Private i_fc1 As i_fc
Private i_fc2 As i_fc
Private fl As Boolean


Private Sub ini()
fl = True
Set i_fc1 = New i_fc
Set i_fc2 = New i_fc
End Sub


'##########
Function ham1(c As Range)
Dim i As Long


If Not fl Then Call ini


For i = 0 To 100000
    i = i
Next i
i_fc2.ii_fc = c.Value - 1
ham1 = c.Value
End Function


'##########

Function ham2(c As Range)
If Not fl Then Call ini


i_fc1.ii_fc = c.Value
ham2 = i_fc2.ii_fc
End Function
 

File đính kèm

  • Book1.xlsm
    15.4 KB · Đọc: 3
Upvote 0
Các anh chị ơi, mình tạo hàm liên kết tới 1 class nhưng sao nó lại báo [#REF!] vậy các anh chị? Mình làm sai chỗ nào hả?
Còn nữa, với hai hàm [ham1,ham2] này thì làm sao để quy định lược rút dữ liệu từ class ra sao cho [ham1] phải chạy luôn luôn trước [ham2]?
Vấn đề thứ nhất: Với Excel 2007 trở lên thì có cột HAM nên HAM1, HAM2 là những địa chỉ ô, do đó Excel sẽ không chịu để cho bạn đặt chúng thành tên hàm. Bạn sửa lại thành Ham_1, Ham_2 chẳng hạn thì sẽ được.

Vấn đề thứ hai: Muốn hàm 1 chạy trước hàm 2 thì bạn đặt lồng Ham_1 vào đầu trong Ham_2 rồi sử dụng Ham_2, như vậy khi gọi Ham_2 thì VBA sẽ tính Ham_1 trước.
 
Upvote 0
Mọi người cho mình hỏi. sau khi mình viết code VBA cho các sheet trong bảng tính rồi. Sau khi đưa vào nhập số liêu thì không mở khoá được sheet ( Unprotet sheet ), không mở lại được VBA để xem code mình viết, không delete được sheet ( vẫn insert sheet được). Vào Hepl đọc thì hiểu rằng Visual Basic gặp phải một lỗi mà được tạo ra bởi hệ thống hoặc một thành phần bên ngoài. Ai khắc phục được lỗi này giúp tớ với.
 
Upvote 0
Mọi người cho mình hỏi. sau khi mình viết code VBA cho các sheet trong bảng tính rồi. Sau khi đưa vào nhập số liêu thì không mở khoá được sheet ( Unprotet sheet ), không mở lại được VBA để xem code mình viết, không delete được sheet ( vẫn insert sheet được). Vào Hepl đọc thì hiểu rằng Visual Basic gặp phải một lỗi mà được tạo ra bởi hệ thống hoặc một thành phần bên ngoài. Ai khắc phục được lỗi này giúp tớ với.
bạn nên gửi file đó lên diễn đàn GPE để mọi người tìm cách "xử lý nó" !!!
 
Upvote 0
Upvote 0
Status
Không mở trả lời sau này.
Web KT
Back
Top Bottom