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

End Sub

Đây là code của module UserForm?
Nếu bạn có code lặp lại kiểu đó, tức làm những việc như nhau mà chúng chỉ khác nhau "một chút nào đó" - ở đây là tên Sheet và chỉ số của Label - thì bạn phải nghĩ ngay tới vòng lặp. Chính vì thế mà ở bài 1 ta phải học các cấu trúc có trong ngôn ngữ và hiểu được triết lý của chúng. Có như vậy khi gặp vấn đề ta mới biết là cần cấu trúc nào, cấu trúc nào thích hợp nhất.

Ở đây nên dùng vòng For. Vòng lặp Do ... Loop cũng chả sao nhưng rõ ràng ta biết rất rõ có tất cả bao nhiêu vòng lặp - không ít hơn mà cũng không nhiều hơn.

Mã:
Private Sub CommandButton1_Click()
Dim index As Long, curr_row As Long, sum_row As Long
    For index = 65 To 90
        curr_row = Worksheets(Chr(index)).Range("A1048576").End(xlUp).Row - 2
        Controls("Label" & index - 43).Caption = curr_row
        sum_row = sum_row + curr_row
    Next index
    Label48.Caption = sum_row
End Sub

Về khai báo biến nếu nó luôn là Long thì khai báo là Long. Chỉ riêng về bộ nhớ thì Variant chiếm 16 bai trong khi Long chỉ chiếm 4 bai. Variant chỉ khi cần phải thế.
 
Upvote 0
Đây là code của module UserForm?
Nếu bạn có code lặp lại kiểu đó, tức làm những việc như nhau mà chúng chỉ khác nhau "một chút nào đó" - ở đây là tên Sheet và chỉ số của Label - thì bạn phải nghĩ ngay tới vòng lặp. Chính vì thế mà ở bài 1 ta phải học các cấu trúc có trong ngôn ngữ và hiểu được triết lý của chúng. Có như vậy khi gặp vấn đề ta mới biết là cần cấu trúc nào, cấu trúc nào thích hợp nhất.

Ở đây nên dùng vòng For. Vòng lặp Do ... Loop cũng chả sao nhưng rõ ràng ta biết rất rõ có tất cả bao nhiêu vòng lặp - không ít hơn mà cũng không nhiều hơn.

Mã:
Private Sub CommandButton1_Click()
Dim index As Long, curr_row As Long, sum_row As Long
    For index = 65 To 90
        curr_row = Worksheets(Chr(index)).Range("A1048576").End(xlUp).Row - 2
        Controls("Label" & index - 43).Caption = curr_row
        sum_row = sum_row + curr_row
    Next index
    Label48.Caption = sum_row
End Sub

Về khai báo biến nếu nó luôn là Long thì khai báo là Long. Chỉ riêng về bộ nhớ thì Variant chiếm 16 bai trong khi Long chỉ chiếm 4 bai. Variant chỉ khi cần phải thế.

Em cũng nghĩ đến vòng lặp For, nhưng ko biết làm sao cho nó chạy từ A tới Z -\\/.. Nhìn code của Thầy thì em hiểu là trong mã ASCII số 65 là A... hihi%#^#$. Còn về khai báo biến thì thật tình em ko biết vì em ko có học bài bản VBA mà chỉ học từ những gì cần làm và hỏi các Thầy trên forum thôi /-*+/. Cám ơn Thầy nhiều lắm @$@!^%
 
Upvote 0
Em cũng nghĩ đến vòng lặp For, nhưng ko biết làm sao cho nó chạy từ A tới Z

Thì phải "xoay xở" một tí, láu cá một tí.

Ví dụ ta gán cho những chữ cái A-Z những số tự nhiên liên tục, vd. từ 1 tới 26 hoặc k tới k+25. Gán bằng cách nào? Vd. bằng cách cho vào mảng. Lúc đó mỗi chữ cái được gán cho 1 số là chỉ số trong mảng của chữ cái đó. Tức khi duyệt các chỉ số thì ta cũng có chữ cái tương ứng.

Vd.
Mã:
Private Sub CommandButton1_Click()
Dim index As Long, curr_row As Long, sum_row As Long, Arr()
    Arr = Array("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")
    For index = 0 To UBound(Arr)
        curr_row = Worksheets(Arr(index)).Range("A1048576").End(xlUp).Row - 2
        Controls("Label" & index + 22).Caption = curr_row
        sum_row = sum_row + curr_row
    Next index
    Label48.Caption = sum_row
End Sub

Trong trường hợp khác thì các phần tử trong mảng "kia" có thể là tên (string) các control, tên các sheet ... hoặc là đối tượng (object, vd. các Range) luôn
 
Upvote 0
Thì phải "xoay xở" một tí, láu cá một tí.

Ví dụ ta gán cho những chữ cái A-Z những số tự nhiên liên tục, vd. từ 1 tới 26 hoặc k tới k+25. Gán bằng cách nào? Vd. bằng cách cho vào mảng. Lúc đó mỗi chữ cái được gán cho 1 số là chỉ số trong mảng của chữ cái đó. Tức khi duyệt các chỉ số thì ta cũng có chữ cái tương ứng.

Vd.
Mã:
Private Sub CommandButton1_Click()
Dim index As Long, curr_row As Long, sum_row As Long, Arr()
    Arr = Array("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")
    For index = 0 To UBound(Arr)
        curr_row = Worksheets(Arr(index)).Range("A1048576").End(xlUp).Row - 2
        Controls("Label" & index + 22).Caption = curr_row
        sum_row = sum_row + curr_row
    Next index
    Label48.Caption = sum_row
End Sub

Trong trường hợp khác thì các phần tử trong mảng "kia" có thể là tên (string) các control, tên các sheet ... hoặc là đối tượng (object, vd. các Range) luôn

_ Tuyệt vời, nếu gán bằng Mảng như thế thì mình có thể đặt tên Sheet = bất kỳ tên gì ko nhất thiết phải mang tính chất liên tục như từ A tới Z đúng ko Thầy.
_ Thầy cho em hỏi, em làm cái code tạo sheet, mà ko biết làm sao cho nó kiểm tra nếu đã có sheet đó rồi thì bỏ qua, tạo tiếp sheet tiếp theo. Thầy giúp em chỉnh cái code này lại nha :

PHP:
Private Sub CommandButton10_Click()
Dim i As Long
Dim sh As WorkSheet
For i = 65 To 90
     For Each sh In ThisWorkbook.Sheets    
            If UCase(sh.Name) = Chr(i) Then    
               Me.CommandButton10.Visible = False    
               Exit Sub    
            End If
     Next

Worksheets.Add(After:=Sheets(Sheets.Count)).Name = Chr(i)
ActiveSheet.Range("A1") = "0" & Chr(i)
ActiveSheet.Range("A2") = "0" & Chr(i)

Next

Worksheets.Add(After:=Sheets(Sheets.Count)).Name = "Number"
ActiveSheet.Range("A1") = "0A"
ActiveSheet.Range("A2") = "0A"

End Sub

_ Làm sao mình short lại thứ tự của các Sheet vậy Thầy ? vd : B - E - F - D - C - A. mình short nó lại thành A- B - C - D - E - F đó.
 
Lần chỉnh sửa cuối:
Upvote 0
_ Tuyệt vời, nếu gán bằng Mảng như thế thì mình có thể đặt tên Sheet = bất kỳ tên gì ko nhất thiết phải mang tính chất liên tục như từ A tới Z đúng ko Thầy.

Thế bạn không tự thử được à? Tự thử, mục sở thị thì mới "lên tay" được.
_ Thầy cho em hỏi, em làm cái code tạo sheet, mà ko biết làm sao cho nó kiểm tra nếu đã có sheet đó rồi thì bỏ qua, tạo tiếp sheet tiếp theo. Thầy giúp em chỉnh cái code này lại nha :

PHP:
Private Sub CommandButton10_Click()
Dim i As Long
Dim sh As WorkSheet
For i = 65 To 90
     For Each sh In ThisWorkbook.Sheets    
            If UCase(sh.Name) = Chr(i) Then    
               Me.CommandButton10.Visible = False    
               Exit Sub    
            End If
     Next

Worksheets.Add(After:=Sheets(Sheets.Count)).Name = Chr(i)
ActiveSheet.Range("A1") = "0" & Chr(i)
ActiveSheet.Range("A2") = "0" & Chr(i)

Next

Worksheets.Add(After:=Sheets(Sheets.Count)).Name = "Number"
ActiveSheet.Range("A1") = "0A"
ActiveSheet.Range("A2") = "0A"

End Sub
Mã:
Private Sub CommandButton10_Click()
Dim index As Long, sh As Worksheet, a
    For index = 65 To 90
        On Error Resume Next
        a = Sheets(Chr(index)).[A1].Value
        If Err.Number Then
            Err.Clear
            On Error GoTo 0
            Set sh = Worksheets.Add
            With sh
                .Name = Chr(index)
                .Range("A1").Value = Chr(index)
                .Range("A2").Value = Chr(index)
            End With
        End If
    Next index
    
'    SortSheets
End Sub

