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

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

ndu96081631

Huyền thoại GPE
Thành viên BQT
Super Moderator
Tham gia
5/6/08
Bài viết
30,703
Được thích
53,930
Các bạn xem dùm mình sao cái User Form này chạy cứ báo lỗi với.
Đúng tên ListBox rồi mà sao nó cứ báo overflow ở dòng
For x = 0 To Me.LBoxDATAtenCV.ListCount - 1

Code của mình
Mã:
Private Sub cmdNhapLieu_Click()
Dim ApMH As Range
Dim x As Integer

    Set ApMH = Sheet1.Cells(Rows.Count, 2).End(xlUp).Offset(1, 0)   ' Chon o bat dau dien du lieu
    
    For x = 0 To Me.LBoxDATAtenCV.ListCount - 1                    ' LBox_DATAtenCV la ten cua list box ma chung ta chon trong form
                                                                    ' Cho x chay tu dong so 0 den dong so cuoi cung cua ListBox -1 (tuc la cho i chay tu dong dau den dong cuoi List Box)
                                                                    
        If Me.LBoxDATAtenCV.Selected(x) Then                       ' Neu lua chon dong thu x+1 thi
        
            ApMH = Me.LBoxDATAtenCV.List(x)                        ' Gan ApMh la vung du lieu cua dong thu x+1
            
            ApMH.Offset(0, 0) = Me.LBoxDATAtenCV.List(x, 1)        ' Gan ApMh dong 1 cot 1 là vung du lieu LIST BOX dong x+1 cot 1
            ApMH.Offset(0, 1) = Me.LBoxDATAtenCV.List(x, 2)        ' Gan ApMh dong 1 cot 2 là vung du lieu LIST BOX dong x+1 cot 2
            ApMH.Offset(0, 2) = Me.LBoxDATAtenCV.List(x, 3)        ' Gan ApMh dong 1 cot 3 là vung du lieu LIST BOX dong x+1 cot 3
 
            Set ApMH = ApMH.Offset(1, 0)                            ' Cho ApMh di chuyen xuong 1 dong
        End If
    Next x
    For x = 0 To Me.LBoxDATAtenCV.ListCount - 1
        If Me.LBoxDATAtenCV.Selected(x) Then Me.LBoxDATAtenCV.Selected(x) = False
    Next x
    Unload formTraMH
End Sub
 

File đính kèm

  • CSDL hoi 5.10.2017 so1 .xls
    107.5 KB · Đọc: 5
Upvote 0
Ôi vừa hỏi xong thì lại làm được.
Hóa ra mình sai ở chỗ thừa 1 dòng dữ liệu

Mã:
Private Sub cmdNhapLieu_Click()
Dim ApMH As Range
Dim x As Long

    Set ApMH = Sheet1.Cells(Rows.Count, 2).End(xlUp).Offset(1, 0)   ' Chon o bat dau dien du lieu
    
    For x = 0 To Me.LBoxDATAtenCV.ListCount - 1                     ' LBox_DATAtenCV la ten cua list box ma chung ta chon trong form
                                                                    ' Cho x chay tu dong so 0 den dong so cuoi cung cua ListBox -1 (tuc la cho i chay tu dong dau den dong cuoi List Box)
                                                                    
        If Me.LBoxDATAtenCV.Selected(x) Then                       ' Neu lua chon dong thu x+1 thi
        
            ApMH.Offset(0, 0) = Me.LBoxDATAtenCV.List(x, 0)        ' Gan ApMh dong 1 cot 1 la vung du lieu LIST BOX dong x+1 cot 1
            ApMH.Offset(0, 1) = Me.LBoxDATAtenCV.List(x, 1)        ' Gan ApMh dong 1 cot 2 là vung du lieu LIST BOX dong x+1 cot 2
            ApMH.Offset(0, 2) = Me.LBoxDATAtenCV.List(x, 2)        ' Gan ApMh dong 1 cot 3 là vung du lieu LIST BOX dong x+1 cot 3

 
            Set ApMH = ApMH.Offset(1, 0)                            ' Cho ApMh di chuyen xuong 1 dong
        End If
    Next x
    For x = 0 To Me.LBoxDATAtenCV.ListCount - 1
        If Me.LBoxDATAtenCV.Selected(x) Then Me.LBoxDATAtenCV.Selected(x) = False
    Next x
    Unload formTraMH
End Sub
 
Upvote 0
Nếu là mình thì xài IsNumeric(); Tuy dài nhưng chắc không báo lỗi.

Còn vẫn thích Application thì thử với hàm N() xem sao.
Anh nói rõ hơn giúp em với được không. "Application thì thử với hàm N() xem sao".
Còn dùng IsNumeric() vụ này em chưa biết đến. Để em xem theem cái này. Cảm ơn anh.
 
Upvote 0
Mã:
Public Sub tinhtien2() 'GPE
Dim sArr(), dArr(), I As Long, R As Long, tong As Double
lr = Sheet3.Cells(Rows.Count, "B").End(xlUp).Row
sArr = Sheet3.Range("A6:F" & lr).Value
R = UBound(sArr)
Application.ScreenUpdating = False
ReDim dArr(1 To R, 1 To 1)
For I = R To 1 Step -1
    If sArr(I, 1) = Empty Then
        dArr(I, 1) = Application.WorksheetFunction.IfError(sArr(I, 4) * sArr(I, 5) * sArr(I, 6), 0)
         
  
        tong = tong + dArr(I, 1)
    Else
        dArr(I, 1) = Application.WorksheetFunction.Round(tong, -3): tong = 0
 
    End If
Next I
Sheet3.Range("G5") = "=Round(SUM(R[1]C:R[" & R & "]C)/2,-3)"
Sheet3.Range("G6").Resize(UBound(sArr)) = dArr
Application.ScreenUpdating = True
End Sub
Mình dùng iferror để bẩy lỗi các cột có giá trị là chữ (hoặc trống) nhưng khi chạy code vẫn bị báo lỗi.
Mã:
  "dArr(I, 1) = Application.WorksheetFunction.IfError(sArr(I, 4) * sArr(I, 5) * sArr(I, 6), 0)"
Nhờ GPE giúp đỡ mình với.

Khi thực hiện phép nhân bị lỗi thì nó sẽ ngắt ngay, hàm iferror sẽ chưa có cơ hội để chạy. Excel là excel, vba là vba, không dùng lẫn lộn được đâu.
 
Upvote 0
Ờ, Hàm N() chỉ xài được trong VBA với câu lệnh ví dụ là vầy:
Mã:
Sub Macro1()
    Range("J7").Select
    ActiveCell.FormulaR1C1 = "=RC[-6]*N(RC[-5])"
   
End Sub

Mình xin lỗi bạn vì chưa kĩ lưỡng!
 
Upvote 0
Mọi người cho mình hỏi cách tăng số cột của listbox ???.
Mình có làm 1 form nhập liệu. Gồm 1 số textbox để nhập dữ liêụ và 1 listbox lưu tạm dữ liệu.
Vấn đề là khi nhập liệu listbox mình chỉ lưu tạm tối đa được 9 cột. Nếu dùng rowsource thì nó lại load được hơn 23 cột.
Mình đang dùng office 2016 bản 64 bit.
 
Upvote 0
Anh chỉ thêm em cách dùng hàm isnumeric với
Thì vầy:
Nếu ta muốn có tích của 3 số hạng A, B & C, thì
PHP:
 Dim GPE As Double
'. . . . . '
If Isnumeric(A) And Isnumeric(B) and Isnumweic(C) Then
   GPE= A * B * C
End If
 
Upvote 0
Nhờ cả nhà giúp mình. Mình cần xóa 1 số cột nhất định trong file csv. Mình sử dụng Code: ActiveSheet.Range("B:B,D:K,M: P,S:AH,AK:AM,AT:BO").EntireColumn.Delete
Tuy nhiên mình có khá nhiều file cần xóa các cột trên. Hiện tại mình đang phải mở từng file và chạy code trên. Mình muốn nhờ cả nhà giúp mình sửa code để làm sao nó chạy được cho nhiều file trong 1 folder nhất định nào đó.
Nếu được sau khi xóa các cột trên, mình muốn insert thêm 1 cột bên trái cột E, và điền ô E1 = "Item" thì mình thêm đoạn code này có được không?
Columns("E:E").Select
Selection.insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
Range("E1").Select
ActiveCell.FormulaR1C1 = "Item"
Cảm ơn cả nhà.
 
Lần chỉnh sửa cuối:
Upvote 0
Tình hình là em đang cần lập một hàm đếm các số ô có mầu cùng và kèm theo được điều kiện cùng đó như khi dùng hàm coutif
ví dụ: như đếm số ô có mầu đỏ và có ký tự cuối cùng là T mà em loay hoay mãi chưa lập được ai lập dùm em với Tks
 
Upvote 0
Nhờ Anh Chị chỉ giúp trong đoạn code chỗ nào chưa đúng. Yêu cầu:
Tại sheet SDT: khi nhập số 1 vào AO2 sẽ lấy dữ liệu ở sheet Data ( kết quả theo như sheet SDT )
Xin cảm ơn.
 

File đính kèm

  • TheoDoiTDVH15.xls
    238 KB · Đọc: 5
Upvote 0

File đính kèm

  • TheoDoiTDVH15.rar
    41.6 KB · Đọc: 6
Upvote 0
Trong file đính kèm em có phân lịch trực mỗi người. Tuy nhiên còn vướng mắc ở việc nếu hôm thứ nhất, người thứ nhất trực sáng thì hôm thứ 2 người thứ 2 trực phải là chiều. Anh chị tháo gỡ giúp em nhé.
 

File đính kèm

  • Phan lich.xlsm
    19.6 KB · Đọc: 5
Upvote 0
Trong file đính kèm em có phân lịch trực mỗi người. Tuy nhiên còn vướng mắc ở việc nếu hôm thứ nhất, người thứ nhất trực sáng thì hôm thứ 2 người thứ 2 trực phải là chiều. Anh chị tháo gỡ giúp em nhé.
Bạn xếp thủ công hoàn thiện cả bảng thử xem ý bạn là thế nào?
Đọc "hôm thứ nhất, người thứ nhất trực sáng thì hôm thứ 2 người thứ 2 trực phải là chiều." chẳng hiểu bạn muốn gì.
 
Upvote 0
Bạn xếp thủ công hoàn thiện cả bảng thử xem ý bạn là thế nào?
Đọc "hôm thứ nhất, người thứ nhất trực sáng thì hôm thứ 2 người thứ 2 trực phải là chiều." chẳng hiểu bạn muốn gì.
Nghĩa là lịch trực sẽ là các ngày từ thứ 2 đến 7, chủ nhật Off. Lịch trực sẽ xen kẽ buổi sáng và buổi chiều. Nếu hôm trước trực là sáng thì hôm sau phải là chiều. Và cái trực sáng chiều này chia đều cho tất cả mọi người anh ạ.
vm0fK-reCroVTUeRkSIgGX3Vadg-DeMpdOAk5vssIj7FM9XXuPmf0SLSIFGg2eKx4ddKUQ_YKpewNrMX5HSsMyfKFi0nZGOQ0Ke3oS1Mc0a1JXerERYGcV_ZHTNWqMUcANePofG9I5aDQ7Y-ZhqxyTdzMOOyQBfYBzdq594ecFh3FvATt1MqfeZdpe2wpqz0fvNz8QcDMcoH0kr90PMeHKSqDhPi7cTCZl6IBbqQisJ1Dxi3oVzMEECi86XsPTYH_bCRncvRhwLrTqleCwanA7dxwUVJCDrzjOQOcjhwB2uL_O5aHxDroENF4ibQ1dStgnkPv2J_IYoNTGXVzw5xr_YWtZ6HBEWSBbHEMoRM9uSPj480C8GWgIexq9Sc9eEwffrYQLtsqB2x0AlA6Y7rBPRatGSjAOdNg8xMGuX8IPIA_WP8QwaaNRH8rWOmDlOORfz2nxpehqzONOIdec84jcy5T_aPzp9siFxYr8IgRZpLf2Tp1QYZvGhmchSx5ouKD4F_5CcmVLEIaOOC805OUbtzGLswodnJHUV-Zt2jV1Gv7Tk-z4QNXSdlLV4XhqgQLYOF8htFz_jkAgVCheXS0_jw-qgWOXcva3Asge8ow2LAB7vAFROa_N14YCaOCFU8udHW048Mue3hxRqrjLRQLpOaQ04hpmMwvqsJZwlhrQPeiiPJ52IKYC_DRUIu=w908-h204-l75-ft
 
Upvote 0
Lạ nhỉ, em gửi đính kèm ảnh phân ca cho anh xem, ban đầu thấy hiện rồi giờ vào lại thành dấu x. Em gửi lại file nhé.
 

File đính kèm

  • Phan lich.xlsm
    19.7 KB · Đọc: 6
Upvote 0
Lạ nhỉ, em gửi đính kèm ảnh phân ca cho anh xem, ban đầu thấy hiện rồi giờ vào lại thành dấu x. Em gửi lại file nhé.
Mã:
Public Sub XepLich()
Dim sArr(), dArr(), I As Long, J As Long, K As Long, s As Long
sArr = Range("D5:AH10").Value
ReDim dArr(1 To 5, 1 To 31)
For J = 1 To 31
    If sArr(1, J) = 1 Then
        For I = 1 To 5
            dArr(I, J) = "Off"
        Next I
    Else
        s = s + 1
        If sArr(1, J) > 1 Then
            If K = 5 Then K = 1 Else K = K + 1
            If s Mod 2 = 1 Then dArr(K, J) = "Sang" Else dArr(K, J) = "Chieu"
        End If
    End If
Next J
[D6:AH10] = dArr
End Sub
 
Upvote 0
Thưa thầy! cho em hỏi gán 1 sub vào code:
call GPE và để nguyên GPE
Em thấy vẫn hoạt động bình thường, có gì khác nhau không ạ?
 
Upvote 0
Status
Không mở trả lời sau này.
Web KT
Back
Top Bottom