Chuyên mục xử lý, gỡ rối code VBA (2 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
To: vova2209.
Phải viết là: FixRowHight Sheet21.Range("A1:Z71")
Còn muốn viết kiểu bạn thì phải dùng tên Sheet và tên Sheet không được dùng ký tự đặc biệt như cặp lá yêu thương đó và không dùng tiếng Việt.
 
Upvote 0
To: vova2209.
Phải viết là: FixRowHight Sheet21.Range("A1:Z71")
Còn muốn viết kiểu bạn thì phải dùng tên Sheet và tên Sheet không được dùng ký tự đặc biệt như cặp lá yêu thương đó và không dùng tiếng Việt.
Vâng! em cảm ơn a nhiều ạ, code chạy được rồi..
 
Upvote 0
Mình định tự động mở ValidateList bằng tổ hợp phím Alt+Mũi tên xuống bằng lệnh SendKeys "%Down"

Sub Macro1()
Application.SendKeys "%Down"
End Sub

Macro này không lỗi nhưng Không biết tại sao nó không có tác dụng (không mở ValidateList).
Nhờ các bạn trợ giúp. Thanks!
 

File đính kèm

Upvote 0
Nhờ mod xóa giúp (bài gửi 2 lần)
 
Upvote 0
Mình định tự động mở ValidateList bằng tổ hợp phím Alt+Mũi tên xuống bằng lệnh SendKeys "%Down"

Sub Macro1()
Application.SendKeys "%Down"
End Sub

Macro này không lỗi nhưng Không biết tại sao nó không có tác dụng (không mở ValidateList).
Nhờ các bạn trợ giúp. Thanks!
ValidateList thấy lạ quá...
Hóa ra là Data Validation

Ở bên thớt này đang bàn luận về cái đó, anh xem có thông tin gì không.
http://www.giaiphapexcel.com/diendan/threads/tìm-kiếm-trong-data-validation-excel.127658/

Chúc anh ngày vui!
 
Upvote 0
Chào anh chị GPE
em có đoạn code bên dưới mỗi khi chạy xuất hiện bảng thông tin bên dưới, em muốn bỏ thì điều chỉnh ở dòng nào ạ.
mong anh chị xem và hướng dẫn giúp em. em cám ơn nhiều
upload_2017-7-23_20-11-12.png
PHP:
Sub SetDN()
Dim i As Integer
Dim lastRow As Long
Dim lastRow1 As Long
    For i = 2 To 20
        If Sheets("Pickticket").Range("A" & i).Value <> Empty Then
            Sheets("Pickticket").Range("A" & i).Copy
            Sheets("DN").Range("A2").PasteSpecial Paste:=xlPasteValues
            Sheets("CTN_LPN_Checking").Range("A2").PasteSpecial Paste:=xlPasteValues
            With Sheets("DN")
                lastRow = .Range("A10").Value
                .PageSetup.PrintArea = "C1:S" & lastRow
    Range("D11:P11").Select
    Range(Selection, Selection.End(xlDown)).Select
    ActiveWorkbook.Worksheets("DN").Sort.SortFields.Clear
    ActiveWorkbook.Worksheets("DN").Sort.SortFields.Add Key:=Range("D12:D500"), _
        SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    ActiveWorkbook.Worksheets("DN").Sort.SortFields.Add Key:=Range("F12:F500"), _
        SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
                With Sheets("DN").Sort
                    .SetRange Range("D11:P500")
                    .Header = xlYes
                    .MatchCase = False
                    .Orientation = xlTopToBottom
                    .SortMethod = xlPinYin
                    .Apply
                End With
            End With
                With Sheets("DN").PageSetup
                .PrintTitleRows = "$10:$10"
                End With
                With Sheets("CTN_LPN_Checking")
                    lastRow1 = .Range("A4").Value
                    .PageSetup.PrintArea = "C1:I" & lastRow1
                End With
                With Sheets("CTN_LPN_Checking").PageSetup
                .PrintTitleRows = "$1:$6"
                End With
                Sheets("DN").Copy after:=Sheets("DN")
                Sheets("CTN_LPN_Checking").Copy after:=Sheets("CTN_LPN_Checking")
        End If
    Next i
End Sub
 
Upvote 0
Chào anh chị GPE
em có đoạn code bên dưới mỗi khi chạy xuất hiện bảng thông tin bên dưới, em muốn bỏ thì điều chỉnh ở dòng nào ạ.
mong anh chị xem và hướng dẫn giúp em. em cám ơn nhiều

Bạn thử thêm câu nàu xem có được không
Application.EnableEvents = False
 
Upvote 0
Upvote 0
Mình định tự động mở ValidateList bằng tổ hợp phím Alt+Mũi tên xuống bằng lệnh SendKeys "%Down"

Sub Macro1()
Application.SendKeys "%Down"
End Sub

Macro này không lỗi nhưng Không biết tại sao nó không có tác dụng (không mở ValidateList).
Nhờ các bạn trợ giúp. Thanks!
Hình như phải vầy anh à
Application.SendKeys "%{Down}"
 
Upvote 0
Upvote 0
Chay bằng phìm f5 cungc vẫn không được
SendKey thì cửa sổ nào đang active (hiện hành) thì nó send key tại cửa sổ đó.
Anh đang trong cửa sổ VBA mà nhấn F5 (Run) thì nó chạy dòng send key đó, tức là nhấn tổ hợp phím Alt + Arrow Down trong cửa sổ VBA. Khi đó thì đúng là anh chẳng thấy cái gì rồi.
 
Upvote 0
Ý mình là câu lệnh đó nó không có tác dụng trên màn hình. Trong bài không thấy nói về xử lý tình huống này.
Thế thì anh chưa đọc hết topic đó rồi. Ngay bài #1 của topic đó có nói SendKey bị "mất phím Numlock". Không tin anh kiểm tra Numlock sau mỗi lần SendKey xem.


Theo bài #826 có gợi ý cho anh rồi. Do anh dùng shape để gán macro thì shape đó không giữ được setFocus tại cell hiện hành (không biết sau khi send key thì nó nhảy đi đâu, rồi mới về cell hiện hành).
Anh có thể thử nghiệm: Click chuột trái và giữ im vào cái shape đó xem. Sau khi nhả chuột thì thấy gì..

Anh không dùng shape để gán macro nữa, thử theo bài #826 đó anh.
 
Upvote 0
Dạ em chào các anh chị,

Em có một bài toán chọn mẫu có điều kiện, muốn sử dụng code VBA để tự động giải quyết, nhưng chưa có nhiều kinh nghiệm.
nhờ anh chị định hướng giúp em với ạ.
1. Dữ liệu đầu vào
- Một sheet data nguồn "Data reference" có sẵn dùng để lấy thông tin
- Một bảng mã hàng bất kì sheet "Data cần lọc"
2. Dữ liệu đầu ra
- Chọn 10% mã hàng có trong list
Trong đó:
+ 7% rơi vào các mã hàng có tỉ lệ lỗi cao nhất
+ 3% rơi vào các mã hàng có tỉ lệ bốc mẫu cao nhất
+ mã hàng 7% và 3% ko trùng nhau
3. Bài toán ví dụ:
Data cần lọc có 40 mã hàng
=> chọn ra 4 mã hàng, trong đó
+ 3 mã hàng có tỉ lệ lỗi cao nhất (75%)
+ 1 mã hàng có tỉ lệ bốc mẫu cao nhất (25%)
4. Trợ giúp
Em muốn nhờ các bác chỉ giúp em macro làm tự động phần này với ạ.
Về concept là như vậy nhưng em vừa mới mò về VBA nên nhờ các anh chị định hướng giúp em về cách làm với ạ!


Em cám ơn mọi người rất nhiều!
 

File đính kèm

Upvote 0
Về concept là như vậy nhưng em vừa mới mò về VBA nên nhờ các anh chị định hướng giúp em về cách làm với ạ!

Còn xếp với còn xẹp!

Nếu còn xẹp chú ô lỳ cỏ rách thì phải dùng Excel 2016. Dùng Pivot Table và nối hai bảng với nhau qua key mã hàng. Lúc đó muốn lấy ra phần trăm gì tuỳ thích.
 
Upvote 0
Hi mọi người,

Em không rành lắm về VBA, nhờ mọi người hỗ trợ giùm em trường hợp này:

Em sẽ tạo 1 usseform và nội dung usedform này sẽ là giá trị của ô A2:E2 .
Em muốn viết code để lưu dữ liệu các ô này vào 1 file mới tên là filetong , và mỗi khi bấm save sẽ lưu tiếp tục xuống các dòng tiếp theo.
Nếu dữ liệu ô B2 đã tồn tại trong filetong thì sẽ save đè nội dung A2:E2 vào file filetong luôn .

Mọi người vui lòng giúp đỡ giùm em đoạn code này với !!!
 

File đính kèm

Upvote 0
Em có một chút vấn đề về code, trong file em đính kèm (cả ảnh lẫn file rar). Nhờ mọi người và các thầy chỉnh giúp:
1. Khắc phục tình trạng thời gian khi chạy về 00:00 không bị trễ giây khi kết hợp với âm thanh báo hiệu ạ.
2. Khi ở thời gian nghỉ giữa hiệp, khi về đến 00:10 (tức còn 10s) thì âm thanh báo hiệu sẽ kêu ạ.
Cảm ơn ạ!
 

File đính kèm

  • BTD.rar
    BTD.rar
    429.3 KB · Đọc: 22
  • Untitled.jpg
    Untitled.jpg
    128 KB · Đọc: 5
Upvote 0
Nhờ mọi người bớt chút thời gian gỡ rối vấn đề em nêu ở trên với ạ.
 
Upvote 0
Anh Bate ơi xem lại giúp em hình như có sự nhầm lẫn. Ví dụ ID 136457 ở nghỉ lẻ phần phép là 0.7 nhưng code không thấy cộng cái đó. Lý do vì cột ID có thể lặp lại, còn các loại nghỉ thì phải riêng rẽ không được cộng lẫn nhau.
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
PHP:
With Sheets("N")
R = .Range("AL60000").End(xlUp).Row
If R > 4 Then
    sArr = .Range("AL4:AL" & R).Resize(, 16).Value
    ReDim tArr(1 To UBound(sArr), 1 To 16)
        For i = 2 To UBound(sArr)
            If Not Dic.Exists(sArr(i, 1)) Then
                k = k + 1
                Dic.Item(sArr(i, 1)) = k
                tArr(k, 1) = sArr(i, 1)
            End If
            For j = 6 To 16
                If sArr(1, j) = "P" Then
                    tArr(Dic.Item(sArr(i, 1)), j) = tArr(Dic.Item(sArr(i, 1)), j) + sArr(i, j)
                ElseIf sArr(1, j) = "NC" Then
                    tArr(Dic.Item(sArr(i, 1)), j) = tArr(Dic.Item(sArr(i, 1)), j) + sArr(i, j)
                ElseIf sArr(1, j) = "N" Then
                    tArr(Dic.Item(sArr(i, 1)), j) = tArr(Dic.Item(sArr(i, 1)), j) + sArr(i, j)
                ElseIf sArr(1, j) = "BH" Then
                    tArr(Dic.Item(sArr(i, 1)), j) = tArr(Dic.Item(sArr(i, 1)), j) + sArr(i, j)
                ElseIf sArr(1, j) = "CN" Then
                    tArr(Dic.Item(sArr(i, 1)), j) = tArr(Dic.Item(sArr(i, 1)), j) + sArr(i, j)
                ElseIf sArr(1, j) = "M7" Then
                    tArr(Dic.Item(sArr(i, 1)), j) = tArr(Dic.Item(sArr(i, 1)), j) + sArr(i, j)
                ElseIf sArr(1, j) = "TM" Then
                    tArr(Dic.Item(sArr(i, 1)), j) = tArr(Dic.Item(sArr(i, 1)), j) + sArr(i, j)
                ElseIf sArr(1, j) = "KH" Then
                    tArr(Dic.Item(sArr(i, 1)), j) = tArr(Dic.Item(sArr(i, 1)), j) + sArr(i, j)
                ElseIf sArr(1, j) = "SP" Then
                    tArr(Dic.Item(sArr(i, 1)), j) = tArr(Dic.Item(sArr(i, 1)), j) + sArr(i, j)
                ElseIf sArr(1, j) = "DN" Then
                    tArr(Dic.Item(sArr(i, 1)), j) = tArr(Dic.Item(sArr(i, 1)), j) + sArr(i, j)
                ElseIf sArr(1, j) = "LT" Then
                    tArr(Dic.Item(sArr(i, 1)), j) = tArr(Dic.Item(sArr(i, 1)), j) + sArr(i, j)
                End If
             
            Next j
        Next i
     
    End If
    .Range("AM13").Resize(k, 6) = tArr
End With

Em viết lại ở phần đầu của module GPE, Sub Bate đã liệt kê được ID và các loại nghỉ riêng rẽ. Nhưng ở phần dưới chỗ code

PHP:
'Ngay nghi....................................................................
            If sArr(i, j) = "LT" Then
                dArr(k, 6) = dArr(k, 6) + 1
                    If Dic.Exists(sArr(i, 4)) Then dArr(k, 6) = dArr(k, 6) + tArr(Dic.Item(sArr(i, 1)), 16)
vẫn không thấy nó cộng, không biết sai ở đâu mong mọi người chỉ giúp. số 16 số thứ tự của cột LT.
 
Lần chỉnh sửa cuối:
Upvote 0
Em giả lập một file lên đây, anh chị tạo giúp em sử dụng Dic như thế nào để ra kết quả như vùng đổ màu vàng ở sheet KQ nhé. Em cảm ơn ạ!
 

File đính kèm

Upvote 0
PHP:
With Sheets("N")
R = .Range("AL60000").End(xlUp).Row
If R > 4 Then
    sArr = .Range("AL4:AL" & R).Resize(, 16).Value
    ReDim tArr(1 To UBound(sArr), 1 To 16)
        For i = 2 To UBound(sArr)
            If Not Dic.Exists(sArr(i, 1)) Then
                k = k + 1
                Dic.Item(sArr(i, 1)) = k
                tArr(k, 1) = sArr(i, 1)
            End If
            For j = 6 To 16
                If sArr(1, j) = "P" Then
                    tArr(Dic.Item(sArr(i, 1)), j) = tArr(Dic.Item(sArr(i, 1)), j) + sArr(i, j)
                ElseIf sArr(1, j) = "NC" Then
                    tArr(Dic.Item(sArr(i, 1)), j) = tArr(Dic.Item(sArr(i, 1)), j) + sArr(i, j)
                ElseIf sArr(1, j) = "N" Then
                    tArr(Dic.Item(sArr(i, 1)), j) = tArr(Dic.Item(sArr(i, 1)), j) + sArr(i, j)
                ElseIf sArr(1, j) = "BH" Then
                    tArr(Dic.Item(sArr(i, 1)), j) = tArr(Dic.Item(sArr(i, 1)), j) + sArr(i, j)
                ElseIf sArr(1, j) = "CN" Then
                    tArr(Dic.Item(sArr(i, 1)), j) = tArr(Dic.Item(sArr(i, 1)), j) + sArr(i, j)
                ElseIf sArr(1, j) = "M7" Then
                    tArr(Dic.Item(sArr(i, 1)), j) = tArr(Dic.Item(sArr(i, 1)), j) + sArr(i, j)
                ElseIf sArr(1, j) = "TM" Then
                    tArr(Dic.Item(sArr(i, 1)), j) = tArr(Dic.Item(sArr(i, 1)), j) + sArr(i, j)
                ElseIf sArr(1, j) = "KH" Then
                    tArr(Dic.Item(sArr(i, 1)), j) = tArr(Dic.Item(sArr(i, 1)), j) + sArr(i, j)
                ElseIf sArr(1, j) = "SP" Then
                    tArr(Dic.Item(sArr(i, 1)), j) = tArr(Dic.Item(sArr(i, 1)), j) + sArr(i, j)
                ElseIf sArr(1, j) = "DN" Then
                    tArr(Dic.Item(sArr(i, 1)), j) = tArr(Dic.Item(sArr(i, 1)), j) + sArr(i, j)
                ElseIf sArr(1, j) = "LT" Then
                    tArr(Dic.Item(sArr(i, 1)), j) = tArr(Dic.Item(sArr(i, 1)), j) + sArr(i, j)
                End If
           
            Next j
        Next i
   
    End If
    .Range("AM13").Resize(k, 6) = tArr
End With

Em viết lại ở phần đầu của module GPE, Sub Bate đã liệt kê được ID và các loại nghỉ riêng rẽ. Nhưng ở phần dưới chỗ code

PHP:
'Ngay nghi....................................................................
            If sArr(i, j) = "LT" Then
                dArr(k, 6) = dArr(k, 6) + 1
                    If Dic.Exists(sArr(i, 4)) Then dArr(k, 6) = dArr(k, 6) + tArr(Dic.Item(sArr(i, 1)), 16)
vẫn không thấy nó cộng, không biết sai ở đâu mong mọi người chỉ giúp. số 16 số thứ tự của cột LT.
Bạn đưa 1 file hồi "Chí Phèo ở truồng" rồi hỏi, ai mà biết file của bạn làm gì,.
Cột nào lấy từ đâu, cộng với cột nào lấy từ đâu?
Đọc lại từng dòng code để hiểu nó làm gì thì thà viết mới còn "sướng" hơn.
Bạn kiểm tra lại file này xem sao, nếu không đúng thì giải thích lại từ đầu, viết lại từ đầu.
Em giả lập một file lên đây, anh chị tạo giúp em sử dụng Dic như thế nào để ra kết quả như vùng đổ màu vàng ở sheet KQ nhé. Em cảm ơn ạ!
File "giả lập" của bạn mà áp dụng được vào file thật thì là "Siêu" luôn.
 

File đính kèm

Upvote 0
Bạn đưa 1 file hồi "Chí Phèo ở truồng" rồi hỏi, ai mà biết file của bạn làm gì,.
Cột nào lấy từ đâu, cộng với cột nào lấy từ đâu?
Đọc lại từng dòng code để hiểu nó làm gì thì thà viết mới còn "sướng" hơn.
Bạn kiểm tra lại file này xem sao, nếu không đúng thì giải thích lại từ đầu, viết lại từ đầu.

File "giả lập" của bạn mà áp dụng được vào file thật thì là "Siêu" luôn.
PHP:
 If Dic.Exists(sArr(I, 4)) Then
            Rws = Dic.Item(sArr(I, 4))
            For J = 6 To 9
                If tArr(Rws, J) > 0 Then dArr(K, J) = tArr(Rws, J)
            Next J
            For J = 7 To 16
                If tArr(Rws, J) > 0 Then dArr(K, J + 1) = tArr(Rws, J)
            Next J
        End If

Vâng gần đúng rồi anh ơi.
Anh ơi đặt trường hợp các Selecct case cũng có kết quả thì sao ạ? Ví dụ ở Select Case P ra kết quả là 1 (bằng cách thử điền P vào cột K8) như vậy thì kết quả em cần là 1.7. Em thử viết lại là. Vì ở sheet nghỉ lẻ chỉ là nghỉ nửa buổi hay gì đó cần cộng thêm vào, còn cái chính trong sheet BCC nếu nghỉ nguyên ngày ví dụ Phép thì em điền P. Cái này Select case của anh đã tính đến. Nhưng nó không cộng tổng cùng với nghỉ lẻ mà nếu nghỉ lẻ thì sẽ chỉ lấy của nghỉ lẻ bỏ qua cái select case đã tính kia.
If tArr(Rws, J) > 0 Then dArr(K, J) =dArr(K, J)+ tArr(Rws, J) thì có đúng không?

Nếu đúng thì chỗ code:
If tArr(Rws, J) > 0 Then dArr(K, J + 1) = tArr(Rws, J) em phải sửa tiếp như nào ạ??.
 
Lần chỉnh sửa cuối:
Upvote 0
PHP:
 If Dic.Exists(sArr(I, 4)) Then
            Rws = Dic.Item(sArr(I, 4))
            For J = 6 To 9
                If tArr(Rws, J) > 0 Then dArr(K, J) = tArr(Rws, J)
            Next J
            For J = 7 To 16
                If tArr(Rws, J) > 0 Then dArr(K, J + 1) = tArr(Rws, J)
            Next J
        End If

Vâng gần đúng rồi anh ơi.
Anh ơi đặt trường hợp các Selecct case cũng có kết quả thì sao ạ? Ví dụ ở Select Case P ra kết quả là 1 (bằng cách thử điền P vào cột K8) như vậy thì kết quả em cần là 1.7. Em thử viết lại là. Vì ở sheet nghỉ lẻ chỉ là nghỉ nửa buổi hay gì đó cần cộng thêm vào, còn cái chính trong sheet BCC nếu nghỉ nguyên ngày ví dụ Phép thì em điền P. Cái này Select case của anh đã tính đến. Nhưng nó không cộng tổng cùng với nghỉ lẻ mà nếu nghỉ lẻ thì sẽ chỉ lấy của nghỉ lẻ bỏ qua cái select case đã tính kia.
If tArr(Rws, J) > 0 Then dArr(K, J) =dArr(K, J)+ tArr(Rws, J) thì có đúng không?

Nếu đúng thì chỗ code:
If tArr(Rws, J) > 0 Then dArr(K, J + 1) = tArr(Rws, J) em phải sửa tiếp như nào ạ??.
Hổng biết luôn. Code cũ chạy ra kết quả cột nào, thế nào? Bbây giờ muốn cột nào có kết quả thế nào?,
Đã nói là chuyện của bạn chỉ bạn hiểu, người không trong ngành viết xong là "xóa bộ nhớ" luôn rồi.
 
Upvote 0
Vâng em mô tả lại nhé. Tại Sheet BCC có các ngày nghỉ (P, BH, KH...)ở các cột có tiêu đề WD. Với phần select case em thấy các ngày nghỉ này đã được cộng và cho ra kết quả bắt đầu từ cột EK đến EW của sheet BCC. Tuy nhiên có một số trường hợp họ nghỉ lẻ, Ví dụ em giả lập bạn có ID 136457 ở sheet N cột P
em ghi 0.7 nghĩ là bạn đó nghỉ 0.7 P. Như vậy em muốn ngoài cái P đã tính được ở sheet BCC thì cộng thêm cái lẻ này nữa anh ạ.

Ngoài ra em phân tích code của anh như này xem có đúng không anh nhé:
PHP:
        If Dic.Exists(sArr(I, 4)) Then 'Neu ton tai key sArr(I,4) thi
            Rws = Dic.Item(sArr(I, 4))  'Gan sArr(I,4) thanh Item
            For J = 6 To 9 'Xet cot tu 6 den 9 tuong duong cot EK den EO cua sheet BCC
                If tArr(Rws, J) > 0 Then dArr(K, J) = tArr(Rws, J)
            Next J
            For J = 7 To 16 'Xet cot tu 7 den 16--> cai nay em khong hieu em tuong tu 11 den 17?
                If tArr(Rws, J) > 0 Then dArr(K, J + 1) = tArr(Rws, J) 'Vu J+1 em cung khong hieu tai sao?
            Next J
        End If
 
Lần chỉnh sửa cuối:
Upvote 0
Hix, huhu ... Chỉnh giúp em với các anh ơi...!!
 
Upvote 0
Vâng em mô tả lại nhé. Tại Sheet BCC có các ngày nghỉ (P, BH, KH...)ở các cột có tiêu đề WD. Với phần select case em thấy các ngày nghỉ này đã được cộng và cho ra kết quả bắt đầu từ cột EK đến EW của sheet BCC. Tuy nhiên có một số trường hợp họ nghỉ lẻ, Ví dụ em giả lập bạn có ID 136457 ở sheet N cột P
em ghi 0.7 nghĩ là bạn đó nghỉ 0.7 P. Như vậy em muốn ngoài cái P đã tính được ở sheet BCC thì cộng thêm cái lẻ này nữa anh ạ.
Có vẻ "hơi bị hiểu chút chút"
Bạn kiểm tra lại file này
 
Upvote 0
Hi đúng rồi anh ạ nhưng em chưa hiểu cái vụ xét J từ 7 đến 16, và vụ J+1 anh giải thích cho em hiểu với nhé.
Hình như có nhầm lẫn ở bài trên, tôi xóa file đính kèm,, bạn xem lại flle này:
Số cột trong Code tôi có ghi nháp bên trên mỗi bảng.
Từ cột 6-9, 2 bảng giống nhau.
Từ cột 10-16 bảng này lại là 11-17 bảng kia. Bạn tự hiểu.
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Hình như có nhầm lẫn ở bài trên, tôi xóa file đính kèm,, bạn xem lại flle này:
Số cột trong Code tôi có ghi nháp bên trên mỗi bảng.
Từ cột 6-9, 2 bảng giống nhau.
Từ cột 10-16 bảng này lại là 11-17 bảng kia. Bạn tự hiểu.

À, có phải cái xét từ 6 đến 9 và 10 đến 16 là xét cái cột bên sheet N đúng không anh. Và anh + thêm 1 là vì bên BCC bị ngăn cách cột tổng nên phải +1 để nhảy qua cột đó.
 
Upvote 0
Hix, huhu ... Chỉnh giúp em với các anh ơi...!!
Bạn thích "hu hu" nhưng lại viết không đầu không đuôi, sau bài viết của người khác, người khác cứ nghĩ là bạn "nhắc" mọi người giúp bài của bạn "tueyennhi".
Sao bạn không chịu khó nhắc rõ mọi người giúp bài nào? Của ai?
Híc! Có lẽ vì vậy mà không ai biết giúp bạn cái gì. Và bạn tiếp tục "hu hu". Mà "hu hu" trên GPE lại càng không ai giúp.
 
Upvote 0
À, có phải cái xét từ 6 đến 9 và 10 đến 16 là xét cái cột bên sheet N đúng không anh. Và anh + thêm 1 là vì bên BCC bị ngăn cách cột tổng nên phải +1 để nhảy qua cột đó.
Có lẽ sẽ có bạn "thangteo" bấm "Thích" bài viết của bạn đó.
 
Upvote 0
Bạn thích "hu hu" nhưng lại viết không đầu không đuôi, sau bài viết của người khác, người khác cứ nghĩ là bạn "nhắc" mọi người giúp bài của bạn "tueyennhi".
Sao bạn không chịu khó nhắc rõ mọi người giúp bài nào? của ai?
Híc! Có lẽ vì vậy mà không ai biết giúp bạn cái gì. Và bạn tiếp tục "hu hu". Mà "hu hu" trên GPE lại càng không ai giúp.
Có cách nào để nhìn xem đó là bài # bao nhiêu không anh? Em on điện thoại ko làm sao biết bài em đã nhờ là bài # mấy cả, dù nó nằm ở trang 42, có đính kèm file tên là BTD.rar và cả file ảnh có nội dung code nữa.. Hix..
 
Upvote 0
Có cách nào để nhìn xem đó là bài # bao nhiêu không anh? Em on điện thoại ko làm sao biết bài em đã nhờ là bài # mấy cả, dù nó nằm ở trang 42, có đính kèm file tên là BTD.rar và cả file ảnh có nội dung code nữa.. Hix..

Gần nút Like có cái #xxx đấy bạn.
 
Upvote 0
Em có một chút vấn đề về code, trong file em đính kèm (cả ảnh lẫn file rar). Nhờ mọi người và các thầy chỉnh giúp:
1. Khắc phục tình trạng thời gian khi chạy về 00:00 không bị trễ giây khi kết hợp với âm thanh báo hiệu ạ.
2. Khi ở thời gian nghỉ giữa hiệp, khi về đến 00:10 (tức còn 10s) thì âm thanh báo hiệu sẽ kêu ạ.
Cảm ơn ạ!
bài của "thangteo" đây các anh các chị ạ
 
Upvote 0
Bài đã xong, em nhờ mod xóa giùm khỏi tốm đất của GPE :-)
 
