Chuyên mục xử lý, gỡ rối code VBA (1 người xem)

Liên hệ QC

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

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,970
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

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

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

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

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
mình đã mở khóa toàn bộ các sheet + Project VBA (mà sao chỉ thấy toàn là code tại module của sheet **~**)
file của bạn đây: https://www.mediafire.com/?ln09419fa1gk222
Trước hết em cảm ơn bác nhiều nha. }}}}}
file này của em như tiêu đề của nó tức là nhật kí của từng ngày, vì thế em viết code cho 1 sheet rồi move and copi thành 31 sheet. Mặt khác trong file có các sheet ko chứa code lên em ko dùng Macro cho toàn bộ file trong sheet được.
Bác có thể hướng dẫn em cách bác unclok file trên được ko? em ko phải người nhập dữ liệu lên em sợ file của em lại bị như thế nhiều lần nữa lại phải mang làm phiền bác thì ngại lắm. |||||
 
Upvote 0
Trước hết em cảm ơn bác nhiều nha. }}}}}
file này của em như tiêu đề của nó tức là nhật kí của từng ngày, vì thế em viết code cho 1 sheet rồi move and copi thành 31 sheet. Mặt khác trong file có các sheet ko chứa code lên em ko dùng Macro cho toàn bộ file trong sheet được.
Nếu các sheet đó có cấu trúc giống nhau --> bạn có thể gộp chung bằng cách dùng sự kiện Workbook_SheetChange tại Module ThisWorkbook thay vì cài ở từng sheet như thế.
Bác có thể hướng dẫn em cách bác unclok file trên được ko? em ko phải người nhập dữ liệu lên em sợ file của em lại bị như thế nhiều lần nữa lại phải mang làm phiền bác thì ngại lắm. |||||
- mình có search trên diễn đàn GPE (vài trang đầu) về cách mở "Project is Unviewable" nhưng ko thấy và đã tìm trên Google thì có giải thích chi tiết tại đây "Project is Unviewable" - Excel add-in (#4) (www.mrexcel.com). Riêng bài đó mình chỉ góp ý với bạn, bước 5 --> phải dùng 1 "công cụ khác" để kiểm tra pass của VBA-Project (trên GPE ko được phép share, bạn có thể nhắn tin riêng cho mình **~**)
- khi bảo vệ 1 file Excel để tránh người bình thường đụng vào Code thì bạn chỉ cần đặt pass cho VBA-Project là đủ (ko cần gì phải "khóa kỹ" như vậy)
 
Lần chỉnh sửa cuối:
Upvote 0
Nếu các sheet đó có cấu trúc giống nhau --> bạn có thể gộp chung bằng cách dùng sự kiện Workbook_SheetChange tại Module ThisWorkbook thay vì cài ở từng sheet như thế.

- mình có search trên diễn đàn GPE (vài trang đầu) về cách mở "Project is Unviewable" nhưng ko thấy và đã tìm trên Google thì có giải thích chi tiết tại đây "Project is Unviewable" - Excel add-in (#4) (www.mrexcel.com). Riêng bài đó mình chỉ góp ý với bạn, bước 5 --> phải dùng 1 "công cụ khác" để kiểm tra pass của VBA-Project (trên GPE ko được phép share, bạn có thể nhắn tin riêng cho mình **~**)
- khi bảo vệ 1 file Excel để tránh người bình thường đụng vào Code thì bạn chỉ cần đặt pass cho VBA-Project là đủ (ko cần gì phải "khóa kỹ" như vậy)
Hi, em lập pass như vậy là do bảng này dùng cho nhiều người, người biết và không biết exel đều có. mà bảng này cần dữ liệu hàng giờ. em sợ mọi người nhập sai rồi tự sửa nhưng sửa không đúng bệnh thì toàn bộ hệ thống liên quan coi như ko làm việc bác ạ.
Một lần nữa cảm ơn bác nhiều nha. còn về phần mở pass đó em nghĩ ko cần vì pas này do em đặt ra mà. ^^. --=0
 
Upvote 0
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.

Em củng có nghe nói về những hạn chế này, nhưng thấy anh làm hay quá, không ngờ rằng nó lại có giới hạn nhanh như vậy,em đã dùng thử trên form rồi, vẫn có khó khăn về mặt nhập dữ liệu , em phải liên tục luân phiên liên gõ nhập trên form và nhập trực tiếp trên sheet làm chậm tốc độ gõ nhập.

Em cố chỉnh sữa file List box thong min (1).rar sao cho textbox listbox đang hoạt động ở cột C chuyễn sang hoạt động ở cột B, nhưng loay hoay mãi chỉ dời được textbox qua cột B thôi, các phần còn lại em tìm không ra nói chung là làm không được, anh chuyễn giúp em nhe ? cám ơn anh nhiều.
 
Upvote 0
Em củng có nghe nói về những hạn chế này, nhưng thấy anh làm hay quá, không ngờ rằng nó lại có giới hạn nhanh như vậy,em đã dùng thử trên form rồi, vẫn có khó khăn về mặt nhập dữ liệu , em phải liên tục luân phiên liên gõ nhập trên form và nhập trực tiếp trên sheet làm chậm tốc độ gõ nhập.

Em cố chỉnh sữa file List box thong min (1).rar sao cho textbox listbox đang hoạt động ở cột C chuyễn sang hoạt động ở cột B, nhưng loay hoay mãi chỉ dời được textbox qua cột B thôi, các phần còn lại em tìm không ra nói chung là làm không được, anh chuyễn giúp em nhe ? cám ơn anh nhiều.

không thể thực hiện được, như tôi đã có bài hỏi ở bài #90
khi bạn enter, excel mặc dịnh hiểu là enter
mặc dù bạn viết code ép cho nó nhảy lại lại nhưng nó vẩn hiểu là enter (xuống hàng)
bạn hãy thử code ví dụ ở bài 86 xem
cụ thể trong bài của bạn khi bạn kết thúc ở cột F (bằng phím enter, thì nó hiểu là ở cột F, chứ ko phải là cột A nên các textbox không được kích hoạt)

tôi nghĩ bạn nên tìm đường khác để đi
dùng form chẳng hạn hay protect sheet chỉ chừa lại 3 cái cột đó để nhập liệu.v.v.v.
 
Upvote 0
Cám ơn Let'GâuGâu nhé, ý em là em muốn tạo một sheet mới có textbox-listbox ở hoạt động ở cột khác (cột B) sau khi thay đổi

Cells(ActiveCell.Row, 3).Value = ActiveSheet.ListBox1.Value
thành
Cells(ActiveCell.Row, 2).Value = ActiveSheet.ListBox1.Value

If Not Intersect(Target, Range("C9:C1000")) Is Nothing Then
thành
If Not Intersect(Target, Range("B9:B1000")) Is Nothing Then

khi chọn vào cột B, textbox có hiện ở cột B nhưng listbox vẫn ở cột C không chịu đi chung với textbox, khi chọn tên trên listbox--> enter không thấy tên nhập vào ô textbox.

Code này chưa tính tới
PHP:
If Target.Column = 3 Then
            Range("E" & Target.Row).Select
            'hoac: Target.Offset(, 2).Select
        End If
                If Target.Column = 5 Then Target.Offset(, 1).Select
        If Target.Column = 6 Then Target.Offset(1, -3).Select

tôi nghĩ bạn nên tìm đường khác để đi
dùng form chẳng hạn hay protect sheet chỉ chừa lại 3 cái cột đó để nhập liệu.v.v.v.

Anh có thể làm giúp theo như ý anh nói không vì cái này còn quá mới em chưa biết gì cã
 
Lần chỉnh sửa cuối:
Upvote 0
tôi nghĩ bạn nên tìm đường khác để đi
dùng form chẳng hạn hay protect sheet chỉ chừa lại 3 cái cột đó để nhập liệu.v.v.v.
Anh có thể làm giúp theo như ý anh nói không vì cái này còn quá mới em chưa biết gì cã
Tôi thấy bạn cứ lòng vòng hoài với các controls trong sheet, tôi thấy mệt mỏi cho bạn quá! Tôi làm cái file này trên UserForm để bạn dễ dàng nhập dữ liệu.

Tôi tạm làm trên 1 sheet (LENH GIAO HANG) để bạn trải nghiệm thử với UserForm.

1) Vào sheet đó, bấm nút lệnh SHOW FORM để form được hiện ra, mặc định form sẽ truyền tham số STT và ngày hiện hành tại đó.

2) Từ textbox Ngày, bạn Enter để đến ComboBox Tên hàng, tại đây sẽ xổ ra danh sách, bạn có thể gõ để lọc tên hàng bạn cần.