_ Làm sao mình short lại thứ tự của các Sheet vậy Thầy ? vd : B - E - F - D - C - A. mình short nó lại thành A- B - C - D - E - F đó.
Giả sử trong cửa sổ chính ta nhìn thấy 3 sheet theo thứ tự B, C, A và thao tác bằng tay ta kéo A lên đầu để các sheet theo thứ tự A, B, C. Bây giờ bạn muốn làm điều đó bằng code? Nếu thế thì: Alt + F11 --> Insert --> Module --> dán code sau vào Module1.
Mã:
Sub SortSheets()
Dim k As Long, n As Long
    For k = Sheets.Count To 2 Step -1
        For n = 1 To k - 1
            If [COLOR=#ff0000]Sheets(n).Name > Sheets(n + 1).Name[/COLOR] Then Sheets(n).Move After:=Sheets(n + 1)
        Next n
    Next k
End Sub

Tất nhiên code trên chỉ làm đúng ý khi vd. tên các sheet là A, B, C, ...
Nếu tên các sheet là vd. Tháng 1, Tháng 2, ..., Tháng 12 thì sau khi chạy code sẽ có thứ tự Tháng 1, Tháng 10, Tháng 11, Tháng 12, Tháng 2, Tháng 3, ..., Tháng 9.
Trong trường hợp trên thì có thể trước khi so sánh 2 chuỗi - dòng đỏ đỏ - thì biến chúng, tức 2 chuỗi so sánh chứ không phải đổi tên 2 sheet, thành dạng Tháng 01, Tháng 02, ..., Tháng 09, Tháng 10, ..., Tháng 12.

Tuy nhiên các trường hợp rất đa dạng. Vd. tên các sheet: T1N2013, ..., T12N2013, T1N2014, ..., T12N2014 thì xử lý thế nào?

Nói chung bạn phải hiểu được thuật toán là so sánh 2 chuỗi để quyết định có đổi chỗ 2 sheet cho nhau không. Hiểu được rồi thì tùy trường hợp mà làm thêm một số thao tác sao cho kết quả so sánh đúng theo ý mình.
 
Lần chỉnh sửa cuối:
Upvote 0
Thầy siwtom cho em hỏi code này nha. ví dụ em muốn lọc ký tự đầu của 1 cell là số và cho vào sheet Number. Thì em dùng code IsNumeric. Còn nếu là chữ cái A,B,C thì cứ theo đúng tên Sheet đó mà cho vào.
Vậy còn khi ký tự đầu tiên là các ký tự đặc biệt ko phải Số và ABC như : ?-_+=.... thì làm sao phân biệt mấy cái ký tự đặc biệt đó để xóa luôn cái cell đó vậy Thầy ?

PHP:
Private Sub CommandButton10_Click()
Dim index As Long, sh As Worksheet, a
    For index = 65 To 90
        On Error Resume Next
        a = Sheets(Chr(index)).[A1].Value
        If Err.Number Then
            Err.Clear
            On Error GoTo 0
            Set sh = Worksheets.Add
            With sh
                .Name = Chr(index)
                .Range("A1").Value = Chr(index)
                .Range("A2").Value = Chr(index)
            End With
        End If
    Next index
    
'    SortSheets
End Sub

Trong đoạn code trên em thấy Thầy cho "a = Sheets(Chr(index)).[A1].Value" rồi sau đó ko thấy làm gì với cái "a" đó hết ? mục đích để làm gì vậy Thầy ???
 
Lần chỉnh sửa cuối:
Upvote 0
Thầy siwtom cho em hỏi code này nha. ví dụ em muốn lọc ký tự đầu của 1 cell là số và cho vào sheet Number. Thì em dùng code IsNumeric. Còn nếu là chữ cái A,B,C thì cứ theo đúng tên Sheet đó mà cho vào.
Vậy còn khi ký tự đầu tiên là các ký tự đặc biệt ko phải Số và ABC như : ?-_+=.... thì làm sao phân biệt mấy cái ký tự đặc biệt đó để xóa luôn cái cell đó vậy Thầy ?
Một ký tự đầu? Bạn đọc ra bằng Left hoặc Mid. Còn kiểm tra? Hàm Asc/AscW(ký tự) sẽ trả về mã của "ký tự". Mã của chữ số là từ 48 tới 57 (tương ứng 0, 1, ..., 9), của A-Z là từ 65 tới 90, của a-z là từ 97 tới 122. Nếu Asc(ký tự) nằm trong mỗi khoảng ở trên thì "ký tự" là chữ số, thuộc A-Z, thuộc a-z
Nếu dùng hàm của system thì có (lâu rồi tôi không nhớ) IsCharAlpha, IsCharAlphaNumeric

PHP:
Private Sub CommandButton10_Click()
Dim index As Long, sh As Worksheet, a
    For index = 65 To 90
        On Error Resume Next
        a = Sheets(Chr(index)).[A1].Value
        If Err.Number Then
            Err.Clear
            On Error GoTo 0
            Set sh = Worksheets.Add
            With sh
                .Name = Chr(index)
                .Range("A1").Value = Chr(index)
                .Range("A2").Value = Chr(index)
            End With
        End If
    Next index
    
'    SortSheets
End Sub

Trong đoạn code trên em thấy Thầy cho "a = Sheets(Chr(index)).[A1].Value" rồi sau đó ko thấy làm gì với cái "a" đó hết ? mục đích để làm gì vậy Thầy ???

Để thử xem sheet Sheets(Chr(index)) có tồn tại hay không. Nếu không tồn tại thì sẽ có lỗi tại dòng (đọc dữ liệu của sheet không tồn tại)
Mã:
a = Sheets(Chr(index)).[A1].Value

Trước đó có On Error Resume Next mục đích để nếu có lỗi thì còn có cơ hội xử lý. Nếu không có On Error Resume Next mà sẩy ra lỗi thì chỉ còn nước reset/end mà chả giải quyết được gì. Còn có On Error Resume Next thì khi gặp lỗi thì code vẫn chuyển sang dòng tiếp theo. Mà ở dòng tiếp theo thì tôi có code kiểm tra xem có lỗi hay không. Nếu có lỗi - If Err.Number Then thì thực hiện những code có trong If ... End If, tức các code tạo sheet mới. Nếu không có lỗi tức Sheets(Chr(index)) tồn tại thì tất nhiên code trong If ... End If không được thực hiện. Tức sẽ không tạo sheet ... đã có.

Nhiều người dùng object Err để "lờ" lỗi đi, kiểu "trát vôi lên mụn" để che nó đi. Nhưng Err được thiết kế không phải là để "lờ" lỗi đi. Nếu không có Err thì nhiều khi không làm được gì (như trong trường hợp này) hoặc khi gặp lỗi thì phải reset/end code để sửa lại chỗ có lỗi rồi lại phải run code từ đầu. Nếu code rất dài thì bạn hãy tưởng tượng là chạy lại code mất công như thế nào. Trong trường hợp ở trên ta không lờ lỗi đi mà dùng Err để có cơ hội kiểm tra lỗi có sẩy ra hay không để xử lý.
 
Upvote 0
Nhờ Chỉnh sửa lại code

Mình có viết một code chạy vòng lập. ghép các dãy số lại vối nhau kết quả ra đúng như mong muốn nhưng tốc độ ghép chậm quá do quá nhiều vòng vòng lập for Next nên tốc độ chậm lại. đó là mình mới cho cột F có khoãng 100 số mà vậy chứ cột F lên 500 => 1000 thì đơ máy luôn.
suy nghĩ mãi không thể viết được cách khác tốc độ tối ưu hơn vì vậy xin úp lên đây nhờ các bạn trợ giúp
Xin cảm ơn
PHP:
Sub Ghep_So()
Dim dauso(), duoiso, kq(), i As Long, j As Long, n As Long
With Sheet4
    duoiso = .Range(.[F3], .[F200].End(4)).Value
    ReDim kq(1 To UBound(duoiso), 1 To 1)
    dauso = .Range("A3:A74").Value
End With
For i = 1 To UBound(duoiso)
    For j = 1 To UBound(dauso)
        If duoiso(i, 1) <> "" Then
            kq(j + n, 1) = dauso(j, 1) & duoiso(i, 1)
        End If
    Next
        n = n + 72
Next
With Sheet4
    .Range("G3:G10000").ClearContents
    .Range("G3").Resize(i - 1, 1) = kq
End With
End Sub
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Một ký tự đầu? Bạn đọc ra bằng Left hoặc Mid. Còn kiểm tra? Hàm Asc/AscW(ký tự) sẽ trả về mã của "ký tự". Mã của chữ số là từ 48 tới 57 (tương ứng 0, 1, ..., 9), của A-Z là từ 65 tới 90, của a-z là từ 97 tới 122. Nếu Asc(ký tự) nằm trong mỗi khoảng ở trên thì "ký tự" là chữ số, thuộc A-Z, thuộc a-z
Nếu dùng hàm của system thì có (lâu rồi tôi không nhớ) IsCharAlpha, IsCharAlphaNumeric



Để thử xem sheet Sheets(Chr(index)) có tồn tại hay không. Nếu không tồn tại thì sẽ có lỗi tại dòng (đọc dữ liệu của sheet không tồn tại)
Mã:
a = Sheets(Chr(index)).[A1].Value

Trước đó có On Error Resume Next mục đích để nếu có lỗi thì còn có cơ hội xử lý. Nếu không có On Error Resume Next mà sẩy ra lỗi thì chỉ còn nước reset/end mà chả giải quyết được gì. Còn có On Error Resume Next thì khi gặp lỗi thì code vẫn chuyển sang dòng tiếp theo. Mà ở dòng tiếp theo thì tôi có code kiểm tra xem có lỗi hay không. Nếu có lỗi - If Err.Number Then thì thực hiện những code có trong If ... End If, tức các code tạo sheet mới. Nếu không có lỗi tức Sheets(Chr(index)) tồn tại thì tất nhiên code trong If ... End If không được thực hiện. Tức sẽ không tạo sheet ... đã có.

Nhiều người dùng object Err để "lờ" lỗi đi, kiểu "trát vôi lên mụn" để che nó đi. Nhưng Err được thiết kế không phải là để "lờ" lỗi đi. Nếu không có Err thì nhiều khi không làm được gì (như trong trường hợp này) hoặc khi gặp lỗi thì phải reset/end code để sửa lại chỗ có lỗi rồi lại phải run code từ đầu. Nếu code rất dài thì bạn hãy tưởng tượng là chạy lại code mất công như thế nào. Trong trường hợp ở trên ta không lờ lỗi đi mà dùng Err để có cơ hội kiểm tra lỗi có sẩy ra hay không để xử lý.

_ Cám ơn Thầy nhiều lắm, Thầy giải thích code rất cặn kẽ và dễ hiểu. -=.,,
 
Upvote 0
Mình có viết một code chạy vòng lập. ghép các dãy số lại vối nhau kết quả ra đúng như mong muốn nhưng tốc độ ghép chậm quá do quá nhiều vòng vòng lập for Next nên tốc độ chậm lại. đó là mình mới cho cột F có khoãng 100 số mà vậy chứ cột F lên 500 => 1000 thì đơ máy luôn.
suy nghĩ mãi không thể viết được cách khác tốc độ tối ưu hơn vì vậy xin úp lên đây nhờ các bạn trợ giúp
Xin cảm ơn
PHP:
Sub Ghep_So()
Dim dauso(), duoiso, kq(), i As Long, j As Long, n As Long
With Sheet4
    duoiso = .Range(.[F3], .[F200].End(4)).Value
    ReDim kq(1 To UBound(duoiso), 1 To 1)
    dauso = .Range("A3:A74").Value
End With
For i = 1 To UBound(duoiso)
    For j = 1 To UBound(dauso)
        If duoiso(i, 1) <> "" Then
            kq(j + n, 1) = dauso(j, 1) & duoiso(i, 1)
        End If
    Next
        n = n + 72
Next
With Sheet4
    .Range("G3:G10000").ClearContents
    .Range("G3").Resize(i - 1, 1) = kq
End With
End Sub
Bảo đảm mình code chạy trong vòng 1s là ra kết quả. Nhưng giờ đang bận.
Dạng bài này mà không dùng Dic thì chạy tới sáng luôn chưa xong
 
Lần chỉnh sửa cuối:
Upvote 0
vậy để em tập set một cái dic xem sao
Bài này chỉ khó là khi ghép dãy 6 số để tạo ra những số gần giống chỉ sai duy nhất 1 số gần nhất.
Vừa tạo ra vừa nạp vào Dic để kiểm tra duy nhất luôn. Cuối cùng duyệt qua dữ liệu đầu số nhà mạng và ghép với từng số trong dic
Bảo đảm 10 000 số chạy chưa tới 1s
 
Upvote 0
Bài này chỉ khó là khi ghép dãy 6 số để tạo ra những số gần giống chỉ sai duy nhất 1 số gần nhất.
Vừa tạo ra vừa nạp vào Dic để kiểm tra duy nhất luôn. Cuối cùng duyệt qua dữ liệu đầu số nhà mạng và ghép với từng số trong dic
Bảo đảm 10 000 số chạy chưa tới 1s

không biết em có set nỗi dic không nữa. nhưng cho dù có không ra một kết quả nào đi chăng nữa thì cũng sẽ quyết tâm set một cái dic
 
Upvote 0
Bài này chỉ khó là khi ghép dãy 6 số để tạo ra những số gần giống chỉ sai duy nhất 1 số gần nhất.
Vừa tạo ra vừa nạp vào Dic để kiểm tra duy nhất luôn. Cuối cùng duyệt qua dữ liệu đầu số nhà mạng và ghép với từng số trong dic
Bảo đảm 10 000 số chạy chưa tới 1s
Khó hiểu à nghe!
Code của tác giả bảo là ra kết quả đúng thì tôi đâu thấy có so sánh duy nhất gì đâu mà Dic?
Mình có viết một code chạy vòng lập. ghép các dãy số lại vối nhau kết quả ra đúng như mong muốn nhưng tốc độ ghép chậm quá do quá nhiều vòng vòng lập for Next nên tốc độ chậm lại. đó là mình mới cho cột F có khoãng 100 số mà vậy chứ cột F lên 500 => 1000 thì đơ máy luôn.
suy nghĩ mãi không thể viết được cách khác tốc độ tối ưu hơn vì vậy xin úp lên đây nhờ các bạn trợ giúp
Xin cảm ơn
PHP:
Sub Ghep_So()
Dim dauso(), duoiso, kq(), i As Long, j As Long, n As Long
With Sheet4
    duoiso = .Range(.[F3], .[F200].End(4)).Value
    ReDim kq(1 To UBound(duoiso), 1 To 1)
    dauso = .Range("A3:A74").Value
End With
For i = 1 To UBound(duoiso)
    For j = 1 To UBound(dauso)
        If duoiso(i, 1) <> "" Then
            kq(j + n, 1) = dauso(j, 1) & duoiso(i, 1)
        End If
    Next
        n = n + 72
Next
With Sheet4
    .Range("G3:G10000").ClearContents
    .Range("G3").Resize(i - 1, 1) = kq
End With
End Sub
Tôi chạy code này kết quả cũng giống hệt của tác giả, không kịp chớp mắt là xong.
[GPECODE=vb]Public Sub GPE()
Dim Duoi(), Dau(), Arr(), I As Long, J As Long, K As Long
Duoi = Range([F3], [F3].End(xlDown)).Value2
Dau = Range([A3], [A3].End(xlDown)).Value2
ReDim Arr(1 To UBound(Dau, 1) * UBound(Duoi, 1), 1 To 1)
For J = 1 To UBound(Duoi, 1)
For I = 1 To UBound(Dau, 1)
K = K + 1
Arr(K, 1) = Dau(I, 1) & Duoi(J, 1)
Next I
Next J
[H3:H65000].ClearContents
[H3].Resize(K) = Arr
End Sub[/GPECODE]
Hổng biết "ý đồ" dùng Dic để loại ra số nào?
 
Lần chỉnh sửa cuối:
Upvote 0
Khó hiểu à nghe!
Code của tác giả bảo là ra kết quả đúng thì tôi đâu thấy có so sánh duy nhất gì đâu mà Dic?

Tôi chạy code này kết quả cũng giống hệt của tác giả, không kịp chớp mắt là xong.
[GPECODE=vb]Public Sub GPE()
Dim Duoi(), Dau(), Arr(), I As Long, J As Long, K As Long
Duoi = Range([F3], [F3].End(xlDown)).Value2
Dau = Range([A3], [A3].End(xlDown)).Value2
ReDim Arr(1 To UBound(Dau, 1) * UBound(Duoi, 1), 1 To 1)
For J = 1 To UBound(Duoi, 1)
For I = 1 To UBound(Dau, 1)
K = K + 1
Arr(K, 1) = Dau(I, 1) & Duoi(J, 1)
Next I
Next J
[H3:H65000].ClearContents
[H3].Resize(K) = Arr
End Sub[/GPECODE]
Hổng biết "ý đồ" dùng Dic để loại ra số nào?
Kết quả ra Y trang code em viết mà tốc độ cũng chớp mắt
cảm ơn anh nhiều
 
Lần chỉnh sửa cuối:
Upvote 0
Khó hiểu à nghe!
Code của tác giả bảo là ra kết quả đúng thì tôi đâu thấy có so sánh duy nhất gì đâu mà Dic?

Tôi chạy code này kết quả cũng giống hệt của tác giả, không kịp chớp mắt là xong.

Hổng biết "ý đồ" dùng Dic để loại ra số nào?
Không nói hết căn cơ gốc ngọn cho anh nghe đâu. Đâu có cái gì tự nhiên.. ka ka ka
 
Lần chỉnh sửa cuối:
Upvote 0
Mình có viết một code chạy vòng lập. ghép các dãy số lại vối nhau kết quả ra đúng như mong muốn nhưng tốc độ ghép chậm quá do quá nhiều vòng vòng lập for Next nên tốc độ chậm lại. đó là mình mới cho cột F có khoãng 100 số mà vậy chứ cột F lên 500 => 1000 thì đơ máy luôn.
suy nghĩ mãi không thể viết được cách khác tốc độ tối ưu hơn vì vậy xin úp lên đây nhờ các bạn trợ giúp
Xin cảm ơn
PHP:
Sub Ghep_So()
Dim dauso(), duoiso, kq(), i As Long, j As Long, n As Long
With Sheet4
    duoiso = .Range(.[F3], .[F200].End(4)).Value
    ReDim kq(1 To UBound(duoiso), 1 To 1)
    dauso = .Range("A3:A74").Value
End With
For i = 1 To UBound(duoiso)
    For j = 1 To UBound(dauso)
        If duoiso(i, 1) <> "" Then
            kq(j + n, 1) = dauso(j, 1) & duoiso(i, 1)
        End If
    Next
        n = n + 72
Next
With Sheet4
    .Range("G3:G10000").ClearContents
    .Range("G3").Resize(i - 1, 1) = kq
End With
End Sub

Nếu bạn chịu khó debug, bảo code nó in ra UBound(duoiso) thì sẽ thấy là 1048574. Tính hàng triệu như vậy có máy thánh mới không lâu.
Điều này chứng tỏ code tính ô dữ liệu cuối cùng của bạn sai.
Hãy tự tìm hiểu sai ra sao.
 
Upvote 0
Khó hiểu à nghe!
Code của tác giả bảo là ra kết quả đúng thì tôi đâu thấy có so sánh duy nhất gì đâu mà Dic?
...........
Hổng biết "ý đồ" dùng Dic để loại ra số nào?
Gởi anh BaTê nhà mình cái vụ tại sao phải dùng Dic nha, nếu không anh sẽ ấm ức tại sao em lại nói như thế
Anh có ngon thì đừng dùng Dic nha... hí hí
Yêu Cầu:
1. Cho sẵn dữ liệu tại cột A và cột E
2. Code thế nào để tại cột cột F và G có kết quả như mẫu là I và J

PS: cứ mỗi chuỗi 6 số tạo ra những số chỉ khác nhau 1 số so với chuỗi gốc. Ví dụ 597598 thì sẽ có 4 59758, 6 97598, 587598, ....... tới hết chuỗi
số 9 thì không cộng lên, số 0 thì không trừ xuống.
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Hi Cac Anh
Cac Anh có thể giải thích cho em biết nội dung đoạn CODE sau không
Chẳn hạn như đoạn sau số 9 này là gì
Arr(r, 9) = r + 5

Private Sub TextBox9_AfterUpdate()
Dim Arr(), Darr(), i As Long, k As Long, j As Integer, r As Long
Arr = Sheets("nhap").Range("A6:H" & Sheets("nhap").Range("C65536").End(xlUp).Row).Valu e
ReDim Preserve Arr(1 To UBound(Arr, 1), 1 To UBound(Arr, 2) + 1)
For r = 1 To UBound(Arr, 1)
Arr(r, 9) = r + 5
Next r
ReDim Darr(1 To UBound(Arr, 1), 1 To UBound(Arr, 2))
For i = 1 To UBound(Arr, 1)
If Arr(i, 1) = Val(TextBox9.Value) Then
k = k + 1
Darr(k, 1) = Format(Arr(i, 2), "dd/mm/yy")
For j = 2 To UBound(Darr, 2) - 1
Darr(k, j) = Arr(i, j + 1)
Next j
End If
Next i
ListBox1.List = Darr
Sheet2.Range("A1").Resize(UBound(Darr, 1), UBound(Darr, 2)) = Darr
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Xin các Thầy giúp hoàn thiện code vòng lặp này !!!

Em làm 1 cái code vòng lặp tạo ký tự như sau.

PHP:
Sub vlap()
Dim i As Long, j As Long
b = 1
For i = 97 To 122
       For j = 97 To 122
              Activesheet.Range("A" & b).Value = Chr(i) & Chr(j)
              b = b + 1
       Next j
Next i
End Sub

_ Đoan code trên nó sẽ tạo cho em dãy ký tự từ aa -> zz. Giờ em muốn nó có a0 - z9 và 00 - 99 thì em phải thêm cái i = 48 To 57 và j = 48 To 57 vào chỗ nào vậy các Thầy ???.
_ Tóm lại ý em muốn hỏi là làm sao để gắn giá trị i hoặc j = 2 khoảng ko liên tiếp nhau đó (48 To 57 và 97 To 122)
 
Lần chỉnh sửa cuối:
Upvote 0
Em làm 1 cái code vòng lặp tạo ký tự như sau.

PHP:
Sub vlap()
Dim i As Long, j As Long
b = 1
For i = 97 To 122
       For j = 97 To 122
              Activesheet.Range("A" & b).Value = Chr(i) & Chr(j)
              b = b + 1
       Next j
Next i
End Sub

_ Đoan code trên nó sẽ tạo cho em dãy ký tự từ aa -> zz. Giờ em muốn nó có a0 - z9 và 00 - 99 thì em phải thêm cái i = 48 To 57 và j = 48 To 57 vào chỗ nào vậy các Thầy ???.
_ Tóm lại ý em muốn hỏi là làm sao để gắn giá trị i hoặc j = 2 khoảng ko liên tiếp nhau đó (48 To 57 và 97 To 122)

PHP:
Sub vlap()
Dim i As Long, j As Long, b
For i = 97 To 122
   For j = 48 To 122
      If j < 58 Or j > 96 Then
         b = b + 1
         ActiveSheet.Range("A" & b).Value = Chr(i) & Chr(j)
      End If
   Next j
Next i
End Sub
 
Upvote 0
PHP:
Sub vlap()
Dim i As Long, j As Long, b
For i = 97 To 122
   For j = 48 To 122
      If j < 58 Or j > 96 Then
         b = b + 1
         ActiveSheet.Range("A" & b).Value = Chr(i) & Chr(j)
      End If
   Next j
Next i
End Sub

_ Theo em hiểu thì code Thầy chỉnh lại i vẫn chỉ có giá trị từ 97 To 122 thôi. Vậy làm sao để i cũng xét qua giá trị từ 48 To 57 vậy Thầy. Bởi vì em cần cho cả 2 biến i và j chạy trong 2 khoảng 48 To 57 và 97 To 122 đó.
_ Mình có thể gán cho giá trị i trong For ... Next ở nhiều khoảng ko liền nhau ko Thầy ?
 
Upvote 0
_ Theo em hiểu thì code Thầy chỉnh lại i vẫn chỉ có giá trị từ 97 To 122 thôi. Vậy làm sao để i cũng xét qua giá trị từ 48 To 57 vậy Thầy. Bởi vì em cần cho cả 2 biến i và j chạy trong 2 khoảng 48 To 57 và 97 To 122 đó.
_ Mình có thể gán cho giá trị i trong For ... Next ở nhiều khoảng ko liền nhau ko Thầy ?
Trả lời liều chứ thật ra chả hiểu bạn muốn kết quả ra sao
PHP:
Sub vlap()
Dim i As Long, j As Long, b
Dim res(1 To 65536, 1 To 1)
For i = 48 To 122
   If i < 58 Or i > 96 Then
      For j = 48 To 122
         If j < 58 Or j > 96 Then
            b = b + 1
            res(b, 1) = Chr(i) & Chr(j)
         End If
      Next j
   End If
Next i
[A1].Resize(b) = res
End Sub
 
Upvote 0
Trả lời liều chứ thật ra chả hiểu bạn muốn kết quả ra sao
PHP:
Sub vlap()
Dim i As Long, j As Long, b
Dim res(1 To 65536, 1 To 1)
For i = 48 To 122
   If i < 58 Or i > 96 Then
      For j = 48 To 122
         If j < 58 Or j > 96 Then
            b = b + 1
            res(b, 1) = Chr(i) & Chr(j)
         End If
      Next j
   End If
Next i
[A1].Resize(b) = res
End Sub

_ Haha Cám ơn Thầy nhiều nha, em cũng làm theo cái vụ "If" như Thầy thì ra kết quả cũng OK, chỉ tội là càng nhiều khoảng giá trị ko liền nhau thì càng nhiều "If" **~**.
_ Còn đoạn kết trên của Thầy thì em thấy Thầy "Update" cái dòng :
PHP:
ActiveSheet.Range("A" & b).Value = Chr(i) & Chr(j)
thành :
PHP:
res(b, 1) = Chr(i) & Chr(j)
_ Tốc độ nhanh lên thấy rõ luôn ghê thiệt... Cám ơn Thầy Hải nhiều lắm --=0
 
Lần chỉnh sửa cuối:
Upvote 0
_ Còn đoạn kết trên của Thầy thì em thấy Thầy "Update" cái dòng :
PHP:
ActiveSheet.Range("A" & b).Value = Chr(i) & Chr(j)
thành :
PHP:
res(b, 1) = Chr(i) & Chr(j)
_ Tốc độ nhanh lên thấy rõ luôn ghê thiệt... Cám ơn Thầy Hải nhiều lắm --=0

Đó là cách xử lý trên mảng, khi dùng mảng, ta cập nhật, tính toán toàn bộ trên bộ nhớ của máy, sau đó gán xuống sheet một lần, dĩ nhiên sẽ cho tốc độ nhanh hơn là mỗi lần tính toán, mỗi lần sẽ gán xuống sheet.
 
Upvote 0
_ Haha Cám ơn Thầy nhiều nha, em cũng làm theo cái vụ "If" như Thầy thì ra kết quả cũng OK, chỉ tội là càng nhiều khoảng giá trị ko liền nhau thì càng nhiều "If" **~**.
_

thử giải pháp này cho nó nhanh (không mất thời gian chạy không công từ 49 đến 96) và không cần if, thích tăng bao nhiêu khoảng cũng được
PHP:
Sub vlap()
Dim i As Long, j As Long, b As Long, ik As Long
Dim d1, c1, d2, c2, res(1 To 65536, 1 To 1)

d1 = Array(48, 48, 97, 97)
c1 = Array(57, 57, 122, 122)
d2 = Array(48, 97, 48, 97)
c2 = Array(57, 122, 97, 122)

For ik = 0 To Ubound(d1)
    For i = d1(ik) To c1(ik)
        For j = d2(ik) To c2(ik)
            b = b + 1
            res(b, 1) = Chr(i) & Chr(j)
        Next j
    Next i
Next ik

[A1].Resize(b) = res
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
thử giải pháp này cho nó nhanh (không mất thời gian chạy không công từ 49 đến 96) và không cần if, thích tăng bao nhiêu khoảng cũng được
PHP:
Sub vlap()
Dim i As Long, j As Long, b As Long, ik As Long
Dim d1, c1, d2, c2, res(1 To 65536, 1 To 1)

d1 = Array(48, 48, 97, 97)
c1 = Array(57, 57, 122, 122)
d2 = Array(48, 97, 48, 97)
c2 = Array(57, 122, 97, 122)

For ik = 0 To Ubound(d1)
    For i = d1(ik) To c1(ik)
        For j = d2(ik) To c2(ik)
            b = b + 1
            res(b, 1) = Chr(i) & Chr(j)
        Next j
    Next i
Next ik

[A1].Resize(b) = res
End Sub

_ Giải thích 1 chút về code trên được không Zerothink. Nhiều mảng quá nhìn ko hiểu gì luôn **~**
 
Upvote 0
_ Giải thích 1 chút về code trên được không Zerothink. Nhiều mảng quá nhìn ko hiểu gì luôn **~**

Bạn biết code lập trình nên cần chú ý chút là dễ hiểu ngay,

cái đó giờ bạn cứ giả định dịch vòng lặp FOR IK: ik từ 0 đến 3 xem sao, ví như

lần 1:
ik=0
==> code tương 2 vòng lặp for i và for j tương đương
PHP:
    For i = 48 To 57
        For j = 48 To 57
            b = b + 1
            res(b, 1) = Chr(i) & Chr(j)
        Next j
    Next i
vì d1(0)=48; c1(0)=57; d2(0)=48; c2(0)=57
chú ý: d,c đặt tên biến viết tắt bởi dẦU, cUỐI

lần 2:
ik=1
==> code tương 2 vòng lặp for i và for j tương đương
PHP:
    For i = 48 To 57
        For j = 97 To 122
            b = b + 1
            res(b, 1) = Chr(i) & Chr(j)
        Next j
    Next i
vì d1(1)=48; c1(1)=57; d2(1)= 97 ; c2(1)= 122


như thế các mảng hằng số d1,c1,d2,c2 là lưu vị trí đầu cuối cho for i và for j --như thế ta có thể tăng thêm các khoảng mà bao nhiêu ta thích
Cứ vậy tiếp tục cho là bạn hiểu
lẩn 3: ik=2
lần 4: ik=3 (=ubound(d1))

là tại sao lại như thế,
 
Lần chỉnh sửa cuối:
Upvote 0
Bạn biết code lập trình nên cần chú ý chút là dễ hiểu ngay,

cái đó giờ bạn cứ giả định dịch vòng lặp FOR IK: ik từ 0 đến 3 xem sao, ví như

lần 1:
ik=0
==> code tương 2 vòng lặp for i và for j tương đương
PHP:
    For i = 48 To 57
        For j = 48 To 57
            b = b + 1
            res(b, 1) = Chr(i) & Chr(j)
        Next j
    Next i
vì d1(0)=48; c1(0)=57; d2(0)=48; c2(0)=57
chú ý: d,c đặt tên biến viết tắt bởi dẦU, cUỐI

lần 2:
ik=1
==> code tương 2 vòng lặp for i và for j tương đương
PHP:
    For i = 48 To 57
        For j = 97 To 122
            b = b + 1
            res(b, 1) = Chr(i) & Chr(j)
        Next j
    Next i
vì d1(1)=48; c1(1)=57; d2(1)= 97 ; c2(1)= 122


như thế các mảng hằng số d1,c1,d2,c2 là lưu vị trí đầu cuối cho for i và for j --như thế ta có thể tăng thêm các khoảng mà bao nhiêu ta thích
Cứ vậy tiếp tục cho là bạn hiểu
lẩn 3: ik=2
lần 4: ik=3 (=ubound(d1))

là tại sao lại như thế,


_ À ha, Hiểu rồi, vậy là ik chỉ là vòng lặp trung gian để lấy giá trị đầu và cuối cho 2 vòng i và j. Thế thì trong code của bạn có 1 chỗ ghi sai rùi hehe :
PHP:
c2 = Array(57, 122, 97, 122)
phải là :
PHP:
c2 = Array(57, 122, 57, 122)
 
Upvote 0
_ À ha, Hiểu rồi, vậy là ik chỉ là vòng lặp trung gian để lấy giá trị đầu và cuối cho 2 vòng i và j. Thế thì trong code của bạn có 1 chỗ ghi sai rùi hehe :
PHP:
c2 = Array(57, 122, 97, 122)
phải là :
PHP:
c2 = Array(57, 122, 57, 122)


Không. chú ý là For j chạy từ d2(ik) đến c2(ik) nhé,

hình như bạn thay đổi giá trị sai (??? cái này còn tùy việc lặp các khoảng thế nào)
 
Upvote 0
thử giải pháp này cho nó nhanh (không mất thời gian chạy không công từ 49 đến 96) và không cần if, thích tăng bao nhiêu khoảng cũng được
PHP:
Sub vlap()
Dim i As Long, j As Long, b As Long, ik As Long
Dim d1, c1, d2, c2, res(1 To 65536, 1 To 1)

d1 = Array(48, 48, 97, 97)
c1 = Array(57, 57, 122, 122)
d2 = Array(48, 97, 48, 97)
c2 = Array(57, 122, 97, 122)

For ik = 0 To Ubound(d1)
    For i = d1(ik) To c1(ik)
        For j = d2(ik) To c2(ik)
            b = b + 1
            res(b, 1) = Chr(i) & Chr(j)
        Next j
    Next i
Next ik

[A1].Resize(b) = res
End Sub

Mình không tin là nhanh hơn giải pháp 2 vòng lặp đâu
Ai không tin thì cứ cho code chạy thử 10 vòng thì biết liền

Có điều dùng 3 vòng lặp có vẻ chuyên nghiệp, còn 2 vòng lặp có vẻ nông dân nhưng lại dễ hiểu.
 
Upvote 0
Mình không tin là nhanh hơn giải pháp 2 vòng lặp đâu
Ai không tin thì cứ cho code chạy thử 10 vòng thì biết liền

Có điều dùng 3 vòng lặp có vẻ chuyên nghiệp, còn 2 vòng lặp có vẻ nông dân nhưng lại dễ hiểu.

Có thể, vì số vòng lặp không công cũng không nhiều, nên so sánh khó,

Nhưng code sau thì đỡ phải chạy không công, và quan trọng là người hỏi muốn tăng số khoảng lên,

Đây chỉ là ví dụ thui, chả hiểu ng hỏi ứng dụng gì, làm chơi chơi ấy mà
 
Upvote 0
Trong VBA có cú pháp Select Case có thể dùng để thay thế IF nhiều khoảng. Trong trường hợp này muốn bao nhiêu khoảng thì cứ việc ghi thêm.

tb. vòng lặp For (chỉ số) chỉ gồm toàn toán số nguyên cho nên vòng nhanh lắm. Chạy không cũng chẳng chết ai.

=== bổ sung 09/08/2014 ===

Nếu nhất định muốn dùng mảng thì có thể dùng lệnh evaluate để tạo mảng 2 chiều, thay vì hàm Array chỉ tạo được mảng 1 chiều.

Mã:
Sub vlap()
Dim i As Long, j As Long, b As Long, ik As Long
Dim d1, d2, res(1 To 65536, 1 To 1)

d1 = [ { 48, 57; 48, 57; 97, 122; 97, 122 } ]
d2 = [ { 48, 57; 97, 122; 48, 97; 97, 122 } ]


For ik = 1 To UBound(d1)
    For i = d1(ik, 1) To d1(ik, 2)
        For j = d2(ik, 1) To d2(ik, 2)
...

End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
PHP:
Sub vlap2()
Dim name As String, b As Long, i As Long, j As Long
Dim res(1 To 1048576, 1 To 1)
name = UserForm1.TextBox5.Text
b = 1
For i = 0 To 9
    For j = 0 To 9
        b = b + 1
        res(b, 1) = name & i & j
    Next j
Next i
[A2].Resize(b) = res
Call ExportFile
End Sub

_ Em có đoạn code như trên và 1 cột H chứa nhiều tên, giờ em muốn cái "name" sẽ tự lấy từng tên trong cột H đó. (khỏi phải nhập tên từng người vào cái TextBox5 nữa. Nhưng em không biết làm sao để tạo vòng lặp đưa tên từng người vào. Xin các Thầy giúp em nha %#^#$
 
Lần chỉnh sửa cuối:
Upvote 0
PHP:
Sub vlap2()
Dim name As String, b As Long, i As Long, j As Long
Dim res(1 To 1048576, 1 To 1)
name = UserForm1.TextBox5.Text
b = 1
For i = 0 To 9
    For j = 0 To 9
        b = b + 1
        res(b, 1) = name & i & j
    Next j
Next i
[A2].Resize(b) = res
Call ExportFile
End Sub

_ Em có đoạn code như trên và 1 cột H chứa nhiều tên, giờ em muốn cái "name" sẽ tự lấy từng tên trong cột H đó. (khỏi phải nhập tên từng người vào cái TextBox5 nữa. Nhưng em không biết làm sao để tạo vòng lặp đưa tên từng người vào. Xin các Thầy giúp em nha %#^#$

_ hehe, tự nghĩ ra luôn rồi :). Các Thầy coi có gì góp ý hoàn thiện hơn giúp em nha %#^#$

PHP:
Sub vlap2()
Dim name As String, b As Long, i As Long, j As Long
Dim res(1 To 1048576, 1 To 1), LastRow As Long, ik As Long
LastRow = Range("H1048576").End(xlUp).Row
For ik = 1 To LastRow
name = Sheets("Sheet1").Range("H" & ik).Text
b = 1
For i = 0 To 9
    For j = 0 To 9
        b = b + 1
        res(b, 1) = name & i & j
    Next j
Next i
[A2].Resize(b) = res
Call ExportFile
Next ik
End Sub
 
Upvote 0
Hiện tại mình mượn code trên diễn đàn và tạo Form sau "KIEM KE"
1. Mình muốn nhập 1 lần từ 1 dòng hay 5 dòng hoặc tất cả các dòng trên Form
2. kiêm tra dùm nút sữa chữa bi lỗi gì
Private Sub CommandButton3_Click()
Dim curRow As Long
curRow = ListBox1.List(ListBox1.ListIndex, ListBox1.ColumnCount)
Sheets("nhaplieu").Cells(curRow, 2) = TextBox6.Value
Sheets("nhaplieu").Cells(curRow, 3) = TextBox2.Value
Sheets("nhaplieu").Cells(curRow, 4) = TextBox4.Value
Sheets("nhaplieu").Cells(curRow, 5) = TextBox5.Value
End Sub


Private Sub CommandButton4_Click()
Unload UserForm2
End Sub
Private Sub ListBox1_Change()
If ListBox1.ListIndex <> -1 Then
TextBox6.Value = ListBox1.List(ListBox1.ListIndex, 0)
TextBox2.Value = ListBox1.List(ListBox1.ListIndex, 1)
TextBox4.Value = ListBox1.List(ListBox1.ListIndex, 2)
TextBox5.Value = ListBox1.List(ListBox1.ListIndex, 3)
End If
End Sub


Private Sub TextBox1_AfterUpdate()
Dim Arr(), Darr(), i As Long, k As Long, j As Integer, r As Long
Arr = Sheets("nhaplieu").Range("A6:H" & Sheets("nhaplieu").Range("B65536").End(xlUp).Row).Value
ReDim Preserve Arr(1 To UBound(Arr, 1), 1 To UBound(Arr, 2) + 1)
For r = 1 To UBound(Arr, 1)
Arr(r, 9) = r + 5
Next r
ReDim Darr(1 To UBound(Arr, 1), 1 To UBound(Arr, 2))
For i = 1 To UBound(Arr, 1)
If Arr(i, 1) = Val(TextBox1.Value) Then
k = k + 1
Darr(k, 1) = Arr(i, 2)
For j = 2 To UBound(Darr, 2) - 1
Darr(k, j) = Arr(i, j + 1)
Next j
End If
Next i
ListBox1.List = Darr
End Sub

do up file nhieu qua khong cho up
các anh co biet cach nao xoa khong
các anh GPE sữa dùm luôn nha.
 
Upvote 0
Hiện tại mình mượn code trên diễn đàn và tạo Form sau "KIEM KE"
1. Mình muốn nhập 1 lần từ 1 dòng hay 5 dòng hoặc tất cả các dòng trên Form
2. kiêm tra dùm nút sữa chữa bi lỗi gì
....

do up file nhieu qua khong cho up
các anh co biet cach nao xoa khong
...

bạn vào kiểm tra/ xử lý hết các File đã Up lên diễn đàn theo các bước sau:

B1.png

bên tay trái, phía dưới

B2.jpg

B3.jpg

'------
nếu file quan trọng (đang hỏi) thì bạn Up tạm lên MediaFire, sau đó lấy đường Link thay thế File đính kèm đó
 
Upvote 0
Hiện tại mình mượn code trên diễn đàn và tạo Form sau "KIEM KE"
1. Mình muốn nhập 1 lần từ 1 dòng hay 5 dòng hoặc tất cả các dòng trên Form
2. kiêm tra dùm nút sữa chữa bi lỗi gì
Private Sub CommandButton3_Click()
Dim curRow As Long
curRow = ListBox1.List(ListBox1.ListIndex, ListBox1.ColumnCount)

.....

Bạn nên cho phần code (sub) vào trong tag
Mã:
 bằng cách bấm vào nút # trên khung trả lời (ở diễn đàn) khi viết bài

Còn upFile như bài trên [URL="http://www.giaiphapexcel.com/forum/member.php?853099-phucbugis"][B][B]phucbugis[/B][/B][/URL] đã nói, chắc file dung lượng to, thì up lên media file rui đưa link ra đây. vì trông vào code không khó đoán
 
Upvote 0
em viết code như thế này:
range("a3").copy
destination:= range("d5:f8")
không biết sai chổ nào mà bao lổi. pac nào biết chỉ dùm.!
 
Upvote 0
Bạn nên cho phần code (sub) vào trong tag
Mã:
 bằng cách bấm vào nút # trên khung trả lời (ở diễn đàn) khi viết bài

Còn upFile như bài trên [URL="http://www.giaiphapexcel.com/forum/member.php?853099-phucbugis"][B][B]phucbugis[/B][/B][/URL] đã nói, chắc file dung lượng to, thì up lên media file rui đưa link ra đây. vì trông vào code không khó đoán[/QUOTE]
Chỉnh sửa dùm code nhập liệu
Mình muốn nhập 1 lần từ 5 dòng hay 8 dòng hay tất cả
 
Upvote 0
Chỉnh sửa dùm code nhập liệu
Mình muốn nhập 1 lần từ 5 dòng hay 8 dòng hay tất cả
bài của bạn chắc phải làm lại từ đầu (thiết kế lại cái Form) ---> ngồi sửa code theo yêu cầu trên chắc "chết" --=0

tmpForm.jpg

bạn tham khảo cách làm trong file mẫu thử nhé !
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
giúp em hoàn thiện hơn đoạn cod về mảng trên

sArr1 = Sheets("Sheet1").Range("A2:B1048576").Value

Đoạn cod trên nói là chọn mảng từ ô A2 đến ô B1048576.
Bây giờ em muốn chọn từ ô A2 đến ô cuối cùng có giá trị của Cột B thì em sửa đoạn cod trên như thế nào?
Mong sớm giúp đỡ.
 
Upvote 0
sArr1 = Sheets("Sheet1").Range("A2:B1048576").Value

Đoạn cod trên nói là chọn mảng từ ô A2 đến ô B1048576.
Bây giờ em muốn chọn từ ô A2 đến ô cuối cùng có giá trị của Cột B thì em sửa đoạn cod trên như thế nào?
Mong sớm giúp đỡ.
Theo kiểu liều 1 chút
PHP:
With Sheets("Sheet1")
            sArr1 = .Range(.[A2], .[B1048576].End(3)).Value
End With
 
Upvote 0
Rút gọn code tách chuỗi

Mình có viết một code tách chuỗi là một dãy số kết quả ra đúng như mong muốn. nhưng nhìn vào code thấy nó dài dòng hoa cả mắt... Mình úp lên đây nhờ các bạn xem có cách nào khác viết xúc tích ngắn gọn và dễ hiểu hơn không chỉ dùm cho mình học với
xin cảm ơn
PHP:
Sub Tach_Chuoi()
Dim nguon(), R(1 To 65536, 1 To 1), L(1 To 65536, 1 To 1), i As Long
With Sheet1
    nguon = .Range(.[D4], .[D65536].End(3)).Value
End With
For i = 1 To UBound(nguon, 1)
    R(i, 1) = nguon(i, 1)
    L(i, 1) = nguon(i, 1)
        R(i, 1) = Replace(Replace(R(i, 1), " ", ""), ".", "")
        L(i, 1) = Replace(Replace(R(i, 1), " ", ""), ".", "")
    R(i, 1) = Left(R(i, 1), 4)
    L(i, 1) = Right(L(i, 1), 6)
Next i
With Sheet1
    .Range("E4:F15000").ClearContents
    .Range("E4").Resize(i) = R
    .Range("F4").Resize(i) = L
End With
End Sub
 

File đính kèm

Upvote 0
Mình có viết một code tách chuỗi là một dãy số kết quả ra đúng như mong muốn. nhưng nhìn vào code thấy nó dài dòng hoa cả mắt... Mình úp lên đây nhờ các bạn xem có cách nào khác viết xúc tích ngắn gọn và dễ hiểu hơn không chỉ dùm cho mình học với
xin cảm ơn
PHP:
Sub Tach_Chuoi()
Dim nguon(), R(1 To 65536, 1 To 1), L(1 To 65536, 1 To 1), i As Long
With Sheet1
    nguon = .Range(.[D4], .[D65536].End(3)).Value
End With
For i = 1 To UBound(nguon, 1)
    R(i, 1) = nguon(i, 1)
    L(i, 1) = nguon(i, 1)
        R(i, 1) = Replace(Replace(R(i, 1), " ", ""), ".", "")
        L(i, 1) = Replace(Replace(R(i, 1), " ", ""), ".", "")
    R(i, 1) = Left(R(i, 1), 4)
    L(i, 1) = Right(L(i, 1), 6)
Next i
With Sheet1
    .Range("E4:F15000").ClearContents
    .Range("E4").Resize(i) = R
    .Range("F4").Resize(i) = L
End With
End Sub
Hên xui nha
PHP:
Sub Tach_Chuoi()
Dim nguon(), i As Long
With Sheet1
   nguon = .Range(.[D4], .[D65536].End(3)).Value
   ReDim Preserve nguon(1 To UBound(nguon), 1 To 3)
   With CreateObject("VBScript.RegExp")
      .Global = True
      .Pattern = "\D"
      For i = 1 To UBound(nguon, 1)
         nguon(i, 2) = Left(.Replace(nguon(i, 1), ""), 4)
         nguon(i, 3) = Right(.Replace(nguon(i, 1), ""), 6)
      Next i
   End With
   .Range("E4:F65536").ClearContents
   .Range("D4:F4").Resize(i - 1) = nguon
End With
End Sub
Hoặc là
PHP:
Sub Tach_Chuoi()
Dim nguon(), i As Long
With Sheet1
   .Range("E4:F65536").ClearContents
   nguon = .Range(.[D4], .[D65536].End(3)).Resize(, 3).Value
   With CreateObject("VBScript.RegExp")
      .Global = True
      .Pattern = "\D"
      For i = 1 To UBound(nguon, 1)
         nguon(i, 2) = Left(.Replace(nguon(i, 1), ""), 4)
         nguon(i, 3) = Right(.Replace(nguon(i, 1), ""), 6)
      Next i
   End With
   .Range("D4:F4").Resize(i - 1) = nguon
End With
End Sub
Muốn gọn hơn thì dùng hàm
PHP:
Function TachChuoi(ByVal cell As String, dk As String) As String
   Dim tam As String
   With CreateObject("VBScript.RegExp")
      .Global = True
      .Pattern = "\D"
      tam = .Replace(cell, "")
      TachChuoi = IIf(dk = "L", Left(tam, 4), Right(tam, 6))
   End With
End Function
Cú pháp =tachchuoi(D4,"L") hoặc =tachchuoi(D4,"R")
 
Lần chỉnh sửa cuối:
Upvote 0
Hên xui nha
PHP:
Sub Tach_Chuoi()
Dim nguon(), i As Long
With Sheet1
   nguon = .Range(.[D4], .[D65536].End(3)).Value
   ReDim Preserve nguon(1 To UBound(nguon), 1 To 3)
   With CreateObject("VBScript.RegExp")
      .Global = True
      .Pattern = "\D"
      For i = 1 To UBound(nguon, 1)
         nguon(i, 2) = Left(.Replace(nguon(i, 1), ""), 4)
         nguon(i, 3) = Right(.Replace(nguon(i, 1), ""), 6)
      Next i
   End With
   .Range("E4:F65536").ClearContents
   .Range("D4:F4").Resize(i - 1) = nguon
End With
End Sub
Hoặc là
PHP:
Sub Tach_Chuoi()
Dim nguon(), i As Long
With Sheet1
   .Range("E4:F65536").ClearContents
   nguon = .Range(.[D4], .[D65536].End(3)).Resize(, 3).Value
   With CreateObject("VBScript.RegExp")
      .Global = True
      .Pattern = "\D"
      For i = 1 To UBound(nguon, 1)
         nguon(i, 2) = Left(.Replace(nguon(i, 1), ""), 4)
         nguon(i, 3) = Right(.Replace(nguon(i, 1), ""), 6)
      Next i
   End With
   .Range("D4:F4").Resize(i - 1) = nguon
End With
End Sub
Muốn gọn hơn thì dùng hàm
PHP:
Function TachChuoi(ByVal cell As String, dk As String) As String
   Dim tam As String
   With CreateObject("VBScript.RegExp")
      .Global = True
      .Pattern = "\D"
      tam = .Replace(cell, "")
      TachChuoi = IIf(dk = "L", Left(tam, 4), Right(tam, 6))
   End With
End Function
Cú pháp =tachchuoi(D4,"L") hoặc =tachchuoi(D4,"R")
hàm thì em có hai hàm này rồi. em úp lên chủ yếu tham khảo nhiều cách viết để học thôi.
PHP:
Function LAY6SO(Cll As Range)
With CreateObject("vbscript.regexp")
    .Global = True
    .Pattern = "\D"
    LAY6SO = Right(.Replace(Cll, ""), 6)
End With
End Function
PHP:
Function LAY4SO(Cll As Range)
With CreateObject("vbscript.regexp")
    .Global = True
    .Pattern = "\D"
    LAY4SO = Left(.Replace(Cll, ""), 4)
End With
End Function
vậy là cùng một vấn đề ta có nhiều cách giải quyết khác nhau..
hôm nay em thật sự hiểu thêm một cách viết nữa đó là sử dung "ReDim Preserve nguon(1 To UBound(nguon), 1 To 3) "
Thanks Anh nhiều... Học được rất nhiều từ bài viết của Anh
 
Upvote 0
Sửa lỗi hàm Function trong VBA

Các anh chị ơi, em đang mày mò học VBA và có viết 1 hàm này mà sao trong Excel nó không chạy, không biết nó có lỗi gì không nữa, mong các anh chị giúp em với.

Option Explicit
Function ctc() As Double
Dim a As Double
Dim b As Double
ctc = a + b
End Function

Em xin cám ơn lắm lắm.
 
Upvote 0
Các anh chị ơi, em đang mày mò học VBA và có viết 1 hàm này mà sao trong Excel nó không chạy, không biết nó có lỗi gì không nữa, mong các anh chị giúp em với.

Option Explicit
Function ctc() As Double
Dim a As Double
Dim b As Double
ctc = a + b
End Function

Em xin cám ơn lắm lắm.

Bạn nói hàm không chạy là không đúng! Nó vẫn chạy, có điều kết quả luôn =0. Cũng đúng thôi! Có truyền tham số gì cho a và b đâu mà tính toán được
 
Upvote 0
Các anh chị ơi, em đang mày mò học VBA và có viết 1 hàm này mà sao trong Excel nó không chạy, không biết nó có lỗi gì không nữa, mong các anh chị giúp em với.

Option Explicit
Function ctc() As Double
Dim a As Double
Dim b As Double
ctc = a + b
End Function

Em xin cám ơn lắm lắm.
Chuyển khai báo a, b vào trong () của hàm là được
 
Upvote 0
Các anh chị ơi, em đang mày mò học VBA và có viết 1 hàm này mà sao trong Excel nó không chạy, không biết nó có lỗi gì không nữa, mong các anh chị giúp em với.

Option Explicit
Function ctc() As Double
Dim a As Double
Dim b As Double
ctc = a + b
End Function

Em xin cám ơn lắm lắm.
Viết kỳ quá sao chạy được trời. Có tệ lắm cũng phải vầy
PHP:
Function ctc(a, b)
ctc = a + b
End Function
Sub main()
MsgBox ctc(5, 10)
End Sub
 
Upvote 0
Các anh chị ơi, em đang mày mò học VBA và có viết 1 hàm này mà sao trong Excel nó không chạy, không biết nó có lỗi gì không nữa, mong các anh chị giúp em với.

Option Explicit
Function ctc() As Double
Dim a As Double
Dim b As Double
ctc = a + b
End Function

Em xin cám ơn lắm lắm.

Hàm của bạn hoàn toàn hợp lệ. Chỉ có điều vô dụng thôi. Và do bạn không gán giá trị cho a , b nên chúng có giá trị = 0, do vậy hàm của bạn luôn trả về kết quả 0
----------
Function luôn trả về giá trị còn Sub không trả về giá trị. Đó là đặc trưng, là đòi hỏi cần có duy nhất. Còn mọi chuyên khác là tuỳ ý. Tức Sub có thể làm một loạt chuyện có ích và vô ích (không cấm), còn Function có thể làm một loạt chuyện có ích và vô ích (không cấm) và trả về giá trị nào đó.
Mã:
Sub hichic()
    một loạt chuyện có ích và vô ích
End Sub

Function bla() as ABC
    một loạt chuyện có ích và vô ích
...
    bla = xyz    <-- A
End Function

Tất nhiên ở trên hàm trả về giá trị một cách ... tường minh (???). Nếu không có <-- A thì hàm trả về giá trị 0, "", Empty ... tùy theo typ ABC.

Đó là "đòi hỏi" tối thiểu. Tham số không bắt buôc. Nhưng tham số được phép.

Việc chuyển a, b thành tham số chưa hẳn là thế. Tùy vào cái bạn định làm. Do bạn không nói a, b lấy từ đâu nên tôi xét 2 phương án.

1. a, b là tỷ giá trong ngày hiện hành của ngân hàng A và B. Và bạn muốn tính tỷ giá trung bình. Thế thì chả tham số gì cả
Mã:
Function bla() As Double
Dim a as Double, b As Double
... kết nối với trang của A và tải tỷ giá a = abc
... kết nối với trang của B và tải tỷ giá b = xyz
... kết nối với trang C và đọc nhiệt độ trong ngày, làm để giết thời gian hoặc 
để ghi ra "Sổ theo dõi"
    bla = (a + b) / 2
End Function

Nếu có "kết nối với trang C" thì là "1 công đôi việc". Tuy không có tham số nào cả nhưng rõ ràng mỗi lần gọi hàm thì nó có thể trả về những giá trị khác nhau do tỷ giá thay đổi.

2. a, b là số điểm nào đó tích lũy được của học sinh (hs) cụ thể trong học kỳ I và II. Và bạn muốn tính tổng số điểm cả năm. Thế thì phải truyền tham số a, b để tính cho từng hs cụ thể.
Mã:
Function bla(ByVal a As Double, ByVal b As Double) As Double
... kết nối với trang C và đọc nhiệt độ trong ngày, làm để giết thời gian hoặc 
để ghi ra "Sổ theo dõi"
    bla = a + b
End Function

Nếu có "kết nối với trang C" thì là "1 công đôi việc"

Về ByVal hay ByRef thì bạn tự đọc. Tôi chỉ muốn tiết lộ một điểm. Có những lúc "bắt buộc" phải là ByRef. Vd. mảng (tham số truyền với tư cách "mảng", tức Arr() As Long hoặc Arr(). Nếu chỉ là Arr thì Arr đơn giản chỉ là 1 Variant. Nhưng khi gọi hàm thì có thể truyền mảng vào chỗ Arr) luôn được truyền ByRef. Kiểu dữ liệu người dùng (UDT) luôn được truyền ByRef.

Function / Sub không bắt buộc phải làm 1 việc mà có thể làm 1000 việc, thậm chí 1000 việc đều thuộc loại "vô ích". Không có cấm đoán gì ở đây. Thậm chí Function / Sub không phải làm cái gì cả.
Code
Mã:
Sub hichic()

End Sub

Function bla(ByVal a As String) As String
   
End Function

Sub test()
Dim s As String
    s = "hic hic"
    hichic
    MsgBox bla(s)
End Sub

là hoàn toàn hợp lệ, và hichic cũng như bla có đầy đủ tư cách như những sub / function khác để đeo huy hiệu sub / function.

Việc viết code như thế nào, tính toán gì hay không tính toán gì là tùy vào bạn.
 
Lần chỉnh sửa cuối:
Upvote 0
Mình xin cảm ơn tất cả các comment có thiện chí. đã bấm thanks.
 
Upvote 0
Nhờ Chỉnh Sửa, Bổ Sung Thêm Code

Mình có viết hai code khi copy dữ liệu sang bên nối đuôi nhau liên tiếp xuống xong thì loc duy nhất luôn...hiện chạy rất tốt kết quả ra đúng như mong muốn....
Nhưng phát sinh một điều mà mình chưa làm được khi mình cập nhật giá ở bên nguồn thì giá bên kết quả cũng cập nhật theo khi chạy code....cứ loanh quanh vậy hoài mà chưa nghĩ ra được Mong các Bạn trợ giúp
#Có bao giờ mình có 5 con Bò ngồi trên lưng một con... quay lại đếm tới kiểm lui mà vẫn chỉ có 4 con thôi không >>>???
PHP:
Sub Luu_Ban() 'Copy nhung so da ban luu ghi nho
Dim Nguon(), kq(1 To 65536, 1 To 4), i As Long, j As Long
With Sheet1
   Nguon = .Range("D4", .[D65536].End(3)).Resize(, 4).Value
For i = 1 To UBound(Nguon, 1)
    For j = 1 To 4
        kq(i, 1) = Nguon(i, 1)
        kq(i, j) = Nguon(i, 4)
    Next j
Next i
.[L65536].End(3)(2).Resize(i - 1, 2) = kq
.[N65536].End(3)(2).Resize(i - 1, 1) = Format(Now, "dd/mmm/yyyy")
End With
   Call Loc_DN_Luu
End Sub

Sub Loc_DN_Luu() 'Loc duy nhat nhung so da luu
Dim Nguon(), kq(1 To 65536, 1 To 3), i As Long, k As Long
With Sheet1
    Nguon = .Range(.[L4], .[N65536].End(3)).Value
With CreateObject("scripting.dictionary")
    For i = 1 To UBound(Nguon)
        If Not .exists(Nguon(i, 1)) Then
            k = k + 1
            .Add Nguon(i, 1), ""
            kq(k, 1) = Nguon(i, 1)
            kq(k, 2) = Nguon(i, 2)
            kq(k, 3) = Nguon(i, 3)
        End If
    Next
End With
    .Range("L4:N65536").ClearContents
    .Range("L4").Resize(k, 3) = kq
End With
End Sub
 

File đính kèm

Upvote 0
Mình có viết hai code khi copy dữ liệu sang bên nối đuôi nhau liên tiếp xuống xong thì loc duy nhất luôn...hiện chạy rất tốt kết quả ra đúng như mong muốn....
Nhưng phát sinh một điều mà mình chưa làm được khi mình cập nhật giá ở bên nguồn thì giá bên kết quả cũng cập nhật theo khi chạy code....cứ loanh quanh vậy hoài mà chưa nghĩ ra được Mong các Bạn trợ giúp
#Có bao giờ mình có 5 con Bò ngồi trên lưng một con... quay lại đếm tới kiểm lui mà vẫn chỉ có 4 con thôi không >>>???
Tách ra 2 sự kiện:
1/ KHi cập nhật giá từng mặt hàng bằng cái này:
[GPECODE=vb]Private Sub Worksheet_Change(ByVal Target As Range)
Dim Ma As String, Rng As Range, Cll As Range
Set Rng = Range([L4], [L4].End(xlDown))
If Not Intersect(Target, [G4:G1000]) Is Nothing Then
If Target.Rows.Count = 1 Then
Ma = Target.Offset(, -3).Value
For Each Cll In Rng
If Cll.Value = Ma Then
Cll.Offset(, 1).Value = Target.Value
Cll.Offset(, 2) = Date
Exit For
End If
Next Cll
End If
End If
Set Rng = Nothing
End Sub[/GPECODE]
Khi muốn chép nối thêm vào và lọc duy nhất theo mã hàng thì cho chạy Sub này:
[GPECODE=vb]Public Sub Ghep()
Dim Dic As Object, sArr1(), sArr2(), dArr(), I As Long, J As Long, K As Long, Tem As String
Set Dic = CreateObject("Scripting.Dictionary")
sArr2 = Range([L4], [L4].End(xlDown)).Resize(, 3).Value
sArr1 = Range([D4], [D4].End(xlDown)).Resize(, 4).Value
ReDim dArr(1 To UBound(sArr1, 1) + UBound(sArr2, 1), 1 To 3)
For I = 1 To UBound(sArr2, 1)
Tem = sArr2(I, 1)
If Not Dic.exists(Tem) Then
K = K + 1
Dic.Add Tem, Empty
For J = 1 To 3
dArr(K, J) = sArr2(I, J)
Next J
End If
Next I
For I = 1 To UBound(sArr1, 1)
Tem = sArr1(I, 1)
If Not Dic.exists(Tem) Then
K = K + 1
dArr(K, 1) = sArr1(I, 1)
dArr(K, 2) = sArr1(I, 4)
dArr(K, 3) = Date
End If
Next I
[L4].Resize(K, 3) = dArr
End Sub[/GPECODE]
 
Upvote 0
Tách ra 2 sự kiện:
1/ KHi cập nhật giá từng mặt hàng bằng cái này:
[GPECODE=vb]Private Sub Worksheet_Change(ByVal Target As Range)
Dim Ma As String, Rng As Range, Cll As Range
Set Rng = Range([L4], [L4].End(xlDown))
If Not Intersect(Target, [G4:G1000]) Is Nothing Then
If Target.Rows.Count = 1 Then
Ma = Target.Offset(, -3).Value
For Each Cll In Rng
If Cll.Value = Ma Then
Cll.Offset(, 1).Value = Target.Value
Cll.Offset(, 2) = Date
Exit For
End If
Next Cll
End If
End If
Set Rng = Nothing
End Sub[/GPECODE]
Khi muốn chép nối thêm vào và lọc duy nhất theo mã hàng thì cho chạy Sub này:
[GPECODE=vb]Public Sub Ghep()
Dim Dic As Object, sArr1(), sArr2(), dArr(), I As Long, J As Long, K As Long, Tem As String
Set Dic = CreateObject("Scripting.Dictionary")
sArr2 = Range([L4], [L4].End(xlDown)).Resize(, 3).Value
sArr1 = Range([D4], [D4].End(xlDown)).Resize(, 4).Value
ReDim dArr(1 To UBound(sArr1, 1) + UBound(sArr2, 1), 1 To 3)
For I = 1 To UBound(sArr2, 1)
Tem = sArr2(I, 1)
If Not Dic.exists(Tem) Then
K = K + 1
Dic.Add Tem, Empty
For J = 1 To 3
dArr(K, J) = sArr2(I, J)
Next J
End If
Next I
For I = 1 To UBound(sArr1, 1)
Tem = sArr1(I, 1)
If Not Dic.exists(Tem) Then
K = K + 1
dArr(K, 1) = sArr1(I, 1)
dArr(K, 2) = sArr1(I, 4)
dArr(K, 3) = Date
End If
Next I
[L4].Resize(K, 3) = dArr
End Sub[/GPECODE]
Chính xác tuyệt đối Anh Ba Tê
Thanks Anh Nhiều
 
Upvote 0
Giải thích mã vba

Function congdon() As Long
Static s
s
= s + Range("A1").Value
congdon
= s
End
Function
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
If
Not Intersect(Target, [A1]) Is Nothing Then
Range
("B1").Value = congdon
End
If
End Sub
mọi người cho em hỏi.em muốn sử dụng cộng dồn A1 thi kết quả với B1 rồi.còn em muốn với nhiều ô khác như,A2 với B2,và A3 với B3 và tiếp tục nữa thì làm sao
em xin cảm ơn
 
Upvote 0
có ai biết không giúp em với

không biết là tiêu đề của bạn như vậy có được coi là rỏ ràng không. nếu ko rỏ ràng thì có thể bị khóa

bạn có thể giải thích thêm cộng dồn là sao không?
thí dụ tôi gõ
A1=5==>B1=5
tiếp tục gõ
A1=5==>B1=10?
vậy phải không?
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, [A1:A10]) Is Nothing Then Target.Offset(, 1) = Target + Target.Offset(, 1)

End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)If Not Intersect(Target, [A1:A10]) Is Nothing Then Target.Offset(, 1) = Target + Target.Offset(, 1)
 End Sub