Lần chỉnh sửa cuối:
Upvote 0
K/g các Anh,
Mình có 1 file excel sử dụng Record Macro để tạo chương trình, chạy thông qua nút lệnh Combobox Form Controls (Assign macro) --> Macro chạy bình thường.
Nhưng khi tạo nút lệnh Combobox ActiveX Controls (View code -> Call Macro_A) --> Chương trình báo lỗi trong câu lệnh của macro.
Mình không hiểu tại sao cùng một macro chạy bằng hai nút lệnh trên, cái thì báo lỗi, cái thì chạy bình thường.
Kính nhờ các Anh & Chủ Thớt kiểm tra và xử lý dùm mình với!! (file gửi kèm).
 

File đính kèm

Upvote 0
Cho em hỏi câu lệnh On Error Resume Next nếu nằm trong vùg If thì chỉ có tác dụng trong vùng có If đó đúng không ạ?

Ví dụ
 
Upvote 0
K/g các Anh,
Mình có 1 file excel sử dụng Record Macro để tạo chương trình, chạy thông qua nút lệnh Combobox Form Controls (Assign macro) --> Macro chạy bình thường.
Nhưng khi tạo nút lệnh Combobox ActiveX Controls (View code -> Call Macro_A) --> Chương trình báo lỗi trong câu lệnh của macro.
Mình không hiểu tại sao cùng một macro chạy bằng hai nút lệnh trên, cái thì báo lỗi, cái thì chạy bình thường.
Kính nhờ các Anh & Chủ Thớt kiểm tra và xử lý dùm mình với!! (file gửi kèm).
Cell link của Combobox Form Controls sẽ trả về chỉ số (index) của combobox còn LinkedCell của Combobox ActiveX Controls trả về giá trị của combobox. Hai đối tượng này trả về hai dạng giá trị khác nhau nên nếu bạn dùng chung 1 thủ tục (sub) thì chắc chắn kết quả sẽ khác nhau (trường hợp cụ thể của bạn là 1 cái được và 1 cái lỗi).
 