3) Tương tự với Tên Hàng, Cbb Khu vực cũng thế.

4) Bạn phải điền đầy đủ các giá trị khác vào các textbox còn lại, ngoại trừ Ghi chú (vì có thể ghi hoặc không), nếu không sẽ không Nhập Liệu được.

5) Bấm nút Nhập Liệu để hoàn tất việc nhập mới.

6) Bạn muốn xóa hay chỉnh sửa ư? Double Click vào mục nào đó trên ListBox, một thông báo sẽ hiện ra hỏi bạn sẽ làm gì.

6.1) Nếu bạn chọn xóa (bấm No) thì một thông báo khác hỏi bạn có chắn muốn xóa, nếu Yes thì cho em vào hậu viên luôn.

6.2) Nếu bạn chọn chỉnh sửa (bấm Yes) thì dữ liệu tại hàng được chọn của ListBox sẽ chuyển lên trên các TextBox và ComboBox trong Form để bạn tùy ý chỉnh sửa mục nào bạn muốn sửa.

7) Cũng như nút Nhập Liệu, nút Lưu Chỉnh Sửa sẽ cập nhật những thông tin bạn vừa chỉnh sửa trong sheet.
 

File đính kèm

Upvote 0
Tôi thấy bạn cứ lòng vòng hoài với các controls trong sheet, tôi thấy mệt mỏi cho bạn quá! Tôi làm cái file này trên UserForm để bạn dễ dàng nhập dữ liệu.

Tôi tạm làm trên 1 sheet (LENH GIAO HANG) để bạn trải nghiệm thử với UserForm.

Anh Trọng Nghĩa giỏi quá! Form anh làm rất hay rất đẹp, trong cứ y như đang dùng phần mềm chuyên nghiệp vậy, em cám ơn anh rất nhiều ạ.
 
Upvote 0
Nhờ giải thích giúp lỗi

Mình sử dụng đoạn code bên dưới để load dữ liệu từ file access vào file excel.
Nhưng khi chạy thì báo lỗi "User-defined type not defined"

Nhờ các bạn xem hướng dẫn mình khắc phục giúp.
Mình cảm ơn!

Mã:
Sub loaddata(DBFullName As String, TargetRange As Range)
   Dim i, J, Cco
   Dim cn As ADODB.Connection, Rs As ADODB.Recordset, intColIndex As Integer
   Set TargetRange = TargetRange.Cells(1, 1)
   Set cn = New ADODB.Connection
   cn.Open "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & DBFullName & ";"
   Set Rs = New ADODB.Recordset
   Dim Cd, Luc, Momen As Double
    If Chocolumnn.op1.Value = True Then
        Cco = 0
        Call Delete_All
    Else
        Cco = Dem() - 1
    End If
    With Rs
        .Open "SELECT [Column Forces].column,[Frame Assignments Summary].AnalysisSect,[Column Forces].loc,[Column Forces].story,[Column Forces].load,[Frame Assignments Summary].length,[Frame Section Properties].depth,[Frame Section Properties].widthtop,[Column Forces].p,[Column Forces].m2,[Column Forces].m3,[Column Forces].v2,[Column Forces].v3,[Control Parameters].CurrUnits FROM [Column Forces],[Frame Assignments Summary],[Frame Section Properties],[Control Parameters] WHERE [Column Forces].column = [Frame Assignments Summary].line and [Column Forces].story=[Frame Assignments Summary].story and [Frame Assignments Summary].AnalysisSect=[Frame Section Properties].SectionName", cn, , , adCmdText
        .MoveFirst
        Cells(13, 20).Value = .Fields(13).Value
        Cd = Sheets("Data").Cells(5, 18).Value
        Luc = Sheets("Data").Cells(5, 15).Value
        Momen = Sheets("Data").Cells(5, 16).Value
        i = 1
        i = i + Cco
        Range("A18").Select
        Do
            Range("A17:T17").Copy TargetRange.Offset(i, 0)
            TargetRange.Offset(i, 0).Activate
            TargetRange.Offset(i, 0).Value = i
            TargetRange.Offset(i, 1).Value = .Fields(0).Value
            TargetRange.Offset(i, 2).Value = .Fields(1).Value
            TargetRange.Offset(i, 3).Value = .Fields(2).Value
            TargetRange.Offset(i, 4).Value = .Fields(3).Value
            TargetRange.Offset(i, 5).Value = .Fields(4).Value
            TargetRange.Offset(i, 6).Value = Math.Round(Math.Abs(.Fields(6).Value) * Cd, 5)
            TargetRange.Offset(i, 7).Value = Math.Round(Math.Abs(.Fields(7).Value) * Cd, 5)
            'TargetRange.Offset(I, 8).Value = Cells(29, 11).Value
            TargetRange.Offset(i, 9).Value = Math.Round(Math.Abs(.Fields(5).Value) * Cd, 5)
            TargetRange.Offset(i, 10).Value = Math.Abs(.Fields(8).Value) * Luc
            TargetRange.Offset(i, 11).Value = Math.Abs(.Fields(9).Value) * Momen
            TargetRange.Offset(i, 12).Value = Math.Abs(.Fields(10).Value) * Momen
            TargetRange.Offset(i, 13).Value = Math.Abs(.Fields(11).Value) * Luc
            TargetRange.Offset(i, 14).Value = Math.Abs(.Fields(12).Value) * Luc
            .MoveNext
            i = i + 1
        Loop Until .EOF
            Range("A18").Select
    End With
    Rs.Close
    Set Rs = Nothing
    cn.Close
    Set cn = Nothing
End Sub

Function Dem()
Dim jj
    Range("A17").Select
    jj = 0
    Do While Not IsEmpty(ActiveCell)
        ActiveCell.Offset(1, 0).Select
        jj = jj + 1
    Loop
    Dem = jj
    Range("A18").Select
End Function
 
Upvote 0
Bạn chưa Refernce cái mớ Microsoft ActiveX Data... cho nên VBA không hiểu ba cái ADODB là cái gì.
 
Upvote 0
Nhờ mọi người giải thích giùm đoạn code này ạ

Mã:
Private Sub ComboBox1_Change()
ActiveCell = ComboBox1.Column(0)
ActiveCell.Offset(0, 1) = ComboBox1.Column(1)
ActiveCell.Offset(0, 2) = ComboBox1.Column(2)
End Sub
Mã:
Private Sub ComboBox1_Change()
ActiveCell = ComboBox1.Column(0)
ActiveCell.Offset(0, 1) = ComboBox1.Column(1)
ActiveCell.Offset(0, 2) = ComboBox1.Column(2)
End Sub
Sub Worksheet_Selectionchange(ByVal target As Range)
  With ComboBox1
  On Error Resume Next
    If target.Column = 3 Then
      .Visible = True
      .Top = target.Top
      .Height = target.Height
      .Left = target.Left
      .Width = target.Width
      .LinkedCell = target
    ElseIf Application.CutCopyMode = False Then
        .Visible = False
    End If
  End With
End Sub
Ở trong file này ạ, Em cảm ơn!!
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Giải thích code

Thông thường em gặp đoạn code có dạng này nhưng không hiểu sâu về nó. Nhờ các bác hướng dẫn dùm. Cảm ơn.
Sub DuyetTB()
Dim i As Long
With TD
For i = 1 To 5
Cells(10, i) = .Controls("TB" & i).Value
Next i
End With
End Sub
Mình hiểu là người dùng code For next
1. With TD. Hỏi TD là gì có thể thay TD bằng chữ khác được chứ (GP) chẳng hạn?
2. For i từ 1 đến 5 vậy có phải i=15 không?
3. Cells(10, i) = .Controls("TB" & i).ValueDòng này mình không hiểu về nó.
Mong các bác trợ giúp cảm ơn.
 
Upvote 0
Thông thường em gặp đoạn code có dạng này nhưng không hiểu sâu về nó. Nhờ các bác hướng dẫn dùm. Cảm ơn.