em mới xin được cái này mà em muốn làm nhiều ô như vậy trong 1 sheet thi phải làm sao
Ví dụ em cộng ô A2 ra kết quả C2 và e muốn làm thêm ô D2 ra kết quả Ô E2 thì phải làm sao anh
bên trên chỉ làm nhập ô A1:A10 cộng ở ô B1:B10 thui
 
Upvote 0
copy cả dòng IF NOT...
passte lại, tức là có tất cả 2 dòng
ở dòng thứ 2, sửa A1:A10 thành D1:D10 (hoặc D2, nếu chỉ muôn D2 thôi, khác D khác không làm)
 
Upvote 0
các anh ơi em muốn hỏi 1 câu nữa em có cái mã
Mã:
[B]Private Sub Worksheet_Change(ByVal Target As Range)[/B]
[B]If Not Intersect(Target, [B1:B10]) Is Nothing Then Target.Offset(, 1) = Target + Target.Offset(, 1)[/B]
[B]End Sub[/B]
nhưng em copy những số tài liệu ở các file khác thì nó báo lỗi như vậy là sao mấy anh
em gửi ảnh báo lối cho các bac giúp e nha


Em muốn hỏi 1 câu nữa
Là có cách nào mà cho đường chuyền từ những con số từ ô khác qua B1:B1 rồi kết quả ở C1:C2 tự cộng dồn lên không ạ
 