Upvote 0
K/g các Anh,
Mình có 1 file excel sử dụng Record Macro để tạo chương trình, chạy thông qua nút lệnh Combobox Form Controls (Assign macro) --> Macro chạy bình thường.
Nhưng khi tạo nút lệnh Combobox ActiveX Controls (View code -> Call Macro_A) --> Chương trình báo lỗi trong câu lệnh của macro.
Mình không hiểu tại sao cùng một macro chạy bằng hai nút lệnh trên, cái thì báo lỗi, cái thì chạy bình thường.
Kính nhờ các Anh & Chủ Thớt kiểm tra và xử lý dùm mình với!! (file gửi kèm).
Riêng máy tôi cả 2 chạy đều báo lỗi hết, Chổ Combobox1 của bạn bỏ đi chổ LinkedCell (của bạn để là K1, bây giờ xóa nó đi), vào code trong sheet bạn thêm vào dòng lệnh như sau:
Mã:
Private Sub ComboBox1_Change()
    [K1].Value = ComboBox1.ListIndex + 1
    Call crane
End Sub
 
Upvote 0
Cho em hỏi câu lệnh On Error Resume Next nếu nằm trong vùg If thì chỉ có tác dụng trong vùng có If đó đúng không ạ?

Ví dụ

msgbox "Nhan Ok de thu, neu thay error la khong ap dung ben ngoai if"
if 1 = 1 then
on error resume next
end if
a = 1/0
msgbox "co ap dung ben ngoai if"