Mình hiểu là người dùng code For next
1. With TD. Hỏi TD là gì có thể thay TD bằng chữ khác được chứ (GP) chẳng hạn?
2. For i từ 1 đến 5 vậy có phải i=15 không?
3. Cells(10, i) = .Controls("TB" & i).ValueDòng này mình không hiểu về nó.
Mong các bác trợ giúp cảm ơn.
Đây là code của anh quanghai1969 thì phải?
+ COde này anh Hải dùng vòng lập For để đưa dữ liệu từ các Texbox vào Cell thôi mà, dùng vòng lặp cho nó gọn hơn thôi chứ có gì đâu.
Ở code này sẽ điền giá trị từ Texbox1 đến Texbox5 (TB1-->TB5) vào các ô từ cột 1 đến cột 5(Tức cột A đến cột E) ở dòng 10.
 
Upvote 0
Thông thường em gặp đoạn code có dạng này nhưng không hiểu sâu về nó. Nhờ các bác hướng dẫn dùm. Cảm ơn.

Mình hiểu là người dùng code For next
1. With TD. Hỏi TD là gì có thể thay TD bằng chữ khác được chứ (GP) chẳng hạn?
2. For i từ 1 đến 5 vậy có phải i=15 không?
3. Cells(10, i) = .Controls("TB" & i).ValueDòng này mình không hiểu về nó.
Mong các bác trợ giúp cảm ơn.
1. TD là cái tên mà khi người vẽ cái userform đã gán cho nó. Muốn thay đổi tên này thì vào properties của Form
2. For i = 1 to 5 có nghĩa là sẽ chạy 5 lần, cứ mỗi vòng thì i sẽ thay đổi là 1,2,3,4,5 và thoát
3. Chưa hiểu cơ bản thì đừng học quá sâu, sẽ cảm thấy rối và chán.

PS: Nếu có thể viết code ngoài bảng tính thì vào Form chẳng có gì khó cả. Mấy cái Form chẳng qua là dọa người không biết thôi
 
Upvote 0
1. TD là cái tên mà khi người vẽ cái userform đã gán cho nó. Muốn thay đổi tên này thì vào properties của Form
2. For i = 1 to 5 có nghĩa là sẽ chạy 5 lần, cứ mỗi vòng thì i sẽ thay đổi là 1,2,3,4,5 và thoát
3. Chưa hiểu cơ bản thì đừng học quá sâu, sẽ cảm thấy rối và chán.

PS: Nếu có thể viết code ngoài bảng tính thì vào Form chẳng có gì khó cả. Mấy cái Form chẳng qua là dọa người không biết thôi
Ai dời qua đây làm kiếm muốn chết, --=0
Cho hỏi thêm chút nhé bạn quanghai1969. VD tôi muốn cho code lập lại từ 1 đến 5 tại ô A1. Tôi có viết thử như thế này sao code chưa chạy được
Sub VD()
For i = 1 To 5
Sheet1.Range.[A1] , i = i
MsgBox i
Next
End Sub
Và tôi có thử thêm cái này thay đoạn màu đỏ thành
Sheets("sheet1").Range. ("A1"), i = i
nữa cũng chưa được. Tôi sai chổ nào bạn giải thích dùm. Cảm ơn bạn.
 
Upvote 0
Ai dời qua đây làm kiếm muốn chết, --=0
Cho hỏi thêm chút nhé bạn quanghai1969. VD tôi muốn cho code lập lại từ 1 đến 5 tại ô A1. Tôi có viết thử như thế này sao code chưa chạy được

Và tôi có thử thêm cái này thay đoạn màu đỏ thành nữa cũng chưa được. Tôi sai chổ nào bạn giải thích dùm. Cảm ơn bạn.

có phải bạn muốn a1 =1, a2=2...?
thử cái này xem sao
Sheets("sheet1").Range("A" & i) = i
hoặc
Sheet1.Range("A" & i) = i
 
Upvote 0
Ai dời qua đây làm kiếm muốn chết, --=0
Cho hỏi thêm chút nhé bạn quanghai1969. VD tôi muốn cho code lập lại từ 1 đến 5 tại ô A1. Tôi có viết thử như thế này sao code chưa chạy được

Và tôi có thử thêm cái này thay đoạn màu đỏ thành nữa cũng chưa được. Tôi sai chổ nào bạn giải thích dùm. Cảm ơn bạn.
Biết là ham học là rất tôt nhưng nên học từ từ. "Biết cầm dao thì hãy nghĩ tới thái thức ăn". Bạn nên học từ từ. tôi thấy cơ bản của bản còn kém lắm! Cứ nghiên cứu thật kĩ cái cơ bản như For ..next chẳng hạn.
Với mục đích của bạn ở trên tôi nghĩ chả đâu vào đâu cả. Nhưng cứ muốn thì viết như sau:
Sub VD()
For i = 1 To 5
Sheet1.[A1] = i
MsgBox i
Next
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Với mục đích của bạn ở trên tôi nghĩ chả đâu vào đâu cả.
Dẫu sao cũng cảm ơn bạn, Bạn nói gì vậy không biết thì hỏi là chuyện của người hỏi, trả lời hay không là chuyện của các bạn. Tôi mới tập mò mò. Thực ra tôi cũng có viết như thế này
Sub VD
For i= 1 to 5
cells(10, i)= i
msgbox i
next
end sub
Cho nên tôi mới thử viết cho 1 ô thử.
Quê quê với bạn, không biết có nên hỏi nữa hay không
 
Lần chỉnh sửa cuối:
Upvote 0
Cho hỏi thêm chút nhé bạn quanghai1969. VD tôi muốn cho code lập lại từ 1 đến 5 tại ô A1. Tôi có viết thử như thế này sao code chưa chạy được

Và tôi có thử thêm cái này thay đoạn màu đỏ thành nữa cũng chưa được. Tôi sai chổ nào bạn giải thích dùm. Cảm ơn bạn.

Muốn chọn 1 ô nào đó thì có nhiều cách, tùy trường hợp mà áp dụng

1. Range("A1")= i
2. [A1]=i
3. Cells(1,1)=i
 
Upvote 0
Các bạn giúp mình vấn đề này với:

Mình có tại A9:C9 và L9:N9 có chứa công thức bên trong
Mình muốn copy công thức trên từ A10:C10 đến "A10xx:C10xx" và L10:N10 đến "L10xx:N10xx".
Biết rằng mình chốt dòng cần Paste Special Formular bằng cách tại dòng "A10xx 1 : C10xx 1" bằng chữ "End"
Và chốt tại dòng "L10xx 1:N10xx 1" bằng một công thức khác (ví dụ như sum hay if,....)

Mình có làm thử bằng Macro nhưng khổ nỗi nó ko biết Paste đến đâu là ngưng.
Chân thành cám ơn.
 
Lần chỉnh sửa cuối:
Upvote 0
ai hướng dẫn mình với
 
Lần chỉnh sửa cuối:
Upvote 0
Các bạn giúp mình vấn đề này với:

Mình có tại A9:C9 và L9:N9 có chứa công thức bên trong
Mình muốn copy công thức trên từ A10:C10 đến "A10xx:C10xx" và L10:N10 đến "L10xx:N10xx".
Biết rằng mình chốt dòng cần Paste Special Formular bằng cách tại dòng "A10xx +1 : C10xx +1" bằng chữ "End"
Và chốt tại dòng "L10xx +1:N10xx +1" bằng một công thức khác (ví dụ như sum hay if,....)

Mình có làm thử bằng Macro nhưng khổ nỗi nó ko biết Paste đến đâu là ngưng.
Chân thành cám ơn.
Bạn chẳng đưa cái file lên gì cả, tôi nhắm mắt làm bừa cho bạn luôn!

Giả sử hàng màu vàng chứa công thức chuẩn (từ hàng 9), trong file tôi có một nút lệnh, khi bấm nút này sẽ có một inputbox hiện lên và đề nghị bạn nhập số hàng cần copy công thức (dĩ nhiên số hàng nhập vào phải lớn hơn 9, vì đó là hàng chuẩn). Khi bạn nhập số xong thì nó sẽ copy toàn bộ công thức xuống dưới. Hàng cuối cùng + 1 sẽ là một hàm, với tôi tôi tạm chọn hàm COUNTA, bạn tùy cơ xử lý hàm của mình.

Đây là thủ tục cho nút lệnh:

Mã:
Sub NhapCongThuc()
    Dim ipt
    ipt = InputBox("Must be greater than 9", "Input row number")
    ipt = Fix(Val(ipt))
    If ipt > 9 Then
        Range("A10:C1000, L10:N1000").ClearContents
        
        Range("A9:C9").AutoFill Range("A9:C" & ipt), xlFillValues
        Range("L9:N9").AutoFill Range("L9:N" & ipt), xlFillValues
        
        With Range("A" & ipt + 1)
            .Formula = "=COUNTA(" & Range("A9:A" & ipt).Address(0, 0) & ")"
            .AutoFill Range("A" & ipt + 1 & ":C" & ipt + 1), xlFillValues
        End With
        With Range("L" & ipt + 1)
            .Formula = "=COUNTA(" & Range("L9:L" & ipt).Address(0, 0) & ")"
            .AutoFill Range("L" & ipt + 1 & ":N" & ipt + 1), xlFillValues
        End With
    Else
        MsgBox "It's not done!"
    End If
End Sub
 

File đính kèm

Upvote 0
Bạn chẳng đưa cái file lên gì cả, tôi nhắm mắt làm bừa cho bạn luôn!

Giả sử hàng màu vàng chứa công thức chuẩn (từ hàng 9), trong file tôi có một nút lệnh, khi bấm nút này sẽ có một inputbox hiện lên và đề nghị bạn nhập số hàng cần copy công thức (dĩ nhiên số hàng nhập vào phải lớn hơn 9, vì đó là hàng chuẩn). Khi bạn nhập số xong thì nó sẽ copy toàn bộ công thức xuống dưới. Hàng cuối cùng + 1 sẽ là một hàm, với tôi tôi tạm chọn hàm COUNTA, bạn tùy cơ xử lý hàm của mình.

Đây là thủ tục cho nút lệnh:

Mã:
Sub NhapCongThuc()
    Dim ipt
    ipt = InputBox("Must be greater than 9", "Input row number")
    ipt = Fix(Val(ipt))
    If ipt > 9 Then
        Range("A10:C1000, L10:N1000").ClearContents
        
        Range("A9:C9").AutoFill Range("A9:C" & ipt), xlFillValues
        Range("L9:N9").AutoFill Range("L9:N" & ipt), xlFillValues
        
        With Range("A" & ipt + 1)
            .Formula = "=COUNTA(" & Range("A9:A" & ipt).Address(0, 0) & ")"
            .AutoFill Range("A" & ipt + 1 & ":C" & ipt + 1), xlFillValues
        End With
        With Range("L" & ipt + 1)
            .Formula = "=COUNTA(" & Range("L9:L" & ipt).Address(0, 0) & ")"
            .AutoFill Range("L" & ipt + 1 & ":N" & ipt + 1), xlFillValues
        End With
    Else
        MsgBox "It's not done!"
    End If
End Sub

Trời ơi tui viết bài này chỉ có 1 dòng lệnh duy nhất...
 
Upvote 0
Viết có 1 dòng code thiệt mà. Còn kết quả thì cốc có biết ra sao...
PHP:
Sub abc()
Selection.Resize(InputBox("Nhap so dong can dien cong thuc") + 1).FillDown
End Sub
 
Upvote 0
Mình xin lỗi, để mình bổ sung file.
Trong file mình có 2 sheet là Traicay và Dientu, mình muốn mỗi sheet có 1 code để copy 1 loạt công thức diễn giải như trong file.
Cám ơn các bạn đã nhiệt tình hướng dẫn.
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Copy code này bỏ vào sheet2. Nếu đúng ý thì chế biến cho sheet1

*** Hình như cái dạng này nếu dùng Table thì nó sẽ tự động điền công thức cho mình mà
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, [C3:C100]) Is Nothing Then
   With Target.Offset(-1)
      .Offset(, -2).Resize(2, 2).FillDown
      .Offset(, 5).Resize(2).FillDown
   End With
End If
End Sub
 
Upvote 0
Copy code này bỏ vào sheet2. Nếu đúng ý thì chế biến cho sheet1

*** Hình như cái dạng này nếu dùng Table thì nó sẽ tự động điền công thức cho mình mà
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, [C3:C100]) Is Nothing Then
   With Target.Offset(-1)
      .Offset(, -2).Resize(2, 2).FillDown
      .Offset(, 5).Resize(2).FillDown
   End With
End If
End Sub

Làm thì làm cho trót luôn đi đồng chí, dòng cuối cùng +1 thêm cái công thức SUM hay gì gì nữa đó.
 
Upvote 0
Em không được lanh trong lĩnh vực này lắm, em có tự mò mẫm bằng Macro còn hiểu sơ sơ, bác quanghai1969 viết các code này em mù luôn. Đã thế em knock out ngay từ cái khai báo đầu tiên "Private Sub Worksheet_Change(ByVal Target As Range)"
Trước đây em toàn biết sub hay dim gì thôi @@
Em ko thấy chỗ nào assign macro để chạy được hết
 
Lần chỉnh sửa cuối:
Upvote 0
Em không được lanh trong lĩnh vực này lắm, em có tự mò mẫm bằng Macro còn hiểu sơ sơ, bác quanghai1969 viết các code này em mù luôn. Đã thế em knock out ngay từ cái khai báo đầu tiên "Private Sub Worksheet_Change(ByVal Target As Range)"
Trước đây em toàn biết sub hay dim gì thôi @@
Em ko thấy chỗ nào assign macro để chạy được hết
Đây là thủ tục về sự kiện của sheet, đặt macro này vào trong module của sheet đó, mọi thay đổi tại cột C (C3:C100) đều làm cho sự kiện thực thi.
 
Upvote 0
Đây là thủ tục về sự kiện của sheet, đặt macro này vào trong module của sheet đó, mọi thay đổi tại cột C (C3:C100) đều làm cho sự kiện thực thi.
Anh cho em hỏi ở code anh chỉ em lần trước:
Sub NhapCongThuc()
Dim ipt
ipt = InputBox("Must be greater than 9", "Input row number")
ipt = Fix(Val(ipt))
If ipt > 9 Then
Range("A10:C1000, L10:N1000").ClearContents

