Xin hướng dẫn tư duy VBA

Liên hệ QC

duonghychi

Thành viên mới
Tham gia
17/4/17
Bài viết
38
Được thích
3
Em chào các anh chị!
Em đang tập tành VBA, nhưng đang theo lối viết lại các code dễ hiểu để nhớ nên tư duy để giải quyết vấn đề thì trống rỗng ạ.
Em mong các anh chị hướng dẫn em chuyển công thức này sang VBA ạ, em cảm ơn!
Mã:
A4=IF(AND(COUNTIF($C$3:C4;C4)=1;NOT(LEFT(C4;2)="4-"));MAX($A$3:A3)+1;"")
Em muốn đánh số thứ tự ở sheets BOM với 2 diều kiện: Không trùng lặp và 2 ký tự đầu không phải là "4-"
Thanks
 

File đính kèm

Em chào các anh chị!
Em đang tập tành VBA, nhưng đang theo lối viết lại các code dễ hiểu để nhớ nên tư duy để giải quyết vấn đề thì trống rỗng ạ.
Em mong các anh chị hướng dẫn em chuyển công thức này sang VBA ạ, em cảm ơn!
Mã:
A4=IF(AND(COUNTIF($C$3:C4;C4)=1;NOT(LEFT(C4;2)="4-"));MAX($A$3:A3)+1;"")
Em muốn đánh số thứ tự ở sheets BOM với 2 diều kiện: Không trùng lặp và 2 ký tự đầu không phải là "4-"
Cảm ơn
Bạn viết code thay cho công thức này được chưa?
Mã:
=IF(B4="","",MAX($A$3:A3)+1)
 
Upvote 0
Em gọi 1 biến i, nếu " B4 rỗng" bỏ qua, ngược lại "i=i+1" next i
Như thế không biết có đúng không ạ, mong bác chỉ điểm thêm ạ
Bạn cụ thể hóa bằng code hoàn chỉnh rồi tự chạy thử xem sao. Mấy cái này hoàn toàn có thể tự kiểm tra mà.
 
Upvote 0
Bạn cụ thể hóa bằng code hoàn chỉnh rồi tự chạy thử xem sao. Mấy cái này hoàn toàn có thể tự kiểm tra mà.
Mã:
Sub CommandButton1_Click()
Dim i As Integer, j As Integer
i = 0
For j = 4 To 30000
If Sheet2.Cells(j, 2).Value <> "" Then
i = i + 1
Sheet2.Cells(j, 1).Value = i
End If
Next j

End Sub
Xin bác giúp đỡ ạ!
 
Upvote 0
Mã:
Sub CommandButton1_Click()
Dim i As Integer, j As Integer
i = 0
For j = 4 To 30000
If Sheet2.Cells(j, 2).Value <> "" Then
i = i + 1
Sheet2.Cells(j, 1).Value = i
End If
Next j

End Sub
Xin bác giúp đỡ ạ!
Bạn nghiên cứu viết dạng mảng thử xem.
 
Upvote 0
Xin bác chút hướng dẫn viết dạng mảng ạ. Em chưa biết gì về cái này ạ.
Bạn nên học cách sử dụng các cấu trúc, cú pháp,... trước.
Mã:
Sub CommandButton1_Click()
    Dim i As Integer, j As Integer
    Dim Mang1 As Variant
    Dim Mang2(1 To 1000, 1 To 1)
    Mang1 = Sheet2.Cells(4, 2).Resize(1000).Value
    i = 0
    For j = 1 To 1000
        If Mang1(j, 1) <> "" Then
            i = i + 1
            Mang2(j, 1) = i
        End If
    Next j
    Sheet2.Cells(4, 1).Resize(1000).Value = Mang2
End Sub
 
Upvote 0
Em cám ơn ạ!
Mã:
Sub CommandButton1_Click()
    Dim i As Integer, j As Integer
    Dim Mang1 As Variant
    Dim Mang2(1 To 1000, 1 To 1)
    Mang1 = Sheet2.Cells(4, 3).Resize(1000).Value
    i = 0
    For j = 1 To 1000
        If Mang1(j, 1) <> "" And Left(Mang1(j, 1), 2) <> "4-" Then
        
            i = i + 1
            Mang2(j, 1) = i
        End If
    Next j
    Sheet2.Cells(4, 1).Resize(1000).Value = Mang2
End Sub
Em đã làm được nếu rỗng và có ký tự đầu là "4-" sẽ bỏ qua không đánh số, còn với countif nữa, xin bác hướng dẫn ạ.
 
Upvote 0
Em cám ơn ạ!
Mã:
Sub CommandButton1_Click()
    Dim i As Integer, j As Integer
    Dim Mang1 As Variant
    Dim Mang2(1 To 1000, 1 To 1)
    Mang1 = Sheet2.Cells(4, 3).Resize(1000).Value
    i = 0
    For j = 1 To 1000
        If Mang1(j, 1) <> "" And Left(Mang1(j, 1), 2) <> "4-" Then
       
            i = i + 1
            Mang2(j, 1) = i
        End If
    Next j
    Sheet2.Cells(4, 1).Resize(1000).Value = Mang2