Nhưng cái này là chuyện khác, tôi đã từng giải thích rồi
On error resume next
s = "bo qua ca if lan else "
if a=1/0 then
s = "vao if xong "
else
s = "vao else xong "
end if
msgbox s & "moi ve den day"


On error resume next
s = "bo qua if "
if a=1/0 then s = "vao if xong "
msgbox s & "moi ve den day"
 
Lần chỉnh sửa cuối:
Upvote 0
Cell link của Combobox Form Controls sẽ trả về chỉ số (index) của combobox còn LinkedCell của Combobox ActiveX Controls trả về giá trị của combobox. Hai đối tượng này trả về hai dạng giá trị khác nhau nên nếu bạn dùng chung 1 thủ tục (sub) thì chắc chắn kết quả sẽ khác nhau (trường hợp cụ thể của bạn là 1 cái được và 1 cái lỗi).
Anh Thắng ơi, giúp em chỉnh code ở #835 với. (Em có gửi Mail cho anh mà không thấy hồi âm). Rất mong sự giúp đỡ của anh ạ.
 
Upvote 0
Anh Thắng ơi, giúp em chỉnh code ở #835 với. (Em có gửi Mail cho anh mà không thấy hồi âm). Rất mong sự giúp đỡ của anh ạ.
Bạn đã yêu cầu xóa đề tài thì tôi nghĩ chắc tất cả đã xong rồi. Sao bạn còn hỏi về cái file đó nữa?
Xin Mod đi qua xóa giúp Đề tài này ạ! Xin phép dừng tại đây! Cảm ơn tất cả mọi người đã giúp đỡ trong thời gian qua.
Topic này có nhiều thông tin hữu ích. Tôi không muốn chỉ vì tôi giúp bạn mà topic này bị xóa :D
 