Range("A9:C9").AutoFill Range("A9:C"
 
Lần chỉnh sửa cuối:
Upvote 0
Nhờ mọi người giải thích vì sao đoạn code này không hoạt động ak

Em đang làm một file bán hàng, muốn thêm 1 cái validation động mà khi sử dụng cái đoạn code này thì không hoạt động.
Mong cao nhân chỉ giúp ak, em cảm ơn
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
    With Sheet4.Range("TenCT")
        .Range("$A$2:$A$" & Range("$A$65000").End(xlUp).Row).Name = "TenCT"
    End With
    With Sheet4.Range("TenHH")
        .Range("$C$2:$C$" & Range("$C$65000").End(xlUp).Row).Name = "TenHH"
    End With
End Sub
Update: Em đã đính kèm file cho các bác dễ hình dung ạ
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Bạn chưa nói rỏ là bạn gởi cái macro thân iêu của bạn vô trang tính nào?
Nhưng dù sao macro của bạn có bậc tự do quá rọng hay sao í, bạn nên ràng buột bớt lại chăng?!
 
Upvote 0
Bạn chưa nói rỏ là bạn gởi cái macro thân iêu của bạn vô trang tính nào?
Nhưng dù sao macro của bạn có bậc tự do quá rọng hay sao í, bạn nên ràng buột bớt lại chăng?!

Em để ở sheet4 để nó tự update vào list mỗi khi mình thêm dữ liệu vào các cột kia ak, sau đó thì có 1 cái validation ở sheet 1 nhưng ở file minh họa em chỉ để ở 1 sheet thôi cũng được ak
em gà vba lắm, mới học được một ít, mong các bác chỉ bảo ak
 
Upvote 0
Em để ở sheet4 để nó tự update vào list mỗi khi mình thêm dữ liệu vào các cột kia ak, sau đó thì có 1 cái validation ở sheet 1 nhưng ở file minh họa em chỉ để ở 1 sheet thôi cũng được ak
em gà vba lắm, mới học được một ít, mong các bác chỉ bảo ak
Bạn thử sửa lại thành:
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
    With Sheets("Sheet4")
        .Range("$A$2:$A$" & Range("$A$65000").End(xlUp).Row).Name = "TenCT"
        .Range("$C$2:$C$" & Range("$C$65000").End(xlUp).Row).Name = "TenHH"
    End With
End Sub
 
Upvote 0
Em đang làm một file bán hàng, muốn thêm 1 cái validation động mà khi sử dụng cái đoạn code này thì không hoạt động.
Mong cao nhân chỉ giúp ak, em cảm ơn
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
    With Sheet4.Range("TenCT")
        .Range("$A$2:$A$" & Range("$A$65000").End(xlUp).Row).Name = "TenCT"
    End With
    With Sheet4.Range("TenHH")
        .Range("$C$2:$C$" & Range("$C$65000").End(xlUp).Row).Name = "TenHH"
    End With
End Sub
Update: Em đã đính kèm file cho các bác dễ hình dung ạ
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
    With Sheet4
        .Range([A2], [A65536].End(3)).Name = "TenCT"
        .Range([C2], [C65536].End(3)).Name = "TenHH"
    End With
End Sub
Up rồi mới thấy bài 159, nhưng bài 159 có thể sai tên sheet vì sheet đã có tên là List
 
Lần chỉnh sửa cuối:
Upvote 0
anh Hoàng Trọng Nghĩa giúp em ở bài #155 nhé. Em cám ơn anh nhiều lắm
 
Lần chỉnh sửa cuối:
Upvote 0
Em tự mò từ công thức của anh ra rồi anh Nghĩa ơi, cám ơn anh nhiều lắm
À anh Nghĩa cho em hỏi là trong code này hồi đó có 1 bạn trên diễn đàn chỉ em, em cũng đọc và hiểu và sửa lại 1 tí, nhưng do ko biết cách tối ưu nên code này chạy khá chậm, với kinh nghiệm của anh thì có cách nào giúp nó chạy nhanh hơn không ạ.
PHP:
Public Sub chuyendulieu()
Dim Rng As Range, Tem1 As Double, Tem2 As Double, Cll As Range, R As Long, Vung As Range, I As Long
With Sheets("baocao")
Set Rng = .Range(.[C11], .[C65000].End(xlUp))
For Each Cll In Rng
    R = Cll.Row
    If Cll.Font.Bold = False Then
        Tem1 = .Cells(R, "N").Value: Tem2 = .Cells(R, "O").Value
        .Cells(R, "F") = Tem1: .Cells(R, "G") = Tem2
    End If
Next
End With
Set Rng = Nothing

With Sheets("TonghopQI")
Set Rng = .Range(.[e9], .[e65000].End(xlUp))
    On Error Resume Next
    For Each Cll In Rng
       If Cll.Font.Bold = False Then Cll.Value = Cll.Offset(0, -1).Value
       Next Cll
End With
Set Rng = Nothing

With Sheets("QuyI")
 On Error Resume Next
    .Range(.[p8], .[p5000].End(xlUp)).SpecialCells(2).ClearContents
    Set Vung = .Range(.[p8], .[p5000].End(xlUp))
        For I = 1 To Vung.Rows.Count
                   If Vung(I) = "" And Vung(I).Offset(, -1)  0 Then Vung(I) = Vung(I).Offset(, -1)
        Next
End With
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Em tự mò từ công thức của anh ra rồi anh Nghĩa ơi, cám ơn anh nhiều lắm
À anh Nghĩa cho em hỏi là trong code này hồi đó có 1 bạn trên diễn đàn chỉ em, em cũng đọc và hiểu và sửa lại 1 tí, nhưng do ko biết cách tối ưu nên code này chạy khá chậm, với kinh nghiệm của anh thì có cách nào giúp nó chạy nhanh hơn không ạ.
PHP:
Public Sub chuyendulieu()
Dim Rng As Range, Tem1 As Double, Tem2 As Double, Cll As Range, R As Long, Vung As Range, I As Long
With Sheets("baocao")
Set Rng = .Range(.[C11], .[C65000].End(xlUp))
For Each Cll In Rng
    R = Cll.Row
    If Cll.Font.Bold = False Then
        Tem1 = .Cells(R, "N").Value: Tem2 = .Cells(R, "O").Value
        .Cells(R, "F") = Tem1: .Cells(R, "G") = Tem2
    End If
Next
End With
Set Rng = Nothing

With Sheets("TonghopQI")
Set Rng = .Range(.[e9], .[e65000].End(xlUp))
    On Error Resume Next
    For Each Cll In Rng
       If Cll.Font.Bold = False Then Cll.Value = Cll.Offset(0, -1).Value
       Next Cll
End With
Set Rng = Nothing

With Sheets("QuyI")
 On Error Resume Next
    .Range(.[p8], .[p5000].End(xlUp)).SpecialCells(2).ClearContents
    Set Vung = .Range(.[p8], .[p5000].End(xlUp))
        For I = 1 To Vung.Rows.Count
                   If Vung(I) = "" And Vung(I).Offset(, -1) <> 0 Then Vung(I) = Vung(I).Offset(, -1)
        Next
End With
End Sub
Bạn muốn người khác xem code thực thi như thế nào thì làm ơn gửi một cái file đó lên người ta mới có cơ sở để sửa code hoặc đưa ra hướng khác, chứ đưa lên thế có thánh mới hiểu sẽ thực hiện như thế nào bạn ơi!
 
Upvote 0
Bạn muốn người khác xem code thực thi như thế nào thì làm ơn gửi một cái file đó lên người ta mới có cơ sở để sửa code hoặc đưa ra hướng khác, chứ đưa lên thế có thánh mới hiểu sẽ thực hiện như thế nào bạn ơi!
Mình đính kèm file, Sheet "CD SPS" tổng hợp số từ sheet "NKC" nên khi dữ liệu ở NKC nhiều thì mỗi lần nó chuyển số Cuối kỳ từ CD SPS thành Đầu kỳ của CD SPS chạy rất chậm
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
anh Nghĩa xem dùm em nhé. Cám ơn anh
 
Lần chỉnh sửa cuối:
Upvote 0
anh Nghĩa xem dùm em nhé. Cám ơn anh
Trước khi tôi có hướng xử lý, cho tôi hỏi đoạn code này bạn dùng để làm gì?

Mã:
    With Sheets("LCTT")
        .Range(.Range("AD8"), .Range("AD5000").End(xlUp)).SpecialCells(2).ClearContents
        Set Vung = .Range(.Range("AD8"), .Range("AD5000").End(xlUp))
        For I = 1 To Vung.Rows.Count
            If Vung(I) = "" And Vung(I).Offset(, -1) <> 0 Then Vung(I) = Vung(I).Offset(, -1)
        Next
    End With

Tôi đọc code trên và thấy rằng, với dòng code này:

.Range(.Range("AD8"), .Range("AD5000").End(xlUp)).SpecialCells(2).ClearContents

sẽ phát sinh lỗi, bởi không có hàng nào trong đó chứa text.

và dòng code này:

.Range(.Range("AD8"), .Range("AD5000").End(xlUp))

Nếu không có cái gì ở trong cột đó, thì chọn vùng không xác định được, bởi lúc này Vung sẽ là AD1:AD8. Khi Vùng được chọn lựa không chính xác sẽ dẫn đến code thực thi không chính xác.
 
Upvote 0
Trước khi tôi có hướng xử lý, cho tôi hỏi đoạn code này bạn dùng để làm gì?
Nếu không có cái gì ở trong cột đó, thì chọn vùng không xác định được, bởi lúc này Vung sẽ là AD1:AD8. Khi Vùng được chọn lựa không chính xác sẽ dẫn đến code thực thi không chính xác.

À trong sheet LCTT do em lúc trước em co chèn nhiều cột dự phòng nên cột Năm trước (cột J) nằm ở vị trí AD, do thấy chèn nhiều cột dự phòng quá nên em xóa bớt.
Mục đích của đoạn code này:
- Trong Sheet CD SPS em muốn chuyển giá trị 2 cột Số dư cuối kỳ (Cột N Cột O) thành 2 cột Số dư đầu kỳ (Cột F Cột G) và chỉ chuyển giá trị, các dòng có công thức SUM (hay các dòng in đậm) vẫn để nguyên
- 2 Sheet KQKD và LCTT thì chuyển 1 cột Năm nay thành Năm trước.
Code này chạy ok nhưng khi có data nhập liệu vào thì nó chạy rất chậm theo như em nhận định là do:
- Trước khi chuyển (đã nhập data vào sheet NKC rồi): Đầu kỳ (A) Phát sinh tăng/Giảm (B) = Cuối kỳ (C)
- Khi thực thi lệnh (vẫn còn data trong sheet NKC): Đầu kỳ (là C là số Cuối kỳ trước khi chuyển) Phát sinh tăng/Giảm (B) = Cuối kỳ (D)
- Ở đây Code chạy chậm là do khi chuyển từ cuối kỳ về đầu kỳ, Sheet CD SPS nó ko biết là ngưng chạy công thức để ra kết quả Cuối kỳ D
Em nghĩ giải pháp có lẽ là khi chuyển Cuối kỳ về Đầu kỳ thì nó nên xóa luôn data trong NKC và nên biết xóa tới dòng nào thì ngưng thì tốt nhất
Không biết anh Nghĩa có cao kiến gì hơn ko.
 
Lần chỉnh sửa cuối:
Upvote 0
À trong sheet LCTT do em lúc trước em co chèn nhiều cột dự phòng nên cột Năm trước (cột J) nằm ở vị trí AD, do thấy chèn nhiều cột dự phòng quá nên em xóa bớt.
Mục đích của đoạn code này:
- Trong Sheet CD SPS em muốn chuyển giá trị 2 cột Số dư cuối kỳ (Cột N + Cột O) thành 2 cột Số dư đầu kỳ (Cột F + Cột G) và chỉ chuyển giá trị, các dòng có công thức SUM (hay các dòng in đậm) vẫn để nguyên
- 2 Sheet KQKD và LCTT thì chuyển 1 cột Năm nay thành Năm trước.
Code này chạy ok nhưng khi có data nhập liệu vào thì nó chạy rất chậm theo như em nhận định là do:
- Trước khi chuyển (đã nhập data vào sheet NKC rồi): Đầu kỳ (A) + Phát sinh tăng/Giảm (B) = Cuối kỳ (C)
- Khi thực thi lệnh (vẫn còn data trong sheet NKC): Đầu kỳ (là C là số Cuối kỳ trước khi chuyển) + Phát sinh tăng/Giảm (B) = Cuối kỳ (D)
- Ở đây Code chạy chậm là do khi chuyển từ cuối kỳ về đầu kỳ, Sheet CD SPS nó ko biết là ngưng chạy công thức để ra kết quả Cuối kỳ D
Em nghĩ giải pháp có lẽ là khi chuyển Cuối kỳ về Đầu kỳ thì nó nên xóa luôn data trong NKC và nên biết xóa tới dòng nào thì ngưng thì tốt nhất
Không biết anh Nghĩa có cao kiến gì hơn ko.

Do một số bảng biểu bạn có sử dụng MergeCell, và khi xác định vùng dưới lên trên có một số hàng xác định thừa, nên tôi đã đặt 2 name trong các sheet CD SPS với name TongCong tại ô C301 và sheet KQKD với name LaiCoBan tại ô E28. Lưu ý, khi đem code này chuyển qua file của bạn thì nhớ đặt 2 name này vào file của bạn nhé!

Code được làm gọn lại như sau:

Mã:
Sub chuyendulieu()
Application.ScreenUpdating = False
Application.EnableEvents = False
Application.Calculation = xlCalculationManual
    
    Dim R As Long, I As Long
    Dim Cll As Range, Rng As Range, Vung As Range
    
    R = Range("TongCong").Row - 1
    Set Rng = Sheets("CD SPS").Range("C11:C" & R)
    For Each Cll In Rng
        If Cll.Font.Bold = False Then
            Cll.Offset(, 3) = Cll.Offset(, 11)
            Cll.Offset(, 4) = Cll.Offset(, 12)
        End If
    Next
    
    R = Range("LaiCoBan").Row
    Set Rng = Sheets("KQKD").Range("E10:E" & R)
    For Each Cll In Rng
       If Cll.Font.Bold = False Then
            Cll.Value = Cll.Offset(0, -1).Value
        End If
    Next
    
    On Error Resume Next
   [COLOR=#0000ff] ''Cai nay thi de nguyen vi khong biet sua lam sao![/COLOR]
    With Sheets("LCTT")
        .Range(.Range("AD8"), .Range("AD65536").End(xlUp)).SpecialCells(2).ClearContents
        Set Vung = .Range(.Range("AD8"), .Range("AD65536").End(xlUp))
        For I = 1 To Vung.Rows.Count
            If Vung(I) = "" And Vung(I).Offset(, -1) <> 0 Then Vung(I) = Vung(I).Offset(, -1)
        Next
    End With


Application.Calculation = xlCalculationAutomatic
Application.EnableEvents = True
Application.ScreenUpdating = True
End Sub

Bạn thử xem có cải thiện được tốc độ hơn hay không nhé!
 

File đính kèm

Upvote 0
Do một số bảng biểu bạn có sử dụng MergeCell, và khi xác định vùng dưới lên trên có một số hàng xác định thừa, nên tôi đã đặt 2 name trong các sheet CD SPS với name TongCong tại ô C301 và sheet KQKD với name LaiCoBan tại ô E28. Lưu ý, khi đem code này chuyển qua file của bạn thì nhớ đặt 2 name này vào file của bạn nhé!

Code được làm gọn lại như sau:
Bạn thử xem có cải thiện được tốc độ hơn hay không nhé!

Hay quá anh Nghĩa ơi, tốc độ cải thiện quá rõ, em đang mò ráp lại cho chuẩn và test thêm xem thế nào
Tuy em mù VBA nhưng em thấy dòng code Application.ScreenUpdating = False/True này có lẽ là 1 yếu tố làm nó nhanh hơn hẳn đúng ko ạ.
Chân thành cám ơn anh. Anh nhiệt tình quá, ko biết anh có ở TPHCM ko ạ, nếu gần phải mời anh 1 ly cafe còn hoành tráng hơn chắc 1 chầu nhậu quá
 
Lần chỉnh sửa cuối:
Upvote 0
Hay quá anh Nghĩa ơi, tốc độ cải thiện quá rõ, em đang mò ráp lại cho chuẩn và test thêm xem thế nào
Tuy em mù VBA nhưng em thấy dòng code Application.ScreenUpdating = False/True này có lẽ là 1 yếu tố làm nó nhanh hơn hẳn đúng ko ạ.
Chân thành cám ơn anh. Anh nhiệt tình quá, ko biết anh có ở TPHCM ko ạ, nếu gần phải mời anh 1 ly cafe còn hoành tráng hơn chắc 1 chầu nhậu quá
Anh em trên diễn đàn giúp nhau không vụ lợi, nhưng anh em gặp nhau cũng thật sự là một điều tốt đẹp. Tôi ở TPHCM, bữa nào muốn thì tôi hú hí anh em cùng ra cafe.
 
Upvote 0
À lần trước anh có chỉ em code copy công thức cột A2:C10 và E2:G10 thì em có mò mẫm biến tấu lại:
- Copy công thức cột A11:A299 và P11:R299
Nó vẫn chạy ra có vẻ ok nhưng bị lỗi là ở dòng Q299 và R299 tự nhiên nó chạy ra chữ "in" của cột P
Với lại em dựa theo công thức đó chế biến cho mỗi cột A
PHP:
With Range("A"
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
À lần trước anh có chỉ em code copy công thức cột A2:C10 và E2:G10 thì em có mò mẫm biến tấu lại:
- Copy công thức cột A11:A299 và P11:R299
Nó vẫn chạy ra có vẻ ok nhưng bị lỗi là ở dòng Q299 và R299 tự nhiên nó chạy ra chữ "in" của cột P
Với lại em dựa theo công thức đó chế biến cho mỗi cột A
PHP:
With Range("A" & ipt + 1)
            .AutoFill Range("A" & ipt + 1 & ":B" & ipt + 1), xlFillValues
        End With

Nếu để chỗ bôi đen là ":A" thì nó ko chạy được nhưng để là ":B" hay C D... thì nó lại chạy
Nếu chỉ cho cột A thì mình làm cách nào anh Nghĩa nhỉ?

Mục đích của 2 dòng code này để làm gì vậy bạn?

Mã:
        With Range("A" & ipt + 1)
            .AutoFill Range("A" & ipt + 1 & ":B" & ipt + 1), xlFillValues
        End With
        
        With Range("P" & ipt + 1)
            .AutoFill Range("P" & ipt + 1 & ":R" & ipt + 1), xlFillValues
        End With
 
Upvote 0
Em ko biết **~**, em chỉ mò theo công thức cũ anh đưa với suy nghĩ là:
- cái đầu: copy công thức cột A từ dòng em nhập vào nên em thay chữ cái tương ứng với cột
- cái thứ 2 thì Copy từ P tới R nên cái đầu em cho là A đến A ạ :))
 
Lần chỉnh sửa cuối:
Upvote 0
Em ko biết **~**, em chỉ mò theo công thức cũ anh đưa với suy nghĩ là:
- cái đầu: copy công thức cột A từ dòng em nhập vào nên em thay chữ cái tương ứng với cột
- cái thứ 2 thì Copy từ P tới R nên cái đầu em cho là A đến A ạ :))
Bạn bỏ 2 dòng đó đi là được rồi.