File đính kèm

  • 1.jpg
    1.jpg
    42 KB · Đọc: 39
Upvote 0
các anh ơi em muốn hỏi 1 câu nữa em có cái mã
Mã:
[B]Private Sub Worksheet_Change(ByVal Target As Range)[/B]
[B]If Not Intersect(Target, [B1:B10]) Is Nothing Then Target.Offset(, 1) = Target + Target.Offset(, 1)[/B]
[B]End Sub[/B]
nhưng em copy những số tài liệu ở các file khác thì nó báo lỗi như vậy là sao mấy anh
em gửi ảnh báo lối cho các bac giúp e nha


Em muốn hỏi 1 câu nữa
Là có cách nào mà cho đường chuyền từ những con số từ ô khác qua B1:B1 rồi kết quả ở C1:C2 tự cộng dồn lên không ạ

chắc là bạn gõ sai cú pháp dòng lệnh nào đó, cái bảng thông báo lổi nó che mất mấy dòng lệnh nên tôi ko đọc được
bạn nhấn cái nút "Debug" xem nó báo lổi ở dòng nào?
ko được nữa thì up cái file bị lổi lên.

câu hỏi màu đỏ thì ko hiểu bạn hỏi cái gì?
 
Upvote 0
e không gõ mà em Paste nguyên 1 cột lun ,em tim ra là em paste 1 ô vào trong [B1:B10] thì được, còn em paste nhiều ô vào trong khoảng đó thì nó báo lỗi như vậy.
có cách nào khắc phục được ko anh Gấu
 