Upvote 0
Bạn đã yêu cầu xóa đề tài thì tôi nghĩ chắc tất cả đã xong rồi. Sao bạn còn hỏi về cái file đó nữa?

Topic này có nhiều thông tin hữu ích. Tôi không muốn chỉ vì tôi giúp bạn mà topic này bị xóa :D
Hixx.. Dạ vâng, có gì không đúng mong anh và mọi người đừng chấp và thông cảm. Cảm ơn ạ.
 
Upvote 0
GPE giúp e đoạn code này với. Trước giờ chạy bình thường tự nhiên hôm nay báo lỗi.
Mã:
Sheets("INPUT").Select
   Selection.AutoFilter Field:=4
    Call timdulieu
    Sheets("INPUT").Select
   Selection.AutoFilter Field:=3
   Selection.AutoFilter Field:=4
   Call noiluc
   Call luccat
   Call lucxoan
   Sheets("INPUT").Select
Selection.AutoFilter Field:=3
Selection.AutoFilter Field:=4
 Sheets("NOILUC").Select
   ActiveSheet.Range(Cells(1, 1), Cells(5000, 14)).Select
   Selection.Copy
   Sheets("THUYET MINH").Select
    Range("K9").Select
    ActiveSheet.Paste
End Sub
báo lỗi ở dòng: Sheets("THUYET MINH").Select ạ
 
Upvote 0
GPE giúp e đoạn code này với. Trước giờ chạy bình thường tự nhiên hôm nay báo lỗi.
Mã:
Sheets("INPUT").Select
   Selection.AutoFilter Field:=4
    Call timdulieu
    Sheets("INPUT").Select
   Selection.AutoFilter Field:=3
   Selection.AutoFilter Field:=4
   Call noiluc
   Call luccat
   Call lucxoan
   Sheets("INPUT").Select
Selection.AutoFilter Field:=3
Selection.AutoFilter Field:=4
 Sheets("NOILUC").Select
   ActiveSheet.Range(Cells(1, 1), Cells(5000, 14)).Select
   Selection.Copy
   Sheets("THUYET MINH").Select
    Range("K9").Select
    ActiveSheet.Paste
End Sub
báo lỗi ở dòng: Sheets("THUYET MINH").Select ạ
Anh thử xem lại xem sheet THUYET MINH đó có dấu cách hay không.
 
Upvote 0
GPE giúp e đoạn code này với. Trước giờ chạy bình thường tự nhiên hôm nay báo lỗi.
Mã:
Sheets("INPUT").Select
   Selection.AutoFilter Field:=4
..
End Sub
báo lỗi ở dòng: Sheets("THUYET MINH").Select ạ
Chẳng biết có đúng không nhưng rút gọn lại như dưới, nếu không nó sẽ giật giật như đèn nháy...
PHP:
    Sheets("INPUT").AutoFilter Field:=4
    Call timdulieu
    Sheets("INPUT").AutoFilter Field:=3
    Sheets("INPUT").AutoFilter Field:=4
    Call noiluc
    Call luccat
    Call lucxoan
    Sheets("INPUT").AutoFilter Field:=3
    Sheets("INPUT").AutoFilter Field:=4
    Sheets("NOILUC").Range(Cells(1, 1), Cells(5000, 14)).Copy Sheets("THUYET MINH").Range("K9").Paste
 
Upvote 0
@thangteo: ý a là dấu cách ở tên của sheets? Nếu là tên sheets thì nó có cách.
@befaint: Đúng là nó nháy như đèn thật bác ạ, mà sửa lại thì vẫn báo lỗi
 
Upvote 0
Chào các bác,
Em cần đưa ảnh ở trong cùng thư mục vào file excel theo từng dòng tương ứng với tên ảnh, trước đã hoạt động tốt nhưng nay mang ra chạy thì nó đứng yên. Các bác giúp em với. Xin cảm ơn:

Add: Các marco khác em chạy vô tư, khi chạy code dưới thì nó báo: Can't execute this code in break mode.


Mã:
Public Sub inputimages()

Dim curFile As String
Dim rHeight As Double

If ActiveSheet.Name <> "Sheet1" Then Exit Sub