End Sub
Em đã làm được nếu rỗng và có ký tự đầu là "4-" sẽ bỏ qua không đánh số, còn với countif nữa, xin bác hướng dẫn ạ.
Trong trường hợp này, thông thường người ta sẽ dùng Dictionary (CreateObject("Scripting.Dictionary")) như một cuốn sổ để ghi lại và kiểm tra 1 mã đã xuất hiện hay chưa. Nó như vầy:
Mã:
Sub CommandButton1_Click()
    Dim i As Integer, j As Integer
    Dim Mang1 As Variant
    Dim Mang2(1 To 1000, 1 To 1)
    Dim Dic
    Set Dic = CreateObject("Scripting.Dictionary")
    Mang1 = Sheet2.Cells(4, 3).Resize(1000).Value
    i = 0
    For j = 1 To 1000
        If Mang1(j, 1) <> "" And Left(Mang1(j, 1), 2) <> "4-" Then
            If Not Dic.Exists(Mang1(j, 1)) Then 'Neu trong 'so theo doi' chua co ma nay thi
                i = i + 1
                Mang2(j, 1) = i
                Dic.Add Mang1(j, 1), True 'Ghi ma nay vao so theo doi
            End If
        End If
    Next j
    Set Dic = Nothing
    Sheet2.Cells(4, 1).Resize(1000).Value = Mang2
End Sub
 
Upvote 0
Bạn nói chuyện về "tư duy". Tư duy có hai giai đoạn. Gia đoạn thứ nhất là tìm hiểu vấn đề và đi tới một (hoặc vài) phương án để giải đáp vấn đề của mình. Giai đoạn thứ hai mới là đem (các) phương án ấy triển khai thành lập trình, tức là code.

Việc đầu tiên của "tìm hiểu vấn đề" là bạn phải biết phân biệt giữa cái mình "muốn" và cái mình "cần". Nếu bạn theo dõi các thớt "giúp viết code" ở đây sẽ thấy phần lớn các trường hợp là người hỏi chưa nắm vững được mình cần phải làm gì; cứ có ý tưởng gì đó thì nhảy lên nhờ giúp; đó là "muốn", chưa phải là "cần".

Bạn nên tự hỏi lại mình tại sao lại muốn đánh số như vậy?

1. Nếu nó là để chọn ra những mã hàng xuất hiện lần đầu tiên trong bảng thì bạ tự hỏi lại: có cách nào khác hay không? có cần phải đánh số?

2. Nếu nó chỉ là một ví dụ điển hình để bạn tập đọc và hiểu code thì nên nhờ ngừoi viết code giải thích tại sao lại dùng giải thuật ấy.
Nếu bạn không hỏi lại người viết code thì tất cả những "tư duy" mà bạn học được ở diễn đàn này chỉ bao gồm 2 điều chính:
(a) đổ dữ liệu từ bảng tính vào một mảng (hy vọng bạn đã hiểu mảng có nghĩa là gì); tính toán và chép ngược trở lại vào bảng tính.
(b) dùng một đối tượng dạng Dictionary để lọc dữ liệu.
Giải thutaaj trên rất hiệu quả nhưng chúng cũng rất mơ hồ. Có thể học rất nhanh nhưng sẽ bỏ qua nhiều cơ hội học căn bản.
 
Upvote 0
Trong trường hợp này, thông thường người ta sẽ dùng Dictionary (CreateObject("Scripting.Dictionary")) như một cuốn sổ để ghi lại và kiểm tra 1 mã đã xuất hiện hay chưa. Nó như vầy:
Mã:
Sub CommandButton1_Click()
    Dim i As Integer, j As Integer
    Dim Mang1 As Variant
    Dim Mang2(1 To 1000, 1 To 1)
    Dim Dic
    Set Dic = CreateObject("Scripting.Dictionary")
    Mang1 = Sheet2.Cells(4, 3).Resize(1000).Value
    i = 0
    For j = 1 To 1000
        If Mang1(j, 1) <> "" And Left(Mang1(j, 1), 2) <> "4-" Then
            If Not Dic.Exists(Mang1(j, 1)) Then 'Neu trong 'so theo doi' chua co ma nay thi
                i = i + 1
                Mang2(j, 1) = i
                Dic.Add Mang1(j, 1), True 'Ghi ma nay vao so theo doi
            End If
        End If
    Next j
    Set Dic = Nothing
    Sheet2.Cells(4, 1).Resize(1000).Value = Mang2
End Sub
Em cảm ơn ạ!
 
Upvote 0
Em đã làm được nếu rỗng và có ký tự đầu là "4-" sẽ bỏ qua không đánh số, còn với countif nữa, xin bác hướng dẫn ạ.
Nếu vẫn còn muốn tham khảo cách làm với COUNTIF() thì sẽ rùa bò & đây:
PHP:
Sub ThemSTTTheoDK()
 Dim Rws As Long, J As Long, W As Long, Dm As Integer
 Dim WF As Object, Arr()
 On Error Resume Next
 
 Rws = [B3].End(xlDown).Row:
 Set WF = Application.WorksheetFunction
 Arr() = [C1].Resize(4 + Rws).Value
 ReDim dArr(1 To Rws, 1 To 1) As String
 For J = 4 To UBound(Arr())
    If Arr(J, 1) = "" Then Exit For
    Dm = WF.CountIf(Range("C4:C" & J), Cells(J, "C").Value)
    If Left(Arr(J, 1), 2) <> "4-" Then
        If Dm < 2 Then
            W = W + 1:                  dArr(J, 1) = W
        Else
            dArr(J, 1) = Space(0)
        End If
    End If
 Next J
 [A1].Resize(J).Value = dArr()
End Sub
 
Upvote 0
Web KT

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

Back
Top Bottom