Lần chỉnh sửa cuối:
Upvote 0
Mã:
[B]Private Sub Worksheet_Change(ByVal Target As Range)
[/B][B]If Not Intersect(Target, [B1:B10]) Is Nothing Then Target.Offset(, 1) = Target + Target.Offset(, 1)
[/B] [B]End Sub[/B]
có ai không giúp em với làm sao có thể paste dữ liệu từ nơi khác vào [B1:B10] mà không bị lỗi như thê vậy.
mã ở trên chỉ cho paste 1 ô thôi.em xin cảm ơn
 
Lần chỉnh sửa cuối:
Upvote 0
Mã:
[B]Private Sub Worksheet_Change(ByVal Target As Range)
[/B][B]If Not Intersect(Target, [B1:B10]) Is Nothing Then Target.Offset(, 1) = Target + Target.Offset(, 1)
[/B] [B]End Sub[/B]
có ai không giúp em với làm sao có thể paste dữ liệu từ nơi khác vào [B1:B10] mà không bị lỗi như thê vậy.
mã ở trên chỉ cho paste 1 ô thôi.em xin cảm ơn

thử xem
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim cll As Range
If Not Intersect(Target, [B1:B10]) Is Nothing Then
    For Each cll In Target
        cll.Offset(, 1) = cll + cll.Offset(, 1)
    Next