If ActiveSheet.Cells(1, 1).Value = "" Then
    curFile = Dir(ActiveWorkbook.Path & "\", vbNormal)
    While curFile <> ""
        For i = 2 To 1000
            If ActiveSheet.Cells(i, 1).Value = curFile Then
                ActiveSheet.Pictures.Insert(ActiveWorkbook.Path & "\" & curFile).Select
                With Selection
                    .Left = ActiveSheet.Cells(i, 2).Left
                    .Top = ActiveSheet.Cells(i, 2).Top
                    .Height = WorksheetFunction.Min(100, .Height)
                    rHeight = .Height
                End With
                ActiveSheet.Rows(i).Select
                Selection.rowHeight = rHeight
            End If
        Next
        curFile = Dir
    Wend
End If

End Sub
Bạn dùng cái này xem có được không
httpss://www.youtube.com/watch?v=tMAR57PjCdg
 
Upvote 0
Thầy và các bạn cho em hỏi. Em có vẽ một textbox trên worksheet bằng ActiveX Control.
Em muốn khi nhấn ESC thì sẽ xóa giá trị của textbox và con trỏ chuột cũng nằm trên textbox.
Code em viết vậy thì chỉ xóa được giá trị của textbox nhưng con trỏ chuột lại không nằm trên textbox nữa.
em thử setfocus rồi nhưng cũng không được.

Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
If KeyCode = 27 Then
TextBox1.Value = ""
TextBox1.Activate
End If
End Sub

Xin cam on
 
Upvote 0
Thầy và các bạn cho em hỏi. Em có vẽ một textbox trên worksheet bằng ActiveX Control.
Em muốn khi nhấn ESC thì sẽ xóa giá trị của textbox và con trỏ chuột cũng nằm trên textbox.
Code em viết vậy thì chỉ xóa được giá trị của textbox nhưng con trỏ chuột lại không nằm trên textbox nữa.
em thử setfocus rồi nhưng cũng không được.

Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
If KeyCode = 27 Then
TextBox1.Value = ""
TextBox1.Activate
End If
End Sub

Xin cam on
Làm gì có vụ TextBox1.Activate hả bạn? Có chăng là TextBox1.SetFocus thì được
 
Upvote 0
khi nhấn ESC thì sẽ xóa giá trị của textbox và con trỏ chuột cũng nằm trên textbox.
PHP:
Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
If KeyCode = 27 Then
    KeyCode = 0
    TextBox1.Value = ""
    TextBox1.Activate
End If
End Sub
 
Upvote 0
Mình thấy trong VBA Bác Bill có Static Sub như sau nó có tác dụng Gì ???!!!

1/ Tại sao phải khai báo Static trước sub
2/ Sử dụng Nó trong trường hợp nào là phù hợp ??!!!
3/ Nó khác với sub bình thường cái gì hay chỉ đơn giản thêm từ Static
4/ Nếu không có ích gì thì tại sao Bác Bill lại cho nó như vậy
5/ Nó khác gì với khai báo biến kiểu Static
6/ Ai biết xin mách dùm ................. Tại sao nhỉ

PHP:
Public Static Sub Abcxyz()
MsgBox "OK"
End Sub
 
Upvote 0
Mình thấy trong VBA Bác Bill có Static Sub như sau nó có tác dụng Gì ???!!!

1/ Tại sao phải khai báo Static trước sub
2/ Sử dụng Nó trong trường hợp nào là phù hợp ??!!!
3/ Nó khác với sub bình thường cái gì hay chỉ đơn giản thêm từ Static
4/ Nếu không có ích gì thì tại sao Bác Bill lại cho nó như vậy
5/ Nó khác gì với khai báo biến kiểu Static
6/ Ai biết xin mách dùm ................. Tại sao nhỉ

PHP:
Public Static Sub Abcxyz()
MsgBox "OK"
End Sub
Cái ni chắc lại réo anh VetMini lên thôi :D

http://www.giaiphapexcel.com/dienda...te-public-static-function.108740/#post-679757
 
Upvote 0
Mình thấy trong VBA Bác Bill có Static Sub như sau nó có tác dụng Gì ???!!!

1/ Tại sao phải khai báo Static trước sub
2/ Sử dụng Nó trong trường hợp nào là phù hợp ??!!!
3/ Nó khác với sub bình thường cái gì hay chỉ đơn giản thêm từ Static
4/ Nếu không có ích gì thì tại sao Bác Bill lại cho nó như vậy
5/ Nó khác gì với khai báo biến kiểu Static
6/ Ai biết xin mách dùm ................. Tại sao nhỉ

PHP:
Public Static Sub Abcxyz()
MsgBox "OK"
End Sub
Quá đơn giản, nó cho biết rằng tất cả các biến cục bộ trong sub đều là static ( được giữ lại giá trị sau các lần gọi). nếu thủ tục cần có 10 biến static, nếu gõ 10 cái static cũng lâu, thay vào đó gõ một cái là được.
 
Upvote 0
em mới bắt đầu học vba, giờ muốn làm 1 bài đánh số thứ tự từ trên xuống theo nhóm liên tục.
+ giả sử cột dữ liệu cần đánh stt là A, và cột đánh stt là B thì từ :B1 B2 B3 = 111 tiếp theo B4 B5 B6 = 222........ chạy liên tục cho đến hàng cuối cùng cột A
+ Em đã viết được 1 sub để chạy, nhưng sub chỉ đúng khi cột dữ liệu bắt đầu từ A1 hoặc A2 tương ứng bắt đầu đánh số thứ tự là B1 hoặc B2. còn từ hàng tiếp theo sub chạy sai ( ví dụ cột dữ liệu từ A3 và hàng đánh stt bắt đầu từ B3)
Nhờ các bác xem và sửa lại code theo file đính kèm sao cho code có thể chạy nếu nhập vào hàng bất kỳ. Nếu code sửa như nào, các bác giải thích cho e hiểu với. thanks all
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Quá đơn giản, nó cho biết rằng tất cả các biến cục bộ trong sub đều là static ( được giữ lại giá trị sau các lần gọi). nếu thủ tục cần có 10 biến static, nếu gõ 10 cái static cũng lâu, thay vào đó gõ một cái là được.
static thì mình biết ... Còn bạn giải thích nghe chưa thuyết phục lắm
1/ Căn cứ vào đâu ???
2/ Tài liệu nào trích dẫn ???
3/ Nếu câu 1 & 2 không có Thì: VD chứng minh Bạn giải thích là đúng !!! ???
 
Upvote 0
bị
static thì mình biết ... Còn bạn giải thích nghe chưa thuyết phục lắm
1/ Căn cứ vào đâu ???
2/ Tài liệu nào trích dẫn ???
3/ Nếu câu 1 & 2 không có Thì: VD chứng minh Bạn giải thích là đúng !!! ???
sư phụ em bảo thế. lúc nào rảnh viết code là hiểu liền
 
Upvote 0
Thay vì họanh họe người có chút thành ý chia sẻ , tôi bỏ ra 30s thử viết cái này
PHP:
Static Sub ton30sthuthoi()
    Dim a, b
    a = a + 1
    b = b + 1
    Debug.Print a, b
End Sub
và thu được kết quả sau 6 phát run
1 1
2 2
3 3
4 4
5 5
6 6
Hay phết NguyenNgocThuHien nhở! Cơ mà sư phụ của cô là ai thế? :D
 
Lần chỉnh sửa cuối:
Upvote 0
Thay vì họanh họe người có chút thành ý chia sẻ , tôi bỏ ra 30s thử viết cái này
PHP:
Static Sub ton30sthuthoi()
    Dim a, b
    a = a + 1
    b = b + 1
    Debug.Print a, b
End Sub
và thu được kết quả sau 6 phát run
1 1
2 2
3 3
4 4
5 5
6 6
Hay phết NguyenNgocThuHien nhở! Cơ mà sư phụ của cô là ai thế? :D
Mình mới Thử Run 1 cái nó ra như hình nè ...Run cái nữa nó + 1Capture.PNG
 
Upvote 0
Thay vì họanh họe người có chút thành ý chia sẻ , tôi bỏ ra 30s thử viết cái này
PHP:
Static Sub ton30sthuthoi()
    Dim a, b
    a = a + 1
    b = b + 1
    Debug.Print a, b
End Sub
và thu được kết quả sau 6 phát run
1 1
2 2
3 3
4 4
5 5
6 6
Hay phết NguyenNgocThuHien nhở! Cơ mà sư phụ của cô là ai thế? :D
dùng static trong class thì còn nhiều điều hấp dẫn hơn nhiều.
 
Upvote 0
Cái ni chắc lại réo anh VetMini lên thôi :D

VBA là ngôn ngữ rất tuỳ thuộc vào moi trường dịch. Lúc xem code, ngừoi ta luôn luôn chú ý đến cái phần Options ở đầu mô đun. Kế đó là để ý các tiền tố của khai báo.

VBA có cái luật rất vô duyên là cha mẹ có quyền điều khiển con cái.
Điển hình này là 1: Để khỏi mất công chỉnh từng lệnh Dim trong hàm thành Static, ngừoi ta chỉ cần khai báo hàm Static là tất cả các biến nội của hàm trở thành static.
Tôi đoán lý do MS ra cái luật vô duyên này là vì nếu bạn không Option Explicit thì các biến trong hàm có thể dùng mà không cần khai báo; khi bạn muốn sửa chúng thành static thì phải lục từng cái ra để khai báo, cái nào sót là tèo; giải pháp của MS là cho cha mẹ (hàm) ép chúng static luôn cho tiện.

- Cái này dùng để In ra Số phiếu tiếp theo, giống như ở các Bệnh viện, bệnh nhân lấy Số Phiếu liên tục ấy nhỉ.

Tầm bậy. Làm việc kiểu này thì bệnh viện phá sản.
 
Upvote 0
em mới bắt đầu học vba, giờ muốn làm 1 bài đánh số thứ tự từ trên xuống theo nhóm liên tục.
+ giả sử cột dữ liệu cần đánh stt là A, và cột đánh stt là B thì từ :B1 B2 B3 = 111 tiếp theo B4 B5 B6 = 222........ chạy liên tục cho đến hàng cuối cùng cột A
+ Em đã viết được 1 sub để chạy, nhưng sub chỉ đúng khi cột dữ liệu bắt đầu từ A1 hoặc A2 tương ứng bắt đầu đánh số thứ tự là B1 hoặc B2. còn từ hàng tiếp theo sub chạy sai ( ví dụ cột dữ liệu từ A3 và hàng đánh stt bắt đầu từ B3)
Nhờ các bác xem và sửa lại code theo file đính kèm sao cho code có thể chạy nếu nhập vào hàng bất kỳ. Nếu code sửa như nào, các bác giải thích cho e hiểu với. thanks all

Ai giúp e bài này với ah.
 
Upvote 0
Các bác giúp em giải quyết lỗi này với:
Em có 3 class module là class1,class2,class3 và 1 module chính chạy 3 class như sau
Public Sub chinh()
Dim so As Byte
so = Worksheets("nhap").Range("a1").Value
Dim c1 As Object
If so = 1 Then
Set c1 = New Class1
c1.nhap
ElseIf so = 2 And Worksheets("nhap").Range("j1") = 0 Then
Set c1 = New Class2
c1.lcttt
ElseIf so = 2 And Worksheets("nhap").Range("j1") > 0 Then
Set c1 = New Class3
c1.chitiet
End If
Set c1 = Nothing
End Sub
Nhưng khi chạy thì nó báo lỗi "run time error 5 invalid procedure call or argument" tại dòng c1.chitiet.Nên có bác nào biết cách khắc phục thì xin chỉ giúp.Thanks
 
Upvote 0
Các bác giúp em giải quyết lỗi này với:
Em có 3 class module là class1,class2,class3 và 1 module chính chạy 3 class như sau
Public Sub chinh()
Dim so As Byte
so = Worksheets("nhap").Range("a1").Value
Dim c1 As Object
If so = 1 Then
Set c1 = New Class1
c1.nhap
ElseIf so = 2 And Worksheets("nhap").Range("j1") = 0 Then
Set c1 = New Class2
c1.lcttt
ElseIf so = 2 And Worksheets("nhap").Range("j1") > 0 Then
Set c1 = New Class3
c1.chitiet
End If
Set c1 = Nothing
End Sub
Nhưng khi chạy thì nó báo lỗi "run time error 5 invalid procedure call or argument" tại dòng c1.chitiet.Nên có bác nào biết cách khắc phục thì xin chỉ giúp.Thanks
Kiểm tra lại Class3, thành viên chitiet xem có lỗi gì không?
 
Upvote 0
em mới bắt đầu học vba, giờ muốn làm 1 bài đánh số thứ tự từ trên xuống theo nhóm liên tục.
+ giả sử cột dữ liệu cần đánh stt là A, và cột đánh stt là B thì từ :B1 B2 B3 = 111 tiếp theo B4 B5 B6 = 222........ chạy liên tục cho đến hàng cuối cùng cột A
+ Em đã viết được 1 sub để chạy, nhưng sub chỉ đúng khi cột dữ liệu bắt đầu từ A1 hoặc A2 tương ứng bắt đầu đánh số thứ tự là B1 hoặc B2. còn từ hàng tiếp theo sub chạy sai ( ví dụ cột dữ liệu từ A3 và hàng đánh stt bắt đầu từ B3)
Nhờ các bác xem và sửa lại code theo file đính kèm sao cho code có thể chạy nếu nhập vào hàng bất kỳ. Nếu code sửa như nào, các bác giải thích cho e hiểu với. thanks all

Có bác nào giúp e với, 5 ngày rồi mà e vẫn chưa nghĩ ra cách giải quyết. E up lại file ạ, file này vs bài cũ giống nhau, chưa tiến triển gì thềm.
 

File đính kèm

Upvote 0
Nhờ mọi người chỉnh giúp code sau bị trễ giây với ạ, khi có âm thanh kêu lên thì thời gian bị trễ ạ. Có cách nào để chạy âm thanh độc lập mà âm thanh vẫn đảm bảo đúng thơi gian khi bắt đầu chạy và kết thúc không ạ?
-------
Private Sub DisplayTimer()
Dim i As Long
If Not Pause Then
If Min = 0 And Sec = 0 Then
Display_Off
SubBeep
iArrTimeInfo = iArrTimeInfo + 1
If iArrTimeInfo <= UBound(ArrTimeInfo, 2) Then
BangDiem.LB_ThoiGian.Caption = ArrTimeInfo(1, iArrTimeInfo) & ":" & Format(ArrTimeInfo(2, iArrTimeInfo), "00")
If Round(iArrTimeInfo Mod 2, 0) = 0 Then
Call BatDauVaKetThucHiep
Display_On
BangDiem.LB_ThoiGian.ForeColor = &H8000&
Else
BangDiem.LB_Hiep.Caption = ThongTin.Range(Hiep).Value & "" & Round((iArrTimeInfo + 1) / 2, 0)
Call HetThoiGianNghi
BangDiem.LB_TrangThai.Caption = ThongTin.Range(SanSang).Value
BangDiem.LB_ThoiGian.ForeColor = &HFF&
End If
Else
Call BatDauVaKetThucHiep
BangDiem.LB_ThoiGian.Caption = "0:00"
BangDiem.LB_TrangThai.Caption = ThongTin.Range(KetThuc).Value
BangDiem.CB_DangThiDau.Value = False
End If
Exit Sub
ElseIf Sec = 0 And Min > 0 Then
Sec = 59: Min = Min - 1
Else
Sec = Sec - 1
End If
BangDiem.LB_ThoiGian.Caption = Min & ":" & Format(Sec, "00")
End If
End Sub
----------
Còn đây là cái code khai báo Call âm thanh bên module 2:
Declare Function sndPlaySound Lib "winmm.dll" _
Alias "sndPlaySoundA" ( _
ByVal SoundName As String, _
ByVal Flags As Long) As Long
Sub PlayWav(ByVal WavFileName As String)
Call sndPlaySound(WavFileName, 0)
End Sub
Sub BatDauVaKetThucHiep()
Call PlayWav(ThisWorkbook.Path + "\AmThanh\Moi\BatDauVaKetThuc.wav")
End Sub
----------
 
Upvote 0
Mình có làm combobox theo bài viết trên forum. Hiện tại sau khi nhập liệu ấn enter thì nó đứng im ở ô nhập nhưng mình muốn sau khi nhập xong ấn enter nó sẽ nhảy sang ô bên cạnh (xuống dưới hoặc sang phải tùy theo thiết đặt trong option) để tiếp tục nhập liệu. Mọi người giúp thêm code giúp mình với
 

File đính kèm

Upvote 0
Chào cả nhà ạ, em có code như sau nhưng nó dài quá muốn nhờ các bạn rút gọn lại ạ.
Đây là code lấy vùng dữ liệu của 3 file excel nhập vào chung 1 sheet ở file excel khác em copy được ở trên mạng về chế biến thêm ạ ^^!

Mã:
Option Explicit
Sub noibang1()
  Dim sFile As String, sSheet As String, sAddr As String
  sFile = ThisWorkbook.Path & "\ky1.xlsx"
  sSheet = "G000141"
  sAddr = "C19:I785"
  Range("A1:G767") = GetData(sFile, sSheet, sAddr)
End Sub

Sub noibang2()
  Dim sFile As String, sSheet As String, sAddr As String
  sFile = ThisWorkbook.Path & "\ky2.xlsx"
  sSheet = "G000141"
  sAddr = "C19:I785"
  Range("I1:O767") = GetData(sFile, sSheet, sAddr)
End Sub

Sub noibang3()
  Dim sFile As String, sSheet As String, sAddr As String
  sFile = ThisWorkbook.Path & "\ky3.xlsx"
  sSheet = "G000141"
  sAddr = "C19:I785"
  Range("Q1:W767") = GetData(sFile, sSheet, sAddr)
End Sub

Function GetData(sFile As String, sSheet As String, sAddr As String)
  Dim pLink As String, iR As Long, iC As Long, Arr
  If Len(Dir(sFile)) Then
    Arr = Range(sAddr)
    pLink = "'" & Replace(sFile, Dir(sFile), "[" & Dir(sFile) & "]") & sSheet & "'!"
    For iR = 1 To Range(sAddr).Rows.Count
      For iC = 1 To Range(sAddr).Columns.Count
        Arr(iR, iC) = ExecuteExcel4Macro(pLink & Range(sAddr).Cells(iR, iC).Address(, , 2))
      Next iC
    Next iR
    GetData = Arr
  End If
End Function
 
Upvote 0
Chào cả nhà ạ, em có code như sau nhưng nó dài quá muốn nhờ các bạn rút gọn lại ạ.
Đây là code lấy vùng dữ liệu của 3 file excel nhập vào chung 1 sheet ở file excel khác em copy được ở trên mạng về chế biến thêm ạ ^^!

Mã:
Option Explicit
Sub noibang1()
  Dim sFile As String, sSheet As String, sAddr As String
  sFile = ThisWorkbook.Path & "\ky1.xlsx"
  sSheet = "G000141"
  sAddr = "C19:I785"
  Range("A1:G767") = GetData(sFile, sSheet, sAddr)
End Sub

Sub noibang2()
  Dim sFile As String, sSheet As String, sAddr As String
  sFile = ThisWorkbook.Path & "\ky2.xlsx"
  sSheet = "G000141"
  sAddr = "C19:I785"
  Range("I1:O767") = GetData(sFile, sSheet, sAddr)
End Sub

Sub noibang3()
  Dim sFile As String, sSheet As String, sAddr As String
  sFile = ThisWorkbook.Path & "\ky3.xlsx"
  sSheet = "G000141"
  sAddr = "C19:I785"
  Range("Q1:W767") = GetData(sFile, sSheet, sAddr)
End Sub

Function GetData(sFile As String, sSheet As String, sAddr As String)
  Dim pLink As String, iR As Long, iC As Long, Arr
  If Len(Dir(sFile)) Then
    Arr = Range(sAddr)
    pLink = "'" & Replace(sFile, Dir(sFile), "[" & Dir(sFile) & "]") & sSheet & "'!"
    For iR = 1 To Range(sAddr).Rows.Count
      For iC = 1 To Range(sAddr).Columns.Count
        Arr(iR, iC) = ExecuteExcel4Macro(pLink & Range(sAddr).Cells(iR, iC).Address(, , 2))
      Next iC
    Next iR
    GetData = Arr
  End If
End Function

Mã:
Option Explicit

Sub noibang123(byVal soBang As Integer)
  Dim sFile As String, sAddr As String
  Select Case soBang
  Case 1
    sFile = ThisWorkbook.Path & "\ky1.xlsx"
    sAddr = "A1"
  Case 2
    sFile = ThisWorkbook.Path & "\ky2.xlsx"
    sAddr = "I1"
  Case 3
    sFile = ThisWorkbook.Path & "\ky3.xlsx"
    sAddr = "Q1"
  Case Else
    Exit Sub
  End Select
  Range(sAddr).Resize(767,7) = GetData(sFile,"G000141","C19:I785")
End Sub

Sub noibang1()
noibang123 1
End Sub

Sub noibang2()
noibang123 2
End Sub

Sub noibang3()
noibang123 3
End Sub

Function GetData(sFile As String, sSheet As String, sAddr As String)
' Khong cần sửa, vả lại ai biết bạn muốn làm gì mà sửa
End Function
 
Upvote 0
Mã:
Option Explicit

Sub noibang123(byVal soBang As Integer)
  Dim sFile As String, sAddr As String
  Select Case soBang
  Case 1
    sFile = ThisWorkbook.Path & "\ky1.xlsx"
    sAddr = "A1"
  Case 2
    sFile = ThisWorkbook.Path & "\ky2.xlsx"
    sAddr = "I1"
  Case 3
    sFile = ThisWorkbook.Path & "\ky3.xlsx"
    sAddr = "Q1"
  Case Else
    Exit Sub
  End Select
  Range(sAddr).Resize(767,7) = GetData(sFile,"G000141","C19:I785")
End Sub

Sub noibang1()
noibang123 1
End Sub

Sub noibang2()
noibang123 2
End Sub

Sub noibang3()
noibang123 3
End Sub

Function GetData(sFile As String, sSheet As String, sAddr As String)
' Khong cần sửa, vả lại ai biết bạn muốn làm gì mà sửa
End Function
À mình muốn copy dữ liệu tự động từ 3 file ky1,2,3 (vùng dữ liệu giống nhau là C19:I785, tên sheet giống nhau là G000141) vào chung 1 sheet ở file thứ 4.

Bạn cho hỏi thêm là muốn copy vào sheet chỉ định ở file thứ 4 được không ạ (ví dụ sheeet Tonghop), trước khi copy thì xóa hết dữ liệu ở sheet Tonghop ạ.

Cảm ơn./.
 
Upvote 0
Bạn cho hỏi thêm là muốn copy vào sheet chỉ định ở file thứ 4 được không ạ (ví dụ sheeet Tonghop), trước khi copy thì xóa hết dữ liệu ở sheet Tonghop ạ.

Ai mà biết các sub noibang1,2,3 được gọi bằng cách nào?
Lúc sửa code, tôi cố tình sửa theo cách để không ảnh hưởng đến những cái bạn không đưa ra. Tức là những cái gì đó gọi sub noibang1,2,3 chúng không hề biết là các sub này đã thay đổi.
Muốn làm hơn nữa thì phải biết cái file của bạn nó ra ao.
 
Upvote 0
Ai mà biết các sub noibang1,2,3 được gọi bằng cách nào?
Lúc sửa code, tôi cố tình sửa theo cách để không ảnh hưởng đến những cái bạn không đưa ra. Tức là những cái gì đó gọi sub noibang1,2,3 chúng không hề biết là các sub này đã thay đổi.
Muốn làm hơn nữa thì phải biết cái file của bạn nó ra ao.
À vâng, mình gửi kèm file bạn xem giùm với ạ
 

File đính kèm

Upvote 0
Trong file mình có 2 Function, ý tưởng viết đều như nhau nhưng Function GPE2 lại báo lỗi Ref, mong các bạn trợ giúp
Mã:
Function GPE2(Rng As Range, SP As String, Num As Long)
    Dim frng As Range
    Set frng = Rng.Resize(, 1).Find(SP, , xlValues, xlWhole, , , True)(, 2)
    GPE2 = IIf(frng > Num Or frng(, 2) < Num, Space(0), frng + Num - 1)
    Set frng = Nothing
End Function
 

File đính kèm

Upvote 0
Trong file mình có 2 Function, ý tưởng viết đều như nhau nhưng Function GPE2 lại báo lỗi Ref, mong các bạn trợ giúp
Mã:
Function GPE2(Rng As Range, SP As String, Num As Long)
    Dim frng As Range
    Set frng = Rng.Resize(, 1).Find(SP, , xlValues, xlWhole, , , True)(, 2)
    GPE2 = IIf(frng > Num Or frng(, 2) < Num, Space(0), frng + Num - 1)
    Set frng = Nothing
End Function
Hay!, GPE2 nó lại vô tình trùng với địa chỉ của ô GPE2. Sửa nó thành GPE_2 xem, mà cũng chả hiểu hàm của bạn nó làm cái gì nữa.
 
Upvote 0
Upvote 0
Status
Không mở trả lời sau này.

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

Back
Top Bottom