Chép cái này vào file đó:

Mã:
Sub CopyCongThucCDSPS()
    Dim ipt
    [COLOR=#0000ff]''Xac dinh dong cuoi cua bang, lam so hang mac dinh:[/COLOR]
    ipt = Range("[COLOR=#ff0000]TongCong[/COLOR]").Row - 1
    ipt = InputBox("Luu y! So dong phai tu 10 tro di", "Nhap so dong can copy den", ipt)
    ipt = Fix(Val(ipt))
    If ipt > 10 Then
        With Sheets("CD SPS")
           [COLOR=#0000ff] ''Copy cong thuc tu o A10:[/COLOR]
            .Range("A10").AutoFill .Range("A10:A" & ipt), xlFillValues
             [COLOR=#0000ff]''Copy cong thuc tu P10:R10:[/COLOR]
            .Range("P10:R10").AutoFill .Range("P10:R" & ipt), xlFillValues
        End With
    Else
        MsgBox "It's not done!"
    End If
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Anh Nghĩa ở đâu vậy, em phải mời anh 1 ly cafe rồi
Với bài trên, bạn cũng không cần cái InputBox làm gì, bỏ nó luôn:

Mã:
Sub CopyCongThucCDSPS()
    Dim r As Long
[COLOR=#0000ff]    ''Xac dinh so dong cuoi cua bang:[/COLOR]
    r = Range("[COLOR=#ff0000]TongCong[/COLOR]").Row - 1
    With Sheets("CD SPS")
[COLOR=#0000ff]        ''Copy cong thuc tu o A10:[/COLOR]
        .Range("A10").AutoFill .Range("A10:A" & r), xlFillValues
[COLOR=#0000ff]         ''Copy cong thuc tu P10:R10:[/COLOR]
        .Range("P10:R10").AutoFill .Range("P10:R" & r), xlFillValues
    End With
End Sub


Uhm, nhà tôi thì ở Thủ Đức, còn tôi đi làm ở Quận 4. Lúc nào rảnh thì alo cho tôi.
Không chín ba tám 520 năm hai mươi.
 
Lần chỉnh sửa cuối:
Upvote 0
nhà em thì ở Q5. Làm ở Q3 nhưng hứng lên là wa cafe luôn, anh cho số đt đi, nếu ổn mai em wa cafe luôn :)
 
Lần chỉnh sửa cuối:
Upvote 0
đã xong rồi các bác ak
 
Lần chỉnh sửa cuối:
Upvote 0
Mã:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Dim Dangchon As Range
 [U]   [B]Dangchon = ActiveCell[/B][/U]
    Select Case ActiveCell.Row
        Case Is < 21
            Range("2:2").EntireRow.Select
            ActiveWindow.FreezePanes = True
            Dangchon.Select
        Case Is < 41
            Range("22:22").EntireRow.Select
            ActiveWindow.FreezePanes = True
            Dangchon.Select
        Case Is < 61
            Range("42:42").EntireRow.Select
            ActiveWindow.FreezePanes = True
            Dangchon.Select
        Case Else
            Range("62:62").EntireRow.Select
            ActiveWindow.FreezePanes = True
            Dangchon.Select
    End Select
End Sub

Xin code cho phần này ak, mình muốn frezze panel khi chọn cái vùng kia, cảm ơn các bạn
Tạm sửa thế này
PHP:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Application.EnableEvents = False
ActiveWindow.FreezePanes = False
    Dim Dangchon As Range
    Set Dangchon = ActiveCell
    Select Case ActiveCell.Row
        Case Is < 21
            Range("2:2").EntireRow.Select
            ActiveWindow.FreezePanes = True
        Case Is < 41
            Range("22:22").EntireRow.Select
            ActiveWindow.FreezePanes = True
        Case Is < 61
            Range("42:42").EntireRow.Select
            ActiveWindow.FreezePanes = True
            Dangchon.Select
        Case Else
            Range("62:62").EntireRow.Select
            ActiveWindow.FreezePanes = True
    End Select
Application.EnableEvents = True
End Sub
 
Upvote 0
Chào các Bác.

code VBA sau:

Mã:
Option Explicit


Public Sub ChamCong()
On Error Resume Next
Dim sArr(), dArr(), I As Long, J As Long, K As Long, Col As Long, Tem As Long, Dic As Object
Set Dic = CreateObject("Scripting.Dictionary")
With Sheets("DATA")
    sArr = .Range(.[A2], .[A65536].End(xlUp)).Resize(, 5).Value
End With
ReDim dArr(1 To UBound(sArr, 1), 1 To 33)
For I = 1 To UBound(sArr, 1)
    Tem = sArr(I, 1)
    Col = Right(sArr(I, 3), 2) * 2 + 2
    If Val(Left(sArr(I, 4), 2)) > 12 Then Col = Col + 1
    [U]If Not Dic.Exists(Tem) Then[/U]
        K = K + 1
        Dic.Add Tem, K
        dArr(K, 1) = K
        dArr(K, 2) = sArr(I, 1)
        dArr(K, 3) = sArr(I, 2)
    End If
    dArr(Dic.Item(Tem), Col) = sArr(I, 4)
Next I
Application.ScreenUpdating = False
With Sheets("ChamCong")
    .[A5:A1000].Resize(, 33).ClearContents
    .[A5:A1000].Resize(, 33).Borders.LineStyle = xlNone
    If K Then
        .[A5].Resize(K, 33) = dArr
        .[A5].Resize(K, 33).Borders.LineStyle = xlContinuous
    End If
End With
Application.ScreenUpdating = True
Set Dic = Nothing
End Sub
E muốn nhờ các Bác giải thích dòng code e gạch chân có nghĩa gì?

Thanks.
 
Lần chỉnh sửa cuối:
Upvote 0
Chào các Bác.

code VBA sau:

Mã:
Option Explicit



E muốn nhờ các Bác giải thích dòng code e gạch chân có nghĩa gì?

Thanks.[/QUOTE]
Có giải thích bạn cũng thấy lờ mờ thôi vì nó liên quan nhiều thứ lắm.
Tạm dịch là: Nếu chưa có trong Dic thì....
 
Upvote 0
Function TimSLOB(O As String)
Dim i As Range
With Sheet2.Range("A1:A589")
Set i = .Find(O, LookIn:=xlValues, LookAt:=xlWhole)
TimOB = Range("G" & i.Row - 1).Value
End With
End Function
Các bác xem cho mình vì sao cái function này không hoạt động được không? :(
 
Upvote 0
Các bác xem cho mình vì sao cái function này không hoạt động được không? :
Function TimSLOB(O As String)
Dim i As Range
With Sheet2.Range("A1:A589")
Set i = .Find(O, LookIn:=xlValues, LookAt:=xlWhole)
TimOB = Range("G" & i.Row - 1).Value
End With
End Function

Phương thức Find sẽ không hoạt động với Function đâu, khỏi suy nghĩ
Bạn áp dụng Function ấy trực tiếp trong VBA còn có thể chứ nếu bạn gõ function ấy trên bảng tính thì da phần sẽ.. lỗi
 
Upvote 0
Phương thức Find sẽ không hoạt động với Function đâu, khỏi suy nghĩ
Bạn áp dụng Function ấy trực tiếp trong VBA còn có thể chứ nếu bạn gõ function ấy trên bảng tính thì da phần sẽ.. lỗi

Vậy khi em muốn tìm ở trong bảng tính một ô rồi muốn lấy giá trị của các ô gần đó thì mình phải như thế nào với Function ạ, cảm ơn bác
 
Upvote 0
Mã:
Sub Capnhat()
    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual
    Dim Cell As Range
    Dim Cll As Range
    For Each Cell In Sheet5.Range("D2:D" & [d50000].End(xlUp).Row)
        If Left(Cell, 2) = "PX" Then
            If Cell.Offset(0, -3).Value <> "x" Then
            For Each Cll In Sheets(Cell.Offset(0, 16).Value).Range("c7:c" & [c50000].End(xlUp).Row)
                If Cell.Offset(0, 6).Value = Cll.Value Is Nothing Then
                    Sheets(Cell.Offset(0, 16).Value).[c50000].End(xlUp).Offset(1, 0).EntireRow.Insert , CopyOrigin:=xlFormatFromLeftOrAbove
                    Sheets(Cell.Offset(0, 16).Value).[c7].End(xlDown).Offset(1, 0).Value = Cell.Offset(, 6)
                    Sheets(Cell.Offset(0, 16).Value).[c7].End(xlDown).Offset(1, 1).Value = Cell.Offset(, 7)
                    Sheets(Cell.Offset(0, 16).Value).Range("C" & [c7].End(xlDown)(1, 0).Row & ":F" & [c7].End(xlDown)(1, 0).Row).Value = Sheet5.Range(Cell.Offset(, 6), Cell.Offset(, 9))
                    Cell.Offset(0, -3).Value = "x"
                End If
            Next
            End If
        End If
    Next
    Application.ScreenUpdating = True
    Application.Calculation = xlCalculationAutomatic
End Sub
Các bác giải thích vì sao đoạn code này của em không hoạt động không ak? Excel treo luôn ak :(
Em cảm ơn các bác ạ
 
Upvote 0
Mã:
Sub Capnhat()
    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual
    .......
    Application.ScreenUpdating = True
    Application.Calculation = xlCalculationAutomatic
End Sub
Các bác giải thích vì sao đoạn code này của em không hoạt động không ak? Excel treo luôn ak :(
Em cảm ơn các bác ạ

bạn nên đính kèm thêm File để mọi người có thể kiểm tra giúp... !
 
Upvote 0
Không phải Excel treo, mà là nó chạy chưa xong. Vừa tính toán nhiều, vừa lặp nhiều, vừa phải chạy lên chạy xuống sheet.

Một vài ý khác:

PHP:
For Each Cell In Sheet5.Range("D2:D" & [d50000].End(xlUp).Row)
...
    For Each Cll In Sheets(Cell.Offset(0, 16).Value).Range("c7:c" & [c50000].End(xlUp).Row)
...
    Sheets(Cell.Offset(0, 16).Value).Range("C" & [c7].End(xlDown)(1, 0).Row &

Công việc tính row phải tính rất nhiều lần

Mã:
If Cell.Offset(0, 6).Value = Cll.Value [COLOR="#FF0000"]Is Nothing[/COLOR] Then
Sao lại có cái đỏ đỏ?
 
Upvote 0
Không phải Excel treo, mà là nó chạy chưa xong. Vừa tính toán nhiều, vừa lặp nhiều, vừa phải chạy lên chạy xuống sheet.

Một vài ý khác:

PHP:
For Each Cell In Sheet5.Range("D2:D" & [d50000].End(xlUp).Row)
...
    For Each Cll In Sheets(Cell.Offset(0, 16).Value).Range("c7:c" & [c50000].End(xlUp).Row)
...
    Sheets(Cell.Offset(0, 16).Value).Range("C" & [c7].End(xlDown)(1, 0).Row &

Công việc tính row phải tính rất nhiều lần

Mã:
If Cell.Offset(0, 6).Value = Cll.Value [COLOR=#FF0000]Is Nothing[/COLOR] Then
Sao lại có cái đỏ đỏ?

Cái đỏ đỏ là nếu cái ở bên sheet bên này bằng với giá trị bên kia thì sẽ không làm gì cả, còn nếu không thì sẽ thêm 1 dòng và copy mọt số dữ liệu bên sheet kia sang đó bác :(
Em đính kèm file lên cho mọi người dễ hình dung ak
HTML:
https://www.dropbox.com/s/fk93qhhy20y3zok/B%C3%A1o%20c%C3%A1o%20stock%20nh%C3%A0%20m%C3%A1y%207.2014%20-%20Copy.xlsm
 
Lần chỉnh sửa cuối:
Upvote 0
Cái đỏ đỏ là nếu cái ở bên sheet bên này bằng với giá trị bên kia thì sẽ không làm gì cả, còn nếu không thì sẽ thêm 1 dòng và copy mọt số dữ liệu bên sheet kia sang đó bác :(
Em đính kèm file lên cho mọi người dễ hình dung ak
HTML:
https://www.dropbox.com/s/fk93qhhy20y3zok/B%C3%A1o%20c%C3%A1o%20stock%20nh%C3%A0%20m%C3%A1y%207.2014%20-%20Copy.xlsm
code của bạn muốn cải thiện tốc độ thì có thể phải dùng mảng hoặc phương thức Find hoặc Union khi chèn Row ...^^^^
 
Upvote 0
em có file excel bị lỗi nó báo như sau:
file excel cannot accessed the file may be corrupted, located on a server that is not responding, or read-only
em đang dùng excel 2010 có anh chị nào biết cách khắc phục giúp em với ạ... Hu hu
 
Upvote 0
em có file excel bị lỗi nó báo như sau:
file excel cannot accessed the file may be corrupted, located on a server that is not responding, or read-only
em đang dùng excel 2010 có anh chị nào biết cách khắc phục giúp em với ạ... Hu hu
Không có file thì khó cho các thành viên bắt bệnh bạn ạh
 
Upvote 0
bác nối thêm chi tiết cho em về vấn đề này được không
- mới thử phương thức Find thay thế cho 1 vòng lặp mà đã thấy ... ^^^^
- mình mới chạy thử với 1 sheet EXT, bạn xem có đúng kết quả ko rồi tính tiếp ... !

Mã:
Sub Capnhat()
Dim CurSheet As Worksheet, ws As Worksheet
Dim Cell As Range
Dim iRow1 As Long, iRow2 As Long
Dim Rng As Range, rngFound As Range

'chua cai` Unhide Row cho cac sheet.

    Application.ScreenUpdating = False
    'Application.Calculation = xlCalculationManual
    Set CurSheet = Sheets("update")
    For Each Cell In CurSheet.Range("D2:D" & Range("D65000").End(xlUp).Row)
    If CurSheet.Range("T" & Cell.Row) = "EXT" Then
        If Left(Cell, 2) = "PX" And Cell.Offset(0, -3) <> "x" Then
        iRow1 = Cell.Row
        On Error Resume Next 'neu ko co' Ten sheet
            Set ws = Sheets(CurSheet.Range("T" & iRow1).Value)
            Set Rng = ws.Range("C7:C65000")
            Set rngFound = Rng.Find(CurSheet.Range("J" & iRow1).Value, , xlValues, xlWhole) 'xlWhole--> tim` chinh' xac
            '---------
            If rngFound Is Nothing Then 'neu ko tim` thay'
                iRow2 = ws.Range("C65000").End(xlUp).Offset(1, 0).Row
                ws.Range("C" & iRow2).EntireRow.Insert , CopyOrigin:=xlFormatFromLeftOrAbove
                ws.Range("C" & iRow2).Resize(, 4).Value = CurSheet.Range("J" & iRow1).Resize(, 4).Value
                Cell.Offset(0, -3) = "x"
            End If
        End If
    End If
    Next
    
    'Application.Calculation = xlCalculationAutomatic
    Application.ScreenUpdating = True
    
    MsgBox "xong"
End Sub
 

File đính kèm

Upvote 0
em có file excel bị lỗi nó báo như sau:
file excel cannot accessed the file may be corrupted {1}, located on a server that is not responding {2}, or read-only {3}
em đang dùng excel 2010 có anh chị nào biết cách khắc phục giúp em với ạ... Hu hu {4}

{1} File bị hư. Phải có file mới biết được.

{2} Không đi qua mang (nội bộ?) được. Đường comm bị ket?

{3} Vào properties của file mà check. Cái này hay xảy ra ở file gỏi qua Outlook.

{4} Rên la giữa chợ mà không biết mắc cở à?

=== Bổ sung ===

Vấn đề này có liên quan gì đến VBA? Bạn hỏi ở đây là trật chỗ. Có nhiều người rất giỏi về hệ thống, có thể giải quyết cho bạn dễ dàng nhưng vì bạn đặt ở thớt này cho nên họ không thấy. Người giỏi về hệ thống chưa chắc đã thích viết code, và họ không buồn xem các đề tài có liên quan đến VBA.
 
Lần chỉnh sửa cuối:
Upvote 0
Lỗi này thường xảy ra khi Khi một máy hệ Win7 với Excel 2010 mở file xls được đã ghi trong Excel 2003 ở hệ điều hành XP.
Trường hợp này là do Win7 muốn ghi lại một phiên bản offline của file.

Nếu đúng lỗi thì cách khắc phục dễ nhất là đặt Offline files OFF.

Lỗi cũng có thể xảy ra khi đọc file trên thẻ USB, và thẻ này bị đặt điều kiện gì đó. Khắc phục: copy ra đĩa cứng.
 
Upvote 0
Status
Không mở trả lời sau này.

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

Back
Top Bottom