End If
End Sub
 
Upvote 0
anh Gấu ơi nếu em muốn thêm 1 cột [F1:F10] trong mã này nữa thì cần copy đoạn mã nào và sửa vậy anh
em cảm ơn
 
Upvote 0
anh Gấu ơi nếu em muốn thêm 1 cột [F1:F10] trong mã này nữa thì cần copy đoạn mã nào và sửa vậy anh
em cảm ơn

Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim cll As Range
If Not Intersect(Target, Union([B1:B10], [f1:f10])) Is Nothing Then
    For Each cll In Target
        cll.Offset(, 1) = cll + cll.Offset(, 1)
    Next
End If
End Sub
 
Upvote 0
muốn thêm 2 hay 3 cột như [F1:F10] thì cứ thêm dấu phẩy và thêm như a sửa là được phải ko anh Gấu.cảm ơn a nha
 
Upvote 0
Em có tìm kiếm phương thức Sort GPE nhưng không thấy.
Các anh chị giải thích về các thông số của phương thức Sort như trong hcho em với!!
Em xin cảm ơn! /-*+/
 

File đính kèm

  • Snap6.jpg
    Snap6.jpg
    32.8 KB · Đọc: 44
Upvote 0
Em có tìm kiếm phương thức Sort GPE nhưng không thấy.
Các anh chị giải thích về các thông số của phương thức Sort như trong hcho em với!!
Em xin cảm ơn! /-*+/
[TABLE="width: 100%"]
[TR]
[TD="align: left"][/TD]
[/TR]
[TR]
[TD="align: left"]Range.Sort Method[/TD]
[/TR]
[/TABLE]

Sorts a range of values. Syntax
expression.Sort(Key1, Order1, Key2, Type, Order2, Key3, Order3, Header, OrderCustom, MatchCase, Orientation, SortMethod, DataOption1, DataOption2, DataOption3)
expression A variable that represents a Range object.
Parameters
NameRequired/OptionalDescription

[TH="width: 10%"] Data Type [/TH]

[TD="class: mainsection"] Key1 [/TD]
[TD="class: mainsection"]Optional[/TD]
[TD="class: mainsection"] Variant [/TD]
[TD="class: mainsection"]Specifies the first sort field, either as a range name (String) or Range object; determines the values to be sorted.[/TD]

[TD="class: mainsection"] Order1 [/TD]
[TD="class: mainsection"]Optional[/TD]
[TD="class: mainsection"] XlSortOrder [/TD]
[TD="class: mainsection"]Determines the sort order for the values specified in Key1.[/TD]

[TD="class: mainsection"] Key2 [/TD]
[TD="class: mainsection"]Optional[/TD]
[TD="class: mainsection"] Variant [/TD]
[TD="class: mainsection"]Second sort field; cannot be used when sorting a pivot table.[/TD]

[TD="class: mainsection"] Type [/TD]
[TD="class: mainsection"]Optional[/TD]
[TD="class: mainsection"] Variant [/TD]
[TD="class: mainsection"]Specified which elements are to be sorted.[/TD]

[TD="class: mainsection"] Order2 [/TD]
[TD="class: mainsection"]Optional[/TD]
[TD="class: mainsection"] XlSortOrder [/TD]
[TD="class: mainsection"]Determines the sort order for the values specified in Key2.[/TD]

[TD="class: mainsection"] Key3 [/TD]
[TD="class: mainsection"]Optional[/TD]
[TD="class: mainsection"] Variant [/TD]
[TD="class: mainsection"]Third sort field; cannot be used when sorting a pivot table.[/TD]

[TD="class: mainsection"] Order3 [/TD]
[TD="class: mainsection"]Optional[/TD]
[TD="class: mainsection"] XlSortOrder [/TD]
[TD="class: mainsection"]Determines the sort order for the values specified in Key3.[/TD]

[TD="class: mainsection"] Header [/TD]
[TD="class: mainsection"]Optional[/TD]
[TD="class: mainsection"] XlYesNoGuess [/TD]
[TD="class: mainsection"]Specifies whether the first row contains header information. xlNo is the default value; specify xlGuess if you want Excel to attempt to determine the header.[/TD]

[TD="class: mainsection"] OrderCustom [/TD]
[TD="class: mainsection"]Optional[/TD]
[TD="class: mainsection"] Variant [/TD]
[TD="class: mainsection"]Specifies a one-based integer offset into the list of custom sort orders.[/TD]

[TD="class: mainsection"] MatchCase [/TD]
[TD="class: mainsection"]Optional[/TD]
[TD="class: mainsection"] Variant [/TD]
[TD="class: mainsection"]Set to True to perform a case-sensitive sort, False to perform non-case sensitive sort; cannot be used with pivot tables.[/TD]

[TD="class: mainsection"] Orientation [/TD]
[TD="class: mainsection"]Optional[/TD]
[TD="class: mainsection"] XlSortOrientation [/TD]
[TD="class: mainsection"]Specifies if the sort should be in acending or decending order.[/TD]

[TD="class: mainsection"] SortMethod [/TD]
[TD="class: mainsection"]Optional[/TD]
[TD="class: mainsection"] XlSortMethod [/TD]
[TD="class: mainsection"]Specifies the sort method.[/TD]

[TD="class: mainsection"] DataOption1 [/TD]
[TD="class: mainsection"]Optional[/TD]
[TD="class: mainsection"] XlSortDataOption [/TD]
[TD="class: mainsection"]Specifies how to sort text in the range specified in Key1; does not apply to pivot table sorting.[/TD]

[TD="class: mainsection"] DataOption2 [/TD]
[TD="class: mainsection"]Optional[/TD]
[TD="class: mainsection"] XlSortDataOption [/TD]
[TD="class: mainsection"]Specifies how to sort text in the range specified in Key2; does not apply to pivot table sorting.[/TD]

[TD="class: mainsection"] DataOption3 [/TD]
[TD="class: mainsection"]Optional[/TD]
[TD="class: mainsection"] XlSortDataOption [/TD]
[TD="class: mainsection"]Specifies how to sort text in the range specified in Key3; does not apply to pivot table sorting.[/TD]

 
Upvote 0
chào anh, em có đoạn code sau:
nghĩa là: khi nhập bất kỳ vào ô D10 thì: an 3 sheet con khong thi an 1 sheet nhưng khi chạy thì nó báo lỗi : "run time error 9, subscipt out of range"

mong các anh giúp em ạ (anh chị xem file đính kèm)

Private Sub Worksheet_Change(ByVal Target As Range)
If Not Application.Intersect(Target, [D10]) Is Nothing Then
If [D10] <> 0 Then
Sheets("wt").Visible = True
Sheets("Vibration Test").Visible = False
Sheets("Aux.Speed Adj.Unit").Visible = False
Sheets("7310 Controller record chart").Visible = False
Else
Sheets("wt").Visible = False
Sheets("Vibration Test").Visible = True
Sheets("Aux.Speed Adj.Unit").Visible = True
Sheets("7310 Controller record chart").Visible = True
End If
End If
End Sub
 
Upvote 0
chào anh, em có đoạn code sau:
nghĩa là: khi nhập bất kỳ vào ô D10 thì: an 3 sheet con khong thi an 1 sheet nhưng khi chạy thì nó báo lỗi : "run time error 9, subscipt out of range"

mong các anh giúp em ạ (anh chị xem file đính kèm)

Private Sub Worksheet_Change(ByVal Target As Range)
If Not Application.Intersect(Target, [D10]) Is Nothing Then
If [D10] <> 0 Then
Sheets("wt").Visible = True
Sheets("Vibration Test").Visible = False
Sheets("Aux.Speed Adj.Unit").Visible = False
Sheets("7310 Controller record chart").Visible = False
Else
Sheets("wt").Visible = False
Sheets("Vibration Test").Visible = True
Sheets("Aux.Speed Adj.Unit").Visible = True
Sheets("7310 Controller record chart").Visible = True
End If
End If
End Sub
Chẳng thấy cái file đính kèm của bạn đâu nên đoán bừa: Có thể hiện tại chỉ 1 mình sheet "wt" đang hiện, bây giờ bạn lại nhập số 0 vào ô D10, do đó phát sinh lỗi tại câu lệnh Sheets("wt").Visible = False vì nếu chạy câu này thì tất cả các sheet đều bị ẩn, bác Bill không chịu nên báo lỗi.
Cách khắc phục: Bạn cho câu lệnh này ra sau 1 trong 3 câu lệnh phía dưới để đảm bảo đã có ít nhất 1 sheet hiện rồi mới ẩn sheet "wt" này lại.
 
Upvote 0
em đã đổi Sheets("wt").Visible = False ra sau 3 câu lệnh phía dưới mà vẫn không được.
anh xem file theo link nầy ạ
http://www.mediafire.com/view/09c4i9xcdrqqjt5/Sample.xls
Trong file của bạn, tên sheet "Vibration Test" bị dư 1 dấu cách ở cuối, còn tên sheet "Aux.Speed Adj.Unit" thì dư 1 dấu cách ở đầu. Bạn xóa mấy cái dấu cách này đi là được, hoặc sửa trong code thành "Vibration Test " và " Aux.Speed Adj.Unit"
 
Upvote 0
Status
Không mở trả lời sau này.

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

Back
Top Bottom