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,957
- 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
đúng rồi bác ơi, bác làm cho em để nó cập nhật cho tất cả các sheet với, em cảm ơn nhiều lắm
 
Upvote 0
đúng rồi bác ơi, bác làm cho em để nó cập nhật cho tất cả các sheet với, em cảm ơn nhiều lắm

- bạn tải tiếp file sau về thử nhé !
'---------
bạn Run thử 2 code (Sub Capnhat hoặc Sub Capnhat2) --> kiểm tra kết quả ...
- Capnhat: phương thức Find (ko cần cột phụ)
- Capnhat2: dùng 1 cột phụ (cột AO)
 

File đính kèm

Upvote 0
Mã:
Sub a()
Dim i As Integer
Dim n As Integer
Dim dic As Object
Set dic = CreateObject("scripting.dictionary")
n = Range("a2").End(xlDown).Row
For i = 2 To n
[COLOR=#b22222]If Not dic.Exists(Cells(i, 1).Text) Then
dic.Add Cells(i, 1).Text, i
Cells(i, 6) = Format(Cells(i, 3), "dd/mm") & "->" & Format(Cells(i, 4), "dd/mm")
Else
Cells(dic.Item(Cells(i, 1).Text), 6) = Cells(dic.Item(Cells(i, 1).Text), 6) & ", " & Format(Cells(i, 3), "dd/mm") & "->" & Format(Cells(i, 4), "dd/mm")[/COLOR]
End If
Next
Set dic = Nothing
End Sub
Đoạn màu đỏ này em ko hiểu kỹ lắm, nhờ anh chị giải thích dùm ah
Add Cells(i, 1).Text, i_Trọng đoạn này Cells(i,1) có phải là key, i là item ko ah
 

File đính kèm

Upvote 0
Đoạn màu đỏ này em ko hiểu kỹ lắm, nhờ anh chị giải thích dùm ah
Add Cells(i, 1).Text, i_Trọng đoạn này Cells(i,1) có phải là key, i là item ko ah
Chính là nó. Trước khi tới câu Add Cell(i,1).Text thì đoạn code có 1 Câu là Dic.Exists( Cells(i,1).Text ) thì cái kiểm tra chính là "Key"
 
Upvote 0
Chính là nó. Trước khi tới câu Add Cell(i,1).Text thì đoạn code có 1 Câu là Dic.Exists( Cells(i,1).Text ) thì cái kiểm tra chính là "Key"

Cảm ơn phước nhé
If Not dic.Exists(Cells(i, 1).Text). Câu này có phải là nếu dic ko tồn tại thì trả về
Cells(i, 6) = Format(Cells(i, 3), "dd/mm") & "->" & Format(Cells(i, 4), "dd/mm")
Cells(dic.Item(Cells(i, 1).Text), 6) = Cells(dic.Item(Cells(i, 1).Text), 6) & ", " & Format(Cells(i, 3), "dd/mm") & "->" & Format(Cells(i, 4), "dd/mm")
Câu này mình cũng chưa hiểu lắm (Hôm nay em xem dic lần đầu,nếu có hỏi Ngu , các bác thông cảm nhé. Xem nhiều quá hơi mụ đầu)
Cells(dic.Item(Cells(i, 1).Text), 6)=Cells(i, 6). Hai cái này là bằng nhau đúng ko ah?
 
Lần chỉnh sửa cuối:
Upvote 0
Cells(dic.Item(Cells(i, 1).Text), 6)=Cells(i, 6)
2 cái này có thể bằng nhau hoặc không bằng nhau:
Trước hết bạn cần nhớ rằng cái "i" trong Cells(i,6) là giá trị của vòng lập For ...Next. Còn cái 'i' trong Cells(Dic.Item(Cells(i,1).Text,6) chính là Item của của cái Key Cells(i,6).Text mà bạn đã nạp nó lúc trước. Do đó nếu giá trị Item bạn nạp cho Key Cells(i,1).Text trùng với giá trị "i" của vòng lập thì 2 cái bằng nhau ngược lại thì không bằng.

p/s: Lúc trước mình mày mò để hiểu thằng Dic này cũng mất khá nhiều thời gian. Nhưng khi mò ra được nó thì sung sướng vô cùng, áp dụng và vận dụng cho các đoạn code lúc trước mình viết thì hiệu quả vượt trội. Để hiểu nó thì mình mượn tạm lại lời của Thầy NDU đã giải thích ở đâu đó 1 topic nào đó trên diễn đàn này mà mình vô tinh thấy được là :
Bạn cứ xem cái "Key" và "Item" như 1 cái bảng 2 cột nhiều dòng, với cột đầu là "Key" và cột thứ 2 là "Item" của cái "Key" đó. Trong đó cột đầu ( Key ) luôn là giá trị duy nhất, không được trùng, còn cột 2 ( Item ) thì chỉnh sữa thoải mái ( có thể trùng hoặc không trùng ). Trong các đoạn code, khi "Key" chưa có thì bạn nạp cho nó vào cột 1, gán giá trị cho nó tại cột 2 ( cột Item ), sau khi gán xong bạn chạy tiếp vòng lặp mà gặp lại nó thì lúc này bạn lôi cái thằng cột 2 ( Item ) ra để "xử" ( xóa, cộng, trừ , nhân , chia ... hoặc mượn nó để đi làm cái chuyện gì " đó đó ") ( nó tựa như Vloop cái "Key" trong bảng mình nói để dò ra "Item" )
Vài lời huy vọng bạn có thể hiểu được Dic
 
Upvote 0
2 cái này có thể bằng nhau hoặc không bằng nhau:
Trước hết bạn cần nhớ rằng cái "i" trong Cells(i,6) là giá trị của vòng lập For ...Next. Còn cái 'i' trong Cells(Dic.Item(Cells(i,1).Text,6) chính là Item của của cái Key Cells(i,6).Text mà bạn đã nạp nó lúc trước. Do đó nếu giá trị Item bạn nạp cho Key Cells(i,1).Text trùng với giá trị "i" của vòng lập thì 2 cái bằng nhau ngược lại thì không bằng.

p/s: Lúc trước mình mày mò để hiểu thằng Dic này cũng mất khá nhiều thời gian. Nhưng khi mò ra được nó thì sung sướng vô cùng, áp dụng và vận dụng cho các đoạn code lúc trước mình viết thì hiệu quả vượt trội. Để hiểu nó thì mình mượn tạm lại lời của Thầy NDU đã giải thích ở đâu đó 1 topic nào đó trên diễn đàn này mà mình vô tinh thấy được là :
Bạn cứ xem cái "Key" và "Item" như 1 cái bảng 2 cột nhiều dòng, với cột đầu là "Key" và cột thứ 2 là "Item" của cái "Key" đó. Trong đó cột đầu ( Key ) luôn là giá trị duy nhất, không được trùng, còn cột 2 ( Item ) thì chỉnh sữa thoải mái ( có thể trùng hoặc không trùng ). Trong các đoạn code, khi "Key" chưa có thì bạn nạp cho nó vào cột 1, gán giá trị cho nó tại cột 2 ( cột Item ), sau khi gán xong bạn chạy tiếp vòng lặp mà gặp lại nó thì lúc này bạn lôi cái thằng cột 2 ( Item ) ra để "xử" ( xóa, cộng, trừ , nhân , chia ... hoặc mượn nó để đi làm cái chuyện gì " đó đó ") ( nó tựa như Vloop cái "Key" trong bảng mình nói để dò ra "Item" )
Vài lời huy vọng bạn có thể hiểu được Dic
Chân thành cảm ơn Phước đã chia sẻ và góp ý nhé
Mình sẽ cố gắng mò dần --=0
Theo mình hiểu Cells(i,1).Text =16047 Đã thỏa mãn giá trị duy nhất (Lại thêm not ở đâu) sẽ trả về giá trị đúng là
Cells(dic.Item(Cells(i, 1).Text), 6) = Cells(dic.Item(Cells(i, 1).Text), 6) & ", " & Format(Cells(i, 3), "dd/mm") & "->" & Format(Cells(i, 4), "dd/mm")
Và ngược lại False là
Cells(i, 6) = Format(Cells(i, 3), "dd/mm") & "->" & Format(Cells(i, 4), "dd/mm")
 
Lần chỉnh sửa cuối:
Upvote 0
Em làm 1 cái Form có nhiều CommandButton. Em muốn khi bấm Button1 thì nó làm ẩn và hiện 1 số Button khác và khi bấm Button2 thì làm ngược lại với Button1. Em làm cái vòng lặp mà sao nó cứ lỗi hoài :(. Em có gửi file excel đính kèm các Thầy xem giúp em.

Private Sub CommandButton1_Click()
Dim i, a, b, c
For i = 4 To 11
ActiveSheet
.UserForm1.CommandButton(i).Visible = True
Next
For a = 12 To 19
ActiveSheet
.UserForm1.CommandButton(a).Visible = False
Next
For b = 8 To 15
ActiveSheet
.UserForm1.Label(b).Visible = True
Next
For c = 16 To 23
ActiveSheet
.UserForm1.Label(c).Visible = False
Next
End Sub
 

File đính kèm

Upvote 0
Em làm 1 cái Form có nhiều CommandButton. Em muốn khi bấm Button1 thì nó làm ẩn và hiện 1 số Button khác và khi bấm Button2 thì làm ngược lại với Button1. Em làm cái vòng lặp mà sao nó cứ lỗi hoài :(. Em có gửi file excel đính kèm các Thầy xem giúp em.

Private Sub CommandButton1_Click()
Dim i, a, b, c
For i = 4 To 11
ActiveSheet
.UserForm1.CommandButton(i).Visible = True
Next
For a = 12 To 19
ActiveSheet
.UserForm1.CommandButton(a).Visible = False
Next
For b = 8 To 15
ActiveSheet
.UserForm1.Label(b).Visible = True
Next
For c = 16 To 23
ActiveSheet
.UserForm1.Label(c).Visible = False
Next
End Sub

Phải duyệt thế này mới được
PHP:
For i = 4 To 11
UserForm1.Controls("CommandButton" & i).Visible = True
Next
 
Upvote 0
Em nhờ các thầy kiểm tra giúp em xem đoạn code sau bị lỗi ở chỗ nào. Các khắc phục ra sao?
Em cám ơn nhiều!

Sub B_tachdong()
Dim data(), Res(1 To 65536, 1 To 11), i, j, k, f, tam3, tam4, tam5, tam7
data = Sheet1.Range(Sheet1.[A7], Sheet1.[d65536].End(3).Offset(, 7)).Value
For i = 1 To UBound(data)
If data(i, 3) = "" Then
k = k + 1
For j = 1 To 11
Res(k, j) = data(i, j)
Next
Else
tam3 = Split(data(i, 3), "+")
tam4 = Split(data(i, 4), "+")
tam5 = Split(data(i, 5), "+")
tam7 = Split(data(i, 7), "+")

For ii = 1 To UBound(tam3) + 1
k = k + 1
For j = 1 To 11
Res(k, j) = data(i, j)
Next
Res(k, 3) = tam3(ii - 1)
Res(k, 4) = tam4(ii - 1)
Res(k, 5) = tam4(ii - 1)
Res(k, 7) = tam7(ii - 1)

Next

End If
Next
Sheet3.[A7].Resize(k, 11) = Res
End Sub

Mục đích của em là tách dòng ở cột C, D, E, G. Cách nhau bởi kí tự là dấu "+"
 

File đính kèm

Upvote 0
Em nhờ các thầy kiểm tra giúp em xem đoạn code sau bị lỗi ở chỗ nào. Các khắc phục ra sao?
Em cám ơn nhiều!

Sub B_tachdong()
Dim data(), Res(1 To 65536, 1 To 11), i, j, k, f, tam3, tam4, tam5, tam7
data = Sheet1.Range(Sheet1.[A7], Sheet1.[d65536].End(3).Offset(, 7)).Value
For i = 1 To UBound(data)
If data(i, 3) = "" Then
k = k + 1
For j = 1 To 11
Res(k, j) = data(i, j)
Next
Else
tam3 = Split(data(i, 3), "+")
tam4 = Split(data(i, 4), "+")
tam5 = Split(data(i, 5), "+")
tam7 = Split(data(i, 7), "+")

For ii = 1 To UBound(tam3) + 1
k = k + 1
For j = 1 To 11
Res(k, j) = data(i, j)
Next
Res(k, 3) = tam3(ii - 1)
Res(k, 4) = tam4(ii - 1)
Res(k, 5) = tam4(ii - 1)
Res(k, 7) = tam7(ii - 1)

Next

End If
Next
Sheet3.[A7].Resize(k, 11) = Res
End Sub

Mục đích của em là tách dòng ở cột C, D, E, G. Cách nhau bởi kí tự là dấu "+"
PHP:
Sub B_tachdong()
Dim data(), Res(1 To 65536, 1 To 11)
Dim i, j, k, tam3, tam4, tam5, tam7
data = Sheet1.Range(Sheet1.[A7], Sheet1.[d65536].End(3).Offset(, 7)).Value
For i = 1 To UBound(data)
   If InStr(1, data(i, 3), "+") Then
        tam3 = Split(data(i, 3), "+")
        tam4 = Split(data(i, 4), "+")
        tam5 = Split(data(i, 5), "+")
        tam7 = Split(data(i, 7), "+")
        For ii = 1 To UBound(tam3) + 1
            k = k + 1
            For j = 1 To 11
                Res(k, j) = data(i, j)
            Next
            Res(k, 3) = tam3(ii - 1)
            Res(k, 4) = tam4(ii - 1)
            Res(k, 5) = tam4(ii - 1)
            If UBound(tam7) > 0 Then Res(k, 7) = tam7(ii - 1)
        Next
    Else
      k = k + 1
      For j = 1 To 11
         Res(k, j) = data(i, j)
      Next
   End If
Next
Sheet3.[A7].Resize(k, 11) = Res
End Sub
 
Upvote 0
Em có đoạn code thế này:
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim aa, bb, jj As Long
aa = Sheet1.UsedRange.Rows.Count
bb = Sheet2.UsedRange.Rows.Count
jj = 1
Do While jj <= bb
    Range("b" & jj) = "=lookup(a" & jj & ",sheet1!a1:a" & aa & ",sheet1!b1:b" & aa & ")"
    j = j + 1
Loop
End Sub
Khi em chạy (nhập vào cột a của sheet2 các ký tự của cột a của sheet1 rồi enter) thì chương trình không thể ngừng được, cho em hỏi vòng lặp của em đã đúng chưa, em xin cảm ơn
Đây là file đính kém
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Em có đoạn code thế này:
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim aa, bb, jj As Long
aa = Sheet1.UsedRange.Rows.Count
bb = Sheet2.UsedRange.Rows.Count
jj = 1
Do While jj <= bb
    Range("b" & jj) = "=lookup(a" & jj & ",sheet1!a1:a" & aa & ",sheet1!b1:b" & aa & ")"
    j = j + 1
Loop
End Sub
Khi em chạy (nhập vào cột a của sheet2 các ký tự của cột a của sheet1 rồi enter) thì chương trình không thể ngừng được, cho em hỏi vòng lặp của em đã đúng chưa, em xin cảm ơn
Đây là file đính kém
Chưa xem file, nhưng bạn thử thay j = j+1 thành jj=jj+1
 
Upvote 0
PHP:
Sub B_tachdong()
Dim data(), Res(1 To 65536, 1 To 11)
Dim i, j, k, tam3, tam4, tam5, tam7
data = Sheet1.Range(Sheet1.[A7], Sheet1.[d65536].End(3).Offset(, 7)).Value
For i = 1 To UBound(data)
   If InStr(1, data(i, 3), "+") Then
        tam3 = Split(data(i, 3), "+")
        tam4 = Split(data(i, 4), "+")
        tam5 = Split(data(i, 5), "+")
        tam7 = Split(data(i, 7), "+")
        For ii = 1 To UBound(tam3) + 1
            k = k + 1
            For j = 1 To 11
                Res(k, j) = data(i, j)
            Next
            Res(k, 3) = tam3(ii - 1)
            Res(k, 4) = tam4(ii - 1)
            Res(k, 5) = tam4(ii - 1)
            If UBound(tam7) > 0 Then Res(k, 7) = tam7(ii - 1)
        Next
    Else
      k = k + 1
      For j = 1 To 11
         Res(k, j) = data(i, j)
      Next
   End If
Next
Sheet3.[A7].Resize(k, 11) = Res
End Sub


Chân thành cám ơn thầy. Chúc thầy sức khỏe và công tác tốt!
 
Upvote 0
Chưa xem file, nhưng bạn thử thay j = j+1 thành jj=jj+1
Em sửa lại rồi,nhưng khi nhập lần đầu thì nó chạy bình thường,còn nhập tiếp thêm 1 ô nữa thì chương trình vẫn không dừng được,anh cho em hỏi thêm 1 vấn đề nữa là khi em sử dụng lookup thì bi hạn chế trong vấn đề lookup-vectơ phải xắp xếp theo thứ tư tăng dần nên gây khó khăn trong việc trả kết quả đúng,anh có thể hướng dẫn em cách giải quyết không,em cảm ơn anh
 
Upvote 0
Em sửa lại rồi,nhưng khi nhập lần đầu thì nó chạy bình thường,còn nhập tiếp thêm 1 ô nữa thì chương trình vẫn không dừng được,anh cho em hỏi thêm 1 vấn đề nữa là khi em sử dụng lookup thì bi hạn chế trong vấn đề lookup-vectơ phải xắp xếp theo thứ tư tăng dần nên gây khó khăn trong việc trả kết quả đúng,anh có thể hướng dẫn em cách giải quyết không,em cảm ơn anh
Với sự kiện change thì phải luôn có dòng Application.EnableEvents=False và Application.EnableEvents=True, nếu không thì nó chạy tới mãi mãi
 
Upvote 0
Anh có thể nói kỹ hơn một tí được không,mình đưa 2 dòng trên vào chỗ nào của đoạn mã
Tổng quát là thế này. Tuy nhiên nhìn code của bạn là thấy không hợp lý rồi. Biến bb sẽ cho ra là 1 thì chạy Do Loop gì nữa
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False
'your code here.......................
Application.EnableEvents = True
End Sub
 
Upvote 0
Xin các Thầy xem giúp em có cách nào làm cho đoạn code này nó ngắn lại không ? **~**

PHP:
Private Sub CommandButton1_Click()
Dim a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z
a = Worksheets("A").Range("A1048576").End(xlUp).Row - 2
Label22.Caption = a
b = Worksheets("B").Range("A1048576").End(xlUp).Row - 2
Label23.Caption = b
c = Worksheets("C").Range("A1048576").End(xlUp).Row - 2
Label24.Caption = c
d = Worksheets("D").Range("A1048576").End(xlUp).Row - 2
Label25.Caption = d
e = Worksheets("E").Range("A1048576").End(xlUp).Row - 2
Label26.Caption = e
f = Worksheets("F").Range("A1048576").End(xlUp).Row - 2
Label27.Caption = f
g = Worksheets("G").Range("A1048576").End(xlUp).Row - 2
Label28.Caption = g
h = Worksheets("H").Range("A1048576").End(xlUp).Row - 2
Label29.Caption = h
i = Worksheets("I").Range("A1048576").End(xlUp).Row - 2
Label30.Caption = i
j = Worksheets("J").Range("A1048576").End(xlUp).Row - 2
Label31.Caption = j
k = Worksheets("K").Range("A1048576").End(xlUp).Row - 2
Label32.Caption = k
l = Worksheets("L").Range("A1048576").End(xlUp).Row - 2
Label33.Caption = l
m = Worksheets("M").Range("A1048576").End(xlUp).Row - 2
Label34.Caption = m
n = Worksheets("N").Range("A1048576").End(xlUp).Row - 2
Label35.Caption = n
o = Worksheets("O").Range("A1048576").End(xlUp).Row - 2
Label36.Caption = o
p = Worksheets("P").Range("A1048576").End(xlUp).Row - 2
Label37.Caption = p
q = Worksheets("Q").Range("A1048576").End(xlUp).Row - 2
Label38.Caption = q
r = Worksheets("R").Range("A1048576").End(xlUp).Row - 2
Label39.Caption = r
s = Worksheets("S").Range("A1048576").End(xlUp).Row - 2
Label40.Caption = s
t = Worksheets("T").Range("A1048576").End(xlUp).Row - 2
Label41.Caption = t
u = Worksheets("U").Range("A1048576").End(xlUp).Row - 2
Label42.Caption = u
v = Worksheets("V").Range("A1048576").End(xlUp).Row - 2
Label43.Caption = v
w = Worksheets("W").Range("A1048576").End(xlUp).Row - 2
Label44.Caption = w
x = Worksheets("X").Range("A1048576").End(xlUp).Row - 2
Label45.Caption = x
y = Worksheets("Y").Range("A1048576").End(xlUp).Row - 2
Label46.Caption = y
z = Worksheets("Z").Range("A1048576").End(xlUp).Row - 2
Label47.Caption = z

Label48.Caption = a + b + c + d + e + f + g + h + i + j + k + l + m + n + o + p + q + r + s + t + u + v + w + x + y + z

End Sub
 
Upvote 0
Status
Không mở trả lời sau này.
Web KT

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

Back
Top Bottom