Người mới học VBA, gặp khó khăn: Cú pháp, lý luận, thuật toán trong VBA thì vào đây cùng học! (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

Cô Bé Dễ Thương

Thành viên thường trực
Tham gia
30/9/16
Bài viết
223
Được thích
48
Giới tính
Nữ
Các bạn cùng giống vấn đề như mình, xin hãy chỉ post bài tóm lược và trọng tâm nhất có thể (ngán nhất nhưng phải trọng tâm, xin cảm ơn)
Xin phép ban điều hành GPE cho cháu lập chủ đề này! Khi học VBA cháu thấy khó tìm và không tự nghĩ ra được cú pháp và lý luận dùng trong lập trình VBA.
Chăm đọc code cũng chỉ tìm hiểu được cú pháp và lý luận trong code nhưng đa phần là 50-50 không tìm thấy và nghĩ ra được. Vấn đề này quả là khó với người mới học code.
Mong chủ đề này được các bậc tiền bối chỉ dạy cho cháu(em) để có chút vốn để mày mò học code. Xin cảm ơn tất cả thật nhiều ạ!
(các bạn cùng giồng vấn đề như mình xin hãy post bài theo kiểu như mình ở dưới)
PHP:
Xin mở đầu bằng câu hỏi mà cháu(em) tìm kiếm mãi không thấy để bắt chước:
===================================================
Dim Rng1 as Range, Rng2 as Range, Rng4 as Range, Rng5 as Range
Dim rg as Range ,Rng as Range
===================================================
Cháu muốn gộp các bảng dữ liệu có cùng cấu trúc: Rng1, Rng2 , Rng3, Rng4, Rng5 thành 1 bảng. Mục đích để có thể dùng biến rg dùng vòng lặp For Each
duyệt từ Rng1 rồi đến Rng2 rồi đến Rng3 rồi đến Rng4 rồi đến Rng5. Hậu quả là phải viết ra 5 Sud để duyệt từng cái 1,nếu không gộp được các
Rng1,Rng2,Rng3,Rng4,Rng5 thành 1 bảng.
For Each rg In (Tất cả Rng1 và Rng2  và Rng3  và Rng4 và Rng5).Rows
................................................
Next rg
===================================================
Vậy cú pháp để cho biến rg duyệt "Tất cả các Rng1 và Rng2  và Rng3  và Rng4 và Rng5" trong một vòng lặp này là gì ạ?[CODE]
 
Lần chỉnh sửa cuối:
Khi tách 2 mảng thì mảng nào mảng nấy có ý nghĩa riêng: mã và số lượng. Chứ không phải cột đầu và cột cuối của 1 mảng
ColumnArr phải là = Array(2, 4, 7, 3, 5, 8, 2)
chứ không phải = Array(2, 4, 7, 3, 4, 6, 2)
---------
Phải chú ý khai báo biến, gán giá trị biến, ... khi sửa code chứ? Biến mới không khai báo thêm, biến cũ không dùng thì lại cứ gán giá trị. (ResizeArr)
------
Value và Value2: Trong 1 số trường hợp của kiểu dữ liệu, Value2 nhanh hơn Value 1 tẹo nhất là khi dữ liệu trên 50 ngàn dòng. Thôi đừng cố, tôi còn quên mất rồi chứ đừng nói là con vịt tắm nước sôi
Vịt hóa thiên nga ạ.
Vâng cháu sửa lại phần code bonus.
PHP:
Sub Dict_Episode_6_bonus()
Dim DataRw As Long, i As Long
Dim ColumnArr, sKey As String, RowArr, SheetArr, ResizeArr
Dim Dict, SArr(), RArr()
Set Dict = CreateObject("Scripting.Dictionary")
ResizeArr = Array(3, 5, 7, 2, 2, 3, 3)
ItemArr = Array(4, 8, 13, 4, 4, 6, 4)
ShArr = Array(2, 3, 4, 5, 6, 7, 8)
ColumnArr = Array(2, 4, 7, 3, 5, 8, 2)
RowArr = Array(7, 19, 10, 12, 17, 13, 6)
For Seq = 0 To 6
    With Sheets(ShArr(Seq))
        DataRw = .Cells(100000, ColumnArr(Seq)).End(xlUp).Row
        StoreCode = .Range(.Cells(RowArr(Seq), ColumnArr(Seq)), _
        .Cells(DataRw, ColumnArr(Seq))).Value2
        StoreQty = .Range(.Cells(RowArr(Seq), ItemArr(Seq)), _
        .Cells(DataRw, ItemArr(Seq))).Value2
        For i = 1 To UBound(StoreCode, 1)
            sKey = StoreCode(i, 1)
            If Not Dict.exists(sKey) Then
                Dict.Add sKey, StoreQty(i, 1)
            Else
                Dict.Item(sKey) = Dict.Item(sKey) + StoreQty(i, 1)
            End If
        Next
    End With
Next Seq
With Sheets("Data")
SArr = .Range(.Cells(3, 2), .Cells(1000000, 2).End(xlUp)).Value
ReDim RArr(1 To UBound(SArr, 1), 1 To 1)
For i = 1 To UBound(SArr, 1)
    If Dict.exists(SArr(i, 1)) Then
        RArr(i, 1) = Dict.Item(SArr(i, 1))
    Else
        RArr(i, 1) = 0
    End If
Next
.Range("D3:D1000").ClearContents
.Range("D3").Resize(UBound(SArr, 1), 1) = RArr
End With
End Sub
Kết quả 2 code: Dict_Episode_6 và Dict_Episode_6_bonus(với dữ liệu văng lung tung) đã giống kết quả của bác @Ba Tê (bài của bác đã sửa lại cấu trúc dữ liệu bằng tay)
Thêm bài nữa đi chú. Có dòng so le nhau nữa là đủ bộ "Dictionary VBA Bí Truyền"
 
Lần chỉnh sửa cuối:
Upvote 0
- Đặt tên theo quy định: Kiểu bài tập áp dụng Dictionary thứ 7
- (Tức thức thứ 7 trong "Dictionary Bí Truyền" kiểu này em đặt)
- Thức thứ 7 là cách gọi vui, nhằm đánh dấu rằng có một trường hợp: Các bảng nằm rải rác ở các Sheets, sau đó các cột trong bảng lại giãn ra đổi chiều thứ tự trước sau, sau đó các cột trong bản lại so le nhau. Nhưng vẫn sử dụng Dic được với hình ảnh xiên thịt nướng, xiên 1 nhát được 5 miếng thịt (ý nói 1 vòng For Seq = 0 to 6)
PHP:
Sub Dict_Episode_7()
Dim DataRw As Long, i As Long
Dim ColumnArr, sKey As String, RowArr, ShArr
Dim Dict, SArr(), RArr()
Set Dict = CreateObject("Scripting.Dictionary")
ShArr = Array(2, 3, 4, 5, 6, 7, 8)
ColumnArrCode = Array(2, 4, 7, 3, 12, 12, 2)
RowArrCode = Array(7, 19, 10, 12, 11, 8, 6)
ColumnArrQty = Array(8, 14, 20, 7, 4, 6, 7)
RowArrQty = Array(9, 7, 15, 4, 17, 13, 13)
For Seq = 0 To 6
    With Sheets(ShArr(Seq))
        DataRwCode = .Cells(1000000, ColumnArrCode(Seq)).End(xlUp).Row
        DataRwQty = .Cells(1000000, ColumnArrQty(Seq)).End(xlUp).Row
        StoreCode = .Range(.Cells(RowArrCode(Seq), ColumnArrCode(Seq)), _
        .Cells(DataRwCode, ColumnArrCode(Seq))).Value2
        StoreQty = .Range(.Cells(RowArrQty(Seq), ColumnArrQty(Seq)), _
        .Cells(DataRwQty, ColumnArrQty(Seq))).Value2
        For i = 1 To UBound(StoreCode, 1)
            sKey = StoreCode(i, 1)
            If Not Dict.exists(sKey) Then
                Dict.Add sKey, StoreQty(i, 1)
            Else
                Dict.Item(sKey) = Dict.Item(sKey) + StoreQty(i, 1)
            End If
        Next
    End With
Next Seq
With Sheets("Data")
SArr = .Range(.Cells(3, 2), .Cells(1000000, 2).End(xlUp)).Value
ReDim RArr(1 To UBound(SArr, 1), 1 To 1)
For i = 1 To UBound(SArr, 1)
    If Dict.exists(SArr(i, 1)) Then
        RArr(i, 1) = Dict.Item(SArr(i, 1))
    Else
        RArr(i, 1) = 0
    End If
Next
.Range("D3:D1000").ClearContents
.Range("D3").Resize(UBound(SArr, 1), 1) = RArr
End With
End Sub
- Từ người không biết về VBA với thời gian thực sự có học và đọc là 2 tuần,bảng tính Excel các hàm thì làm gì cũng Seach google là chính( nghĩa là chẳng nhớ gì, nói chung cũng gà gà). Nhưng cơ duyên thế nào mà gặp được chú Mỹ @ptm0412. Được người thầy là chuyên gia thiết kế phân tích phần mềm, lại là Smod của diễn đàn hàng đầu về lập trình VBA đã chỉ cho. Mình học từ chú mà không có một sự chuẩn bị lý thuyết nào, chỉ dựa vào các từ khóa trong code để tra ngược và tìm lý thuyết đó để đọc. Quá may mắn khi được là thành viên của diễn đàn và được chú chỉ cho.
- Với phần mềm Excel này khi nào bạn ngộ ra rằng: 1 Cells --> biến thành 1 đoạn thẳng --> biến thành hình chữ nhật --> thành đoạn thẳng --> thành 1 Cells thì lúc đó bạn mới có khả năng tự học và đọc hiểu tài liệu và bài tập(VBA), khi hiểu mới chế cháo tốt và có sáng tạo được.
- Nói vui theo phim chưởng thì. Dictionary như là ngoại công, còn Array như là nội công, còn ra được đòn Oánh người thì phải do cái hoạt động não bộ từng người!
- Dự báo rằng TOP này sẽ đặt 1 triệu Views trong vòng 1 năm và cùng với đó là diễn đàn có thêm nhiều thành viên mới. Các anh chị Youtuber rất thích những cái là lạ như này để ra video, xin hãy nghi rõ nguồn là từ trang này nhé!
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
1 nhát được 5 miếng thịt (ý nói 1 vòng For Seq = 0 to 6
0 tới 6 có 7 giá trị (step = 1), sao ra 5 cục hay vậy?

.Cells(1000000, ColumnArrCode(Seq)).End(xlUp).Row
Nếu >1000000 thì thuộc con rơi à?

StoreCode là giá trị đơn thì tèo ngay.

.Range("D3").Resize(UBound(SArr, 1), 1) = RArr
Dùng thuộc tính nào thì ghi rõ ràng.

Thức thứ 7 trong "Dictionary Bí Truyền" (phải có duyên lắm mới được học đấy nhá)
Không nên viết như thế, thành viên khác, mới tìm hiểu nhầm tưởng là cái gì ghê gớm, bắt chước theo.

Dẫn chứng cái mình đã nói từ đầu:
1615789776656.png

1615789811227.png

---
Cái căn bản chưa rành, mình cứ bày đặt mấy cái trên làm gì.
Nên bắt đầu ngay từ đầu, từ chỗ khai báo biến rồi mới tính cái tiếp (trên đúng tinh thần mình nói là học tập, không phải làm cho xong việc).

Dim ColumnArr, sKey As String, RowArr, ShArr
Dim Dict, SArr(), RArr()
 
Upvote 0
- Thức thứ 7 trong "Dictionary Bí Truyền" (phải có duyên lắm mới được học đấy nhá)
- Thức thứ 7 là cách gọi vui, nhằm đánh dấu rằng có một trường hợp: Các bảng nằm rải rác ở các Sheets, sau đó các cột trong bảng lại giãn ra đổi chiều thứ tự trước sau, sau đó các cột trong bản lại so le nhau. Nhưng vẫn sử dụng Dic được với hình ảnh xiên thịt nướng, xiên 1 nhát được 5 miếng thịt (ý nói 1 vòng For Seq = 0 to 6)
PHP:
Sub Dict_Episode_7()
Dim DataRw As Long, i As Long
Dim ColumnArr, sKey As String, RowArr, ShArr
Dim Dict, SArr(), RArr()
Set Dict = CreateObject("Scripting.Dictionary")
ShArr = Array(2, 3, 4, 5, 6, 7, 8)
ColumnArrCode = Array(2, 4, 7, 3, 12, 12, 2)
RowArrCode = Array(7, 19, 10, 12, 11, 8, 6)
ColumnArrQty = Array(8, 14, 20, 7, 4, 6, 7)
RowArrQty = Array(9, 7, 15, 4, 17, 13, 13)
For Seq = 0 To 6
    With Sheets(ShArr(Seq))
        DataRwCode = .Cells(1000000, ColumnArrCode(Seq)).End(xlUp).Row
        DataRwQty = .Cells(1000000, ColumnArrQty(Seq)).End(xlUp).Row
        StoreCode = .Range(.Cells(RowArrCode(Seq), ColumnArrCode(Seq)), _
        .Cells(DataRwCode, ColumnArrCode(Seq))).Value2
        StoreQty = .Range(.Cells(RowArrQty(Seq), ColumnArrQty(Seq)), _
        .Cells(DataRwQty, ColumnArrQty(Seq))).Value2
        For i = 1 To UBound(StoreCode, 1)
            sKey = StoreCode(i, 1)
            If Not Dict.exists(sKey) Then
                Dict.Add sKey, StoreQty(i, 1)
            Else
                Dict.Item(sKey) = Dict.Item(sKey) + StoreQty(i, 1)
            End If
        Next
    End With
Next Seq
With Sheets("Data")
SArr = .Range(.Cells(3, 2), .Cells(1000000, 2).End(xlUp)).Value
ReDim RArr(1 To UBound(SArr, 1), 1 To 1)
For i = 1 To UBound(SArr, 1)
    If Dict.exists(SArr(i, 1)) Then
        RArr(i, 1) = Dict.Item(SArr(i, 1))
    Else
        RArr(i, 1) = 0
    End If
Next
.Range("D3:D1000").ClearContents
.Range("D3").Resize(UBound(SArr, 1), 1) = RArr
End With
End Sub
- Từ người không biết về VBA với thời gian thực sự có học và đọc là 2 tuần,bảng tính Excel các hàm thì làm gì cũng Seach google là chính( nghĩa là chẳng nhớ gì, nói chung cũng gà gà). Nhưng cơ duyên thế nào mà gặp được chú Mỹ @ptm0412. Được người thầy là chuyên gia thiết kế phân tích phần mềm, lại là Smod của diễn đàn hàng đầu về lập trình VBA đã chỉ cho. Mình học từ chú mà không có một sự chuẩn bị lý thuyết nào, chỉ dựa vào các từ khóa trong code để tra ngược và tìm lý thuyết đó để đọc. Quá may mắn khi được là thành viên của diễn đàn và được chú chỉ cho.
- Với phần mềm Excel này khi nào ngộ ra rằng: 1 Cells --> biến thành 1 đoạn thẳng --> biến thành hình chữ nhật --> thành đoạn thẳng --> thành 1 Cells thì lúc đó bạn mới có khả năng tự học và đọc hiểu tài liệu và bài tập(VBA), khi hiểu mới chế cháo tốt và có sáng tạo được.
- Nói vui theo phim chưởng thì. Dictionary như là ngoại công, còn Array như là nội công, còn ra được đòn Oánh người thì phải do cái não của bạn!
- Dự báo rằng TOP này sẽ đặt 1 triệu Views trong vòng 1 năm và cùng với đó là diễn đàn có thêm nhiều thành viên mới. Các anh chị Youtuber rất thích những cái là lạ như này để ra video, xin hãy nghi rõ nguồn là từ trang này nhé!
Mình ngưỡng mộ nhiệt huyết của bạn. Tuy nhiên, khi kỹ năng code của bạn vượt qua được ngưỡng cơ bản thì bạn sẽ mĩm cười khi xem lại các bài tập trong chủ đề này. Lúc đó bạn sẽ nói: "Đuổi việc ngay người nào đã tạo ra cái mẫu báo cáo thống kê như thế này"
 
Upvote 0
0 tới 6 có 7 giá trị (step = 1), sao ra 5 cục hay vậy?


Nếu >1000000 thì thuộc con rơi à?


StoreCode là giá trị đơn thì tèo ngay.


Dùng thuộc tính nào thì ghi rõ ràng.


Không nên viết như thế, thành viên khác, mới tìm hiểu nhầm tưởng là cái gì ghê gớm, bắt chước theo.

Dẫn chứng cái mình đã nói từ đầu:
View attachment 255443

View attachment 255446

---
Cái căn bản chưa rành, mình cứ bày đặt mấy cái trên làm gì.
Nên bắt đầu ngay từ đầu, từ chỗ khai báo biến rồi mới tính cái tiếp (trên đúng tinh thần mình nói là học tập, không phải làm cho xong việc).
- 0 tới 6 có 7 giá trị (step = 1), sao ra 5 cục hay vậy? TL: Cháu xiên 1 xiên được 5 các Array ấy ạ
- Nếu >1000000 thì thuộc con rơi à? TL: Khi học đến bài này rồi người học sẽ hiểu 1000000 là cái gì ạ!
- StoreCode là giá trị đơn thì tèo ngay TL: Ngay từ đầu lấy nó làm Key rồi ạ!
*** Những đúng là cháu học như này được nhiều mà hiểu mà!
Bài đã được tự động gộp:

Mình ngưỡng mộ nhiệt huyết của bạn. Tuy nhiên, khi kỹ năng code của bạn vượt qua được ngưỡng cơ bản thì bạn sẽ mĩm cười khi xem lại các bài tập trong chủ đề này. Lúc đó bạn sẽ nói: "Đuổi việc ngay người nào đã tạo ra cái mẫu báo cáo thống kê như thế này"
Vâng! Chắc chắn nó không có khả năng xảy ra trong thực tế. Nhưng sẽ giúp cho người học có thể tự học và biết tra từ khóa ở đâu phải không thầy. Em rất ngưỡng mộ các bài viết của thầy, của bác V, bác b...
Do không biết công cụ gì ở bài #17, ngồi nghĩ mối liên hệ giữa i của vòng lặp và thứ tự trong các bảng. Code ghep_bang bài #17 nó thức tỉnh và thôi thúc yêu VBA ghê gớm!
Các từ khóa để tra ngược lý thuyết rất quan trọng phải không thầy? Em cảm ơn thầy đã ghi nhân, nếu không thì buồn lắm ạ!
 
Lần chỉnh sửa cuối:
Upvote 0
- 0 tới 6 có 7 giá trị (step = 1), sao ra 5 cục hay vậy? TL: Cháu xiên 1 xiên được 5 các Array ấy ạ
- Nếu >1000000 thì thuộc con rơi à? TL: Khi học đến bài này rồi người học sẽ hiểu 1000000 là cái gì ạ!
- StoreCode là giá trị đơn thì tèo ngay TL: Ngay từ đầu lấy nó làm Key rồi ạ!
*** Những đúng là cháu học như này được nhiều mà hiểu mà!
Bài đã được tự động gộp:


Vâng! Chắc chắn nó không có khả năng xảy ra trong thực tế. Nhưng sẽ giúp cho người học có thể tự học và biết tra từ khóa ở đâu phải không thầy. Em rất ngưỡng mộ các bài viết của thầy, của bác V, bác b...
Các từ khóa để tra ngược lý thuyết rất quan trọng phải không thầy? Em cảm ơn thầy đã ghi nhân, nếu không thì buồn lắm ạ!
1. Khi cài nút chiếc áo sơ mi thì cái nút đầu tiên rất quan trọng, theo mình thì cái nút đầu tiên đang không ổn
2. Nên thay số 1000000 bằng Rows.Count
3. Tạo một sheet bảng tra, chỉ cần thêm thông tin cho bảng tra nếu muốn thêm sheet, không cần sửa code, đại loại như thế này

Sheet
2​
3​
4​
5​
6​
7​
8​
Column
2​
4​
7​
3​
12​
12​
2​
Row Code
7​
19​
10​
12​
11​
8​
6​
Column Qty
8​
14​
20​
7​
4​
6​
7​
Row Qty
9​
7​
15​
4​
17​
13​
13​
 
Upvote 0
- Nếu >1000000 thì thuộc con rơi à? TL: Khi học đến bài này rồi người học sẽ hiểu 1000000 là cái gì ạ!
Tới đây mới biết thì lại sinh một bé xinh xinh nữa à?

- StoreCode là giá trị đơn thì tèo ngay TL: Ngay từ đầu lấy nó làm Key rồi ạ!
Không đúng. Bạn chưa nắm được liên hệ Range và Array.
 
Upvote 0
1. Khi cài nút chiếc áo sơ mi thì cái nút đầu tiên rất quan trọng, theo mình thì cái nút đầu tiên đang không ổn
2. Nên thay số 1000000 bằng Rows.Count
3. Tạo một sheet bảng tra, chỉ cần thêm thông tin cho bảng tra nếu muốn thêm sheet, không cần sửa code, đại loại như thế này

Sheet
2​
3​
4​
5​
6​
7​
8​
Column
2​
4​
7​
3​
12​
12​
2​
Row Code
7​
19​
10​
12​
11​
8​
6​
Column Qty
8​
14​
20​
7​
4​
6​
7​
Row Qty
9​
7​
15​
4​
17​
13​
13​
Vâng thầy. Thay 1000000 bằng Rows.Count sẽ tránh được cái lỗi" bỏ con rơi". Em cảm ơn thầy. Mong được thầy chỉ cho những chỗ sai sót và sẻ chia chút vốn kiến thức vba ạ.
Bài đã được tự động gộp:

Tới đây mới biết thì lại sinh một bé xinh xinh nữa à?


Không đúng. Bạn chưa nắm được liên hệ Range và Array.
Nếu được bác giúp cho là bài tập thì chúng cháu sẽ hiểu và học rất nhanh ạ!
 
Lần chỉnh sửa cuối:
Upvote 0
Sau này ai hỏi thì nói học tập toẹ, bập bõm, ti toe trên GPE thôi nhé, đừng nói học cụ thể của lão ct hay của ai nhé, xấu hổ cho mấy người đó lắm. Xấu hổ ở chỗ nói 5 lần 7 lượt mà không nhớ khai báo biến, đặt tên biến, không nhớ chấm mắm châm tương, không biết with end with để làm gì, không phân biệt If và Select case, không biết giá trị đơn giá trị mảng, thậm chí không biết thuộc tính và phương thức, .... tỷ thứ không biết. Lại còn ngoan cố cứ 1 giá trị đơn cũng gắn vô mảng
 
Upvote 0
Sau này ai hỏi thì nói học tập toẹ, bập bõm, ti toe trên GPE thôi nhé, đừng nói học cụ thể của lão ct hay của ai nhé, xấu hổ cho mấy người đó lắm. Xấu hổ ở chỗ nói 5 lần 7 lượt mà không nhớ khai báo biến, đặt tên biến, không nhớ chấm mắm châm tương, không biết with end with để làm gì, không phân biệt If và Select case, không biết giá trị đơn giá trị mảng, thậm chí không biết thuộc tính và phương thức, .... tỷ thứ không biết. Lại còn ngoan cố cứ 1 giá trị đơn cũng gắn vô mảng
- Dạ. Bảo là được ông bụt cho quyển sách học gì cũng cũng có.
Xót chú không có thời gian mà dạy thôi. Cháu bảo họ:"tôi không biết đầu cua tai ngheo vba ra làm sao mà sau 2 tuần tôi cảm thấy tự học, tự đọc code vba được". Khi ấy họ cứ bám theo chú mà cầu học ấy chứ.
- Thời điểm trước đó là cứ chạy được ra kết quả là ăn tiền, vì lấy code trc để sửa. Vừa tra ngược từ khóa trên code, vừa đọc lý thuyết, vừa sửa cho nó chạy. Chips nó nóng quá lên hơi đơ tý ạ!
Khi ngộ ra ý nghĩa của 1 Cells, mọi thứ bừng sáng chú ạ.
 
Lần chỉnh sửa cuối:
Upvote 0
Sau này ai hỏi thì nói học tập toẹ, bập bõm, ti toe trên GPE thôi nhé, đừng nói học cụ thể của lão ct hay của ai nhé, xấu hổ cho mấy người đó lắm. Xấu hổ ở chỗ nói 5 lần 7 lượt mà không nhớ khai báo biến, đặt tên biến, không nhớ chấm mắm châm tương, không biết with end with để làm gì, không phân biệt If và Select case, không biết giá trị đơn giá trị mảng, thậm chí không biết thuộc tính và phương thức, .... tỷ thứ không biết. Lại còn ngoan cố cứ 1 giá trị đơn cũng gắn vô mảng
Ơ, giống cháu nè, thủa mới học xong, ổng thầy của cháu cũng nói thẳng trước lớp: "Mày đừng bao giờ mở miệng ra nói rằng học tao". Lúc học cũng bị nói suốt, lúc nghe ổng thầy nói vậy cháu mừng rơi nước mắt, mới hiểu ra là mình quá tài năng, ông thầy sợ điều đó sẽ mang họa cho ổng. Từ đó cháu toàn nhận là mình không biết vba. trình vba từ đó nó cứ lẹt đẹt ở mức đi copy code của người khác...hihihi
Bài đã được tự động gộp:

Khi ngộ ra ý nghĩa của 1 Cells
bạn này giỏi thế, tôi rời xa thầy của mình mấy năm mà chưa ngộ được cái gì về cuộc đời. Mới có 2 tuần đã chế code được, tôi toàn phải đi trôm code của mấy lão, rồi oàn mình ra sửa cho nó hợp với file của mình, mỗi lần vậy là nhớ hoài ổng thầy
 
Lần chỉnh sửa cuối:
Upvote 0
Ơ, giống cháu nè, thủa mới học xong, ổng thầy của cháu cũng nói thẳng trước lớp: "Mày đừng bao giờ mở miệng ra nói rằng học tao". Lúc học cũng bị nói suốt, lúc nghe ổng thầy nói vậy cháu mừng rơi nước mắt, mới hiểu ra là mình quá tài năng, ông thầy sợ điều đó sẽ mang họa cho ổng. Từ đó cháu toàn nhận là mình không biết vba. trình vba từ đó nó cứ lẹt đẹt ở mức đi copy code của người khác...hihihi
Chị em thôi, em mới 18+. Gọi chị là tỷ tỷ rồi.
- Hồi đi học đại học cả lớp không ai làm thêm tải trong động đất trong đồ án tốt nghiệp. Mỗi mình muội vì yêu thích nên lao vào làm. Hội bạn thì cứ file excel cũ, bản vẽ cũ để sửa lại. Còn muội phải tự thiết kế file excel cho riêng mình và bản vẽ cực kỳ mất công
- Nhưng đến giáp năm mới năm nay thời điểm đó quay lại diễn đàn còn không nhớ được gì Excel ấy. Nhân covi covit mới thấy cái các cái file ngày xưa mình viết sao nặng quá thể. Nên mới học VBA. Mà tính em đã học là phải học kỳ được. Rồi giờ cảm thấy hiểu được code và tự kiếm tài liệu được. Cực nhưng vui thật!
 
Lần chỉnh sửa cuối:
Upvote 0
Thấy thớt cũng khá tự tin nên tôi chỉ gợi ý bằng hình ảnh. Nếu thực sự biết mình viết cái gì trong "thức bí truyền" thì tự khắc sẽ biết cách khắc phục.
1615799156740.png
 
Upvote 0
Thấy thớt cũng khá tự tin nên tôi chỉ gợi ý bằng hình ảnh. Nếu thực sự biết mình viết cái gì trong "thức bí truyền" thì tự khắc sẽ biết cách khắc phục.
View attachment 255470
Đẳng cấp cao nhất vẫn là chữ Nhẫn phải không ạ?.
Cháu nói vui với các bạn đồng trang lứa thôi. Với lại cháu trân quý những gì cháu được nhận thì cháu gọi vậy, quý vì nó hiếm, mấy ai chia sẻ cho đâu, đọc sách nào mà có được ạ. Xin phép bác ạ!
 
Lần chỉnh sửa cuối:
Upvote 0
Tại vì bạn học kiểu học vẹt nên mới thấy quý hiếm (vì sát với bài toán của bạn) chứ tài liệu chia sẻ thì đầy nhé.
Tôi không cà khịa bạn làm gì. Cái hình tôi gợi ý chỉ ra 3 lỗi sai trong code của bạn, nếu bạn không nhìn ra thì rõ ràng là thiếu kiến thức cơ bản.
 
Upvote 0
Tại vì bạn học kiểu học vẹt nên mới thấy quý hiếm (vì sát với bài toán của bạn) chứ tài liệu chia sẻ thì đầy nhé.
Tôi không cà khịa bạn làm gì. Cái hình tôi gợi ý chỉ ra 3 lỗi sai trong code của bạn, nếu bạn không nhìn ra thì rõ ràng là thiếu kiến thức cơ bản.
Cháu hiểu code. Ý bác có dòng dữ liệu không theo định dạng chung chứ gì.
Việc gì cũng vậy thôi. Trước khi thực hiện phải khảo sát.
1. Loại dữ liệu hay làm sao đó để cùng cấu trúc. Bắt nó phải cùng cấu truc mới gọi là xử lý chứ ạ. Việc này hoàn toàn làm đc bằng code hoặc bằng tay.
2. Code không sai, ý muốn chủ quan con người đến đâu thì tìm cách bổ xung đến đấy tùy thời điểm đó khi khảo sát đc dữ liệu ra sao
Cháu rất muốn đc các bác chỉ cho chỗ sai, nhưng đúng như anh thợ đục mộc các cạc mốc cứ kỳ cạch một mình vậy vì cháu tin học Dict thì đồng nghĩa với cháu đang xiên trúng anh Array, trăm mối như vậy cũng phải chọn ra cách mà đi mà học chứ ạ.
 
Lần chỉnh sửa cuối:
Upvote 0
Upvote 0
Nếu quan điểm của bạn như vậy thì cần gì tranh luận nữa :D
Với cháu bác lại không nhẫn cho cháu.
Cái thiếu của code thì bác là sai, còn cái bác bảo cho là thiếu thì cháu lại bảo nó là đúng trong trường hợp dữ liệu hiện có.Dù có rất nhiều ý kiến trái chiều thì cháu rất kiên nhất 1 điều dạ, 2 điều vâng để nghe. Nhưng vâng xong cái thì " mày tự học một mình đi" rất có thể sa vào áp đặt mà thiếu đi sự chỉ bảo.
 
Lần chỉnh sửa cuối:
Upvote 0
Với cháu bác lại không nhẫn cho cháu.
Cái thiếu của code thì bác là sai, còn cái bác bảo cho là thiếu thì cháu lại bảo nó là đúng trong trường hợp dữ liệu hiện có.Dù có rất nhiều ý kiến trái chiều thì cháu rất kiên nhất 1 điều dạ, 2 điều vâng để nghe. Nhưng vâng xong cái thì " mày tự học một mình đi" rất có thể sa vào áp đặt mà thiếu đi sự chỉ bảo.
Ý của anh @huuthang_bd là phải tự test trường hợp trong hình bài 113. Hình đó nếu bỏ vào dữ liệu chạy code chắc chắn sẽ lỗi ít nhất 3 việc.
 
Upvote 0
Ý của anh @huuthang_bd là phải tự test trường hợp trong hình bài 113. Hình đó nếu bỏ vào dữ liệu chạy code chắc chắn sẽ lỗi ít nhất 3 việc.
Vâng ạ.sẽ có thêm add bonus 7.
"Ít nhất" đó là những việc:
- Có dòng dữ liệu trống trong xen vào bảng
- Cột làm Key có ô không thuộc cấu trúc
- Cột làm Item có ô không phải là số
Xử lý thì:
- Phân tích cấu trúc cột làm key, chia đôi ra đc 2 ký tự text và 1 số có 2 chữ số. Nếu ông nào không phải cấu trúc này thì không lấy làm key. Không lấy làm key thì không cần phân tích cấu trúc của Item. Bỏ qua Key đó không add vào dict
- Còn phải phân tích cấu trúc Item trong trường hợp Item đó có Key thuộc cấu trúc nhưng Item đó không phải là số thì cũng hủy Key đó.
Chiều cháu chạy thử ạ
 
Lần chỉnh sửa cuối:
Upvote 0
- Phân tích cấu trúc cột làm key, chia đôi ra đc 2 ký tự text và 1 số có 2 chữ số. Nếu ông nào không phải cấu trúc này thì không lấy làm key. Không lấy làm key thì không cần phân tích cấu trúc của Item. Phân tích cấu truc Key, bỏ qua Item
Nếu bảng danh mục có MH01 đến MH 30, cửa hàng 7 bán MH35 thì MH35 cùng cấu trúc? Cho nên vấn đề không phải cấu trúc mã, mà là mã chưa có trong danh mục. Vấn đề thứ 2 lại không phải có dòng trống (hình có dòng trống đâu?) vấn đề là CHỈ CÓ 1 DÒNG 1 CỘT, tức là chỉ có 1 ô, gắn vào mảng bị lỗi, gắn vào biến đơn thì không truy xuất kiểu mảng được.
 
Upvote 0
- Thôi thì cháu cứ ra dạng bài tập số 8 áp dụng Dictionary (đặt tên theo quy định)
- Trân quý những kiến thức những gì được dạy thì có thức thứ 8 "Dictionary Bí Truyền" (cái này em(cháu) đặt tên = Long Đằng Ngũ Nhạc)
- Cách gọi thức thứ 8 trong bí kíp Dictionary bí truyền là cách nói vui, rằng có 1 dạng bài tập áp dụng được Dictionary, các bảng văng ra các Sheet, rồi các cột trong bảng giãn cách và đổi thứ tự cho nhau, sau đó các cột trong hàng lại so le nhau, sau đó lại có kiểu data không thuộc cấu trúc để làm Key làm Item được.

Cách giải rất giản dị: Ông nào muốn làm Key thì đầu tiên ông không được trống ông IsEmpty(...) = False, khi ông không trống thì ông phải có Len = 4, tách ra 2 ký tự đầu phải = MH, hai ký tự sau phải là số. Ngang với ông Key thì bà nào làm Item phải không trống IsEmpty(...) = False và khi không trống bà phải là số cho tui.
Và có code như sau:
hocthatkhongvet.jpg
PHP:
[/COLOR][/SIZE]
Sub Dict_Episode_8()
Dim DataRw As Long, i As Long
Dim ColumnArr, sKey As String, RowArr, ShArr
Dim Dict, SArr(), RArr(), txt As String, txt2 As String
Set Dict = CreateObject("Scripting.Dictionary")
ShArr = Array(2, 3, 4, 5, 6, 7, 8)
ColumnArrCode = Array(2, 4, 7, 3, 12, 12, 2)
RowArrCode = Array(7, 19, 10, 12, 11, 8, 6)
ColumnArrQty = Array(8, 14, 20, 7, 4, 6, 7)
RowArrQty = Array(9, 7, 15, 4, 17, 13, 13)
For Seq = 0 To 6
    With Sheets(ShArr(Seq))
        DataRwCode = .Cells(1000000, ColumnArrCode(Seq)).End(xlUp).Row
        DataRwQty = .Cells(1000000, ColumnArrQty(Seq)).End(xlUp).Row
        StoreCode = .Range(.Cells(RowArrCode(Seq), ColumnArrCode(Seq)), _
        .Cells(DataRwCode, ColumnArrCode(Seq))).Value2
        StoreQty = .Range(.Cells(RowArrQty(Seq), ColumnArrQty(Seq)), _
        .Cells(DataRwQty, ColumnArrQty(Seq))).Value2
        For i = 1 To UBound(StoreCode, 1)
            mc = StoreCode(i, 1): mq = StoreQty(i, 1): txt = Mid(mc, 1, 2): txt2 = Mid(mc, 3, 2)
            If (IsEmpty(mc) = False And Len(mc) = 4 And txt = "MH" And IsNumeric(txt2) = True _
            And IsEmpty(mq) = False And IsNumeric(mq) = True) Then
                sKey = StoreCode(i, 1)
                If Not Dict.exists(sKey) Then
                    Dict.Add sKey, StoreQty(i, 1)
                Else
                    Dict.Item(sKey) = Dict.Item(sKey) + StoreQty(i, 1)
                End If
            End If
        Next
    End With
Next Seq
With Sheets("Data")
SArr = .Range(.Cells(3, 2), .Cells(1000000, 2).End(xlUp)).Value
ReDim RArr(1 To UBound(SArr, 1), 1 To 1)
For i = 1 To UBound(SArr, 1)
    If Dict.exists(SArr(i, 1)) Then
        RArr(i, 1) = Dict.Item(SArr(i, 1))
    Else
        RArr(i, 1) = 0
    End If
Next
.Range("D3:D1000").ClearContents
.Range("D3").Resize(UBound(SArr, 1), 1) = RArr
End With
End Sub[code]
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Sau cảnh báo ở bài 121 thì code bài 122 vô giá trị. Đó là chưa kể 1 số biến chưa khai báo mặc dù đã được nhắc.
 
Upvote 0
Sau cảnh báo ở bài 121 thì code bài 122 vô giá trị. Đó là chưa kể 1 số biến chưa khai báo mặc dù đã được nhắc.
Dạ Dạ.
- Nếu biến nào không khai báo, là số thì tự nó ép là kiểu interge, nếu không thì nó là variant, cháu thấy không cần khai vẫn chạy được. Tối cháu sửa ạ. Liệu bài 8 này đã trùm hết khả năng chưa ạ?
- Còn danh mục nếu lấy là cập nhật mới nhất thì cháu gán nó xuống sheet là Dict.Item(sKey) ạ(ở bài 122 coi là danh sách tách rời. Không coi là cũ mới gì ạ)
 
Lần chỉnh sửa cuối:
Upvote 0
Thế cái này là cái gì đây:

1615885462906.png
 
Upvote 0
Có phải cách duy nhất là chuyển sang Range không ạ?
Chết dở. If đủ các trường hợp rầu mà. Để cháu chỉnh tiếp ạxuly.jpg
Giờ cháu mới hiểu cảnh báo! Nếu bảng có 1 dòng giá trị sẽ bị lỗi như cảnh báo bài 121. Hiện chưa biết cách khắc phục nào triệt để. Vì nếu bảng có từ 2 dòng trở lên thì code xử lý chính xác.
Dùng On Error Resume Next cháu thật sự chưa ưng ý.
Dùng cái này có được không ạ.Sách bị ... chỗ đó lên lấy câu lệnh On Error Resume Next xử lý được không ạ?
 
Lần chỉnh sửa cuối:
Upvote 0
chắc phụ thân nhà cô nương đau đầu vì cô nương lắm
cô nương vào link dưới này học bài bản dùm
rồi thích luyện code thì dạo các post cần hỗ trợ trên GPE để luyện như tôi này

p/s: "xử lý" không phải "sử lý"
 
Upvote 0
chắc phụ thân nhà cô nương đau đầu vì cô nương lắm
cô nương vào link dưới này học bài bản dùm
rồi thích luyện code thì dạo các post cần hỗ trợ trên GPE để luyện như tôi này

p/s: "xử lý" không phải "sử lý"
Muội đọc nhanh lắm, nhưng phải có từ khóa để tra ngược và phải áp vào bài mới nhớ ạ!
Huynh thử bài #126 xem. Nếu không dùng câu lệnh On Error Resume Next thì huynh sẽ xử lý sao?
Code bài #126, nếu bảng dữ liệu có từ 2 dòng trở lên thì chạy luôn đúng, còn nếu chỉ có 1 dòng dữ liệu thì lỗi (cảnh báo bài #121).
 
Lần chỉnh sửa cuối:
Upvote 0
Muội đọc nhanh lắm, nhưng phải có từ khóa để tra ngược và phải áp vào bài mới nhớ ạ!
về mặt lý luận, cô nương lên nhìn một cách phổ quát hơn.
cô nương cho người dùng được phép "buông thả", nhưng lại không cho phép dữ liệu được "buông thả".
người dùng trình bày báo cáo ở cột nào, ô nào cũng được. 100 người cô nương phải chiều theo ý của 100 người, sửa lại đống (ColumnArrCode, RowArrCode, ColumnArrQty, RowArrQty) theo ý họ.
còn dữ liệu chỉ cho đến 99 mã, nếu hơn 100 mã hàng thì sao? dữ liệu trống, dữ liệu không khớp,... thì sao?
 
Upvote 0
Có phải cách duy nhất là chuyển sang Range không ạ?
lấy câu lệnh On Error Resume Next xử lý được không ạ?
Chuyển sang range cho mà chết
Resume next là bỏ qua dữ liệu không lấy lên báo cáo à? Báo cáo kiểu gì vậy?
Chia ra 3 trường hợp:
- Không có dòng nào (có quyền bỏ qua)
- Có 1 dòng: DataArr là giá trị đơn, xét trực tiếp không cần vòng lặp (bao gồm StoreCode và SoreQty)
- Nhiều hơn 1 dòng: DataArr là mảng, truy xuất kiểu mảng DataArr(i, 1)
Trường hợp mã chưa có trong danh mục (không cần đúng cấu trúc, #$%^ kệ nó), nếu có SL bán là PHẢI BÁO CÁO, thêm 1 dòng vào danh mục.
 
Upvote 0
Nổ não, sẵn tiện đây cho mình hỏi không dùng index co thể đưa union rang vào array không và cách tối ưu nhất
 
Upvote 0
Chuyển sang range cho mà chết
Resume next là bỏ qua dữ liệu không lấy lên báo cáo à? Báo cáo kiểu gì vậy?
Chia ra 3 trường hợp:
- Không có dòng nào (có quyền bỏ qua)
- Có 1 dòng: DataArr là giá trị đơn, xét trực tiếp không cần vòng lặp (bao gồm StoreCode và SoreQty)
- Nhiều hơn 1 dòng: DataArr là mảng, truy xuất kiểu mảng DataArr(i, 1)
Trường hợp mã chưa có trong danh mục (không cần đúng cấu trúc, #$%^ kệ nó), nếu có SL bán là PHẢI BÁO CÁO, thêm 1 dòng vào danh mục.
Xuống núi vội quá gặp đúng chỗ chữ "nhòe" lại lần lên núi tìm thầy! Hi hi xong rồi. Chú sửa cháu với để cháu biên tập lại hết các bài ạ!
PHP:
Sub Dict_Episode_8_fix()
Dim DataRw As Long, i As Long, sKey As String
Dim Dict, SArr(), RArr(), txt As String, txt2 As String
Dim ShArr, ColumnArrCode, RowArrCode, ColumnArrQty, RowArrQty, StoreCode, StoreQty
Set Dict = CreateObject("Scripting.Dictionary")
ShArr = Array(2, 3, 4, 5, 6, 7, 8)
ColumnArrCode = Array(2, 4, 7, 3, 12, 12, 2)
RowArrCode = Array(7, 19, 10, 12, 11, 8, 6)
ColumnArrQty = Array(8, 14, 20, 7, 4, 6, 7)
RowArrQty = Array(9, 7, 15, 4, 17, 13, 13)
For Seq = 0 To 6
    With Sheets(ShArr(Seq))
            DataRwCode = .Cells(1000000, ColumnArrCode(Seq)).End(xlUp).Row
            DataRwQty = .Cells(1000000, ColumnArrQty(Seq)).End(xlUp).Row
            StoreCode = .Range(.Cells(RowArrCode(Seq), ColumnArrCode(Seq)), _
            .Cells(DataRwCode, ColumnArrCode(Seq))).Value
            StoreQty = .Range(.Cells(RowArrQty(Seq), ColumnArrQty(Seq)), _
            .Cells(DataRwQty, ColumnArrQty(Seq))).Value
            a = DataRwCode - RowArrCode(Seq)
            If (a = 1) Then
            mc = StoreCode(1, 1): mq = StoreQty(1, 1): txt = Mid(mc, 1, 2): txt2 = Mid(mc, 3, 2)
                If (IsEmpty(mc) = False And Len(mc) = 4 And txt = "MH" And IsNumeric(txt2) = True _
                And IsEmpty(mq) = False And IsNumeric(mq) = True) Then
                    sKey = StoreCode(1, 1)
                    If Not Dict.exists(sKey) Then
                        Dict.Add sKey, StoreQty(1, 1)
                    Else
                        Dict.Item(sKey) = Dict.Item(sKey) + StoreQty(1, 1)
                    End If
                End If
            End If
            If (a > 1) Then
            For i = 1 To UBound(StoreCode, 1)
                mc = StoreCode(i, 1): mq = StoreQty(i, 1): txt = Mid(mc, 1, 2): txt2 = Mid(mc, 3, 2)
                If (IsEmpty(mc) = False And Len(mc) = 4 And txt = "MH" And IsNumeric(txt2) = True _
                And IsEmpty(mq) = False And IsNumeric(mq) = True) Then
                    sKey = StoreCode(i, 1)
                    If Not Dict.exists(sKey) Then
                        Dict.Add sKey, StoreQty(i, 1)
                    Else
                        Dict.Item(sKey) = Dict.Item(sKey) + StoreQty(i, 1)
                    End If
                End If
            Next
            End If
        End With
Next Seq
With Sheets("Data")
SArr = .Range(.Cells(3, 2), .Cells(1000000, 2).End(xlUp)).Value
ReDim RArr(1 To UBound(SArr, 1), 1 To 1)
For i = 1 To UBound(SArr, 1)
    If Dict.exists(SArr(i, 1)) Then
        RArr(i, 1) = Dict.Item(SArr(i, 1))
    Else
        RArr(i, 1) = 0
    End If
Next

.Range("D3").Resize(UBound(SArr, 1), 1) = RArr
End With
End Sub
 
Upvote 0
Upvote 0
Vẫn tiếp tục vô giá trị. 3 điều ở 130 không được điều nào.
Vì số dòng tượng trưng cho phần tử của Arr, và lấy số chênh nhau của chỉ số dòng ô trên vào chỉ ô dưới trong cột. Để lọc ra các trường hợp để không bị lỗi.
1. Chênh = 0 thì không xét
2. Chênh = 1 thì xét
3. Chênh lớn hơn 1 thì xét
Do đã không lỗi, và đã bao trùm tất cả các trường hợp nên ở bài này cháu thấy khó sửa vì không tìm ra lỗi nữa. Xin chú chỉ cho ạ? Đúng là không thấy lỗi thành ra không biết sửa sao ạ!
 
Upvote 0
Thử 2 trường hợp sau, nhớ kiểm tra kết quả (số 1 triệu thì không thể nào không thấy)
1615904642847.png
Mục số 2:
Đã nói là không đưa về range

Mục số 3:
Mặt hàng không có trong danh mục thì dù có bán được tỷ đồng cũng không tính

1615904884390.png

Sửa: bỏ mục số 2
_____________
Đính chính:
Mục số 2:
Nếu làm đúng mục 1, thì vẫn chưa hiểu gì về "giá trị đơn" và giá trị mảng"
 
Lần chỉnh sửa cuối:
Upvote 0
Thử 2 trường hợp sau, nhớ kiểm tra kết quả (số 1 triệu thì không thể nào không thấy)
View attachment 255546
Mục số 2:
Đã nói là không đưa về range
Mục số 3:
Mặt hàng không có trong danh mục thì dù có bán được tỷ đồng cũng không tính

View attachment 255548
Khu vực cháu đang bị mất điện khổ ghê. Kiểu này "bổ củi" lâu lâu đây.
Nếu như thấy
TH1: thấy MH01 = 1 triệu + các bảng khác nếu có là xong ảnh 1
TH2: thấy MH01 = 1 triệu + 1 triệu + các bảng khác nếu có là xong bức ảnh xong ảnh 2
TH3: lờ đi vì ko có trong danh mục. Kiểm tra vậy là xong phải ko ạ?
- Hoàn cảnh giờ rất oái oăm. Là không biết có lỗi hay không mà sửa. Ở các bài trc thì thấy lỗi và sửa lỗi. Ở bài này thì công nhận là chưa lĩnh hội được.
Giá thầy thị phạm cho vài đường thì tuyệt quá (chỗ code lập luận 3 trường hợp ấy ạ)
- Cụ thể chỗ biến đơn không truy xuất được kiểu dữ liệu mảng. Cháu đúng không hiểu chỗ này. Nên mới nghĩ ra a = sự chênh nhau giữa ô chỉ số trên và ô chỉ số dưới trong cùng 1 dòng. sao a trong trường hợp này lại không được dùng
 
Lần chỉnh sửa cuối:
Upvote 0
Hình 1: Từ dòng 6 đến dòng 6 là mấy dòng dữ liệu? (a= 6 - 6 = 0)
Hình 2: Từ dòng 6 đến dòng 7 là mấy dòng dữ liệu? ( a = 7 - 6 = 1).
Quan sát cho kỹ vào, đừng trả lời bừa.
1 tỷ đồng của người ta mà "lờ" đi là sao?
 
Upvote 0
Hình 1: Từ dòng 6 đến dòng 6 là mấy dòng dữ liệu? (a= 6 - 6 = 0)
Hình 2: Từ dòng 6 đến dòng 7 là mấy dòng dữ liệu? ( a = 7 - 6 = 1).
Quan sát cho kỹ vào, đừng trả lời bừa.
1 tỷ đồng của người ta mà "lờ" đi là sao?
a = DataRwCode - RowArrCode(Seq) không dùng được ạ. Tầng này khó vào thật chú ạ
Chú cho cháu vài dòng code đi. Ăn không 1 tỷ. Muốn giả lại không được ạ hic hic
 
Upvote 0
a = DataRwCode - RowArrCode(Seq) không dùng được ạ. Tầng này khó vào thật chú ạ
Chú cho cháu vài dòng code đi. Ăn không 1 tỷ. Muốn giả lại không được ạ hic hic
Quay về bài toán trồng cây lớp 4: Có 4 mét hàng rào, cách 1 mét trồng 1 cây thì mấy khoảng và mấy cây?
Tính số dòng cũng vậy: Số dòng (a) = cuối trừ đầu +1.
Quy luật rành rành trước mắt: từ 6 đến 6 là 1 dòng, từ 6 đến 7 là 2 dòng, thì quy luật là 6-6+1 và 7-6 +1 chứ là gì. Quen copy riết rồi đầu óc trở thành đậu hũ
 
Upvote 0
Quay về bài toán trồng cây lớp 4: Có 4 mét hàng rào, cách 1 mét trồng 1 cây thì mấy khoảng và mấy cây?
Tính số dòng cũng vậy: Số dòng (a) = cuối trừ đầu +1.
Quy luật rành rành trước mắt: từ 6 đến 6 là 1 dòng, từ 6 đến 7 là 2 dòng, thì quy luật là 6-6+1 và 7-6 +1 chứ là gì. Quen copy riết rồi đầu óc trở thành đậu hũ
Vâng.Untitled.jpg
a = 0 nghĩa là bàng dữ liệu có 1 dòng
a > 0 đang có 2 dòng trở lên.
Bệnh là do: Có 1 dòng: DataArr là giá trị đơn, xét trực tiếp không cần vòng lặp (bao gồm StoreCode và SoreQty) là câu này ạ!
Nhưng vẫn chưa hiểu sao nó không thấy 1 tỷ đâu ạ :wallbash:
 
Lần chỉnh sửa cuối:
Upvote 0
Vâng.View attachment 255557
a = 0 nghĩa là bàng dữ liệu có 1 dòng
a > 0 đang có 2 dòng trở lên.
Nhưng vẫn chưa hiểu sao nó không thấy 1 tỷ đâu ạ :wallbash:
Vụ chỉ có 1 dòng 1 cột, 1 mình ên không tạo được "chợ" mảng, có thể xử lý đơn giản là mượn người kế bên, lấy 2 cột
StoreCode = .Range(.Cells(RowArrCode(Seq), ColumnArrCode(Seq)), _
.Cells(DataRwCode, ColumnArrCode(Seq)+1)).Value
 
Upvote 0
Đã hoàn thành nà ná na, giờ đã hiểu DataArr là giá trị đơn, xét trực tiếp không cần vòng lặp (bao gồm StoreCode và SoreQty) là câu này ạ!
PHP:
Sub Dict_Episode_8_finish()
Dim DataRw As Long, i As Long, sKey As String
Dim Dict, SArr(), RArr(), txt As String, txt2 As String
Dim ShArr, ColumnArrCode, RowArrCode, ColumnArrQty, RowArrQty, StoreCode, StoreQty
Set Dict = CreateObject("Scripting.Dictionary")
ShArr = Array(2, 3, 4, 5, 6, 7, 8)
ColumnArrCode = Array(2, 4, 7, 3, 12, 12, 2)
RowArrCode = Array(7, 19, 10, 12, 11, 8, 6)
ColumnArrQty = Array(8, 14, 20, 7, 4, 6, 7)
RowArrQty = Array(9, 7, 15, 4, 17, 13, 13)
For Seq = 0 To 6
    With Sheets(ShArr(Seq))
        DataRwCode = .Cells(1000000, ColumnArrCode(Seq)).End(xlUp).Row
        DataRwQty = .Cells(1000000, ColumnArrQty(Seq)).End(xlUp).Row
        StoreCode = .Range(.Cells(RowArrCode(Seq), ColumnArrCode(Seq)), _
        .Cells(DataRwCode, ColumnArrCode(Seq))).Value
        StoreQty = .Range(.Cells(RowArrQty(Seq), ColumnArrQty(Seq)), _
        .Cells(DataRwQty, ColumnArrQty(Seq))).Value
        a = DataRwCode - RowArrCode(Seq)
            If (a = 0) Then
'=====================================================================
'Toàn bộ đoạn code trong khoảng đánh dấu này thật nhớ đời
                mc = .Range(.Cells(RowArrCode(Seq), ColumnArrCode(Seq)), _
                .Cells(DataRwCode, ColumnArrCode(Seq))).Value
                mq = .Range(.Cells(RowArrQty(Seq), ColumnArrQty(Seq)), _
                .Cells(DataRwQty, ColumnArrQty(Seq))).Value
                txt = Mid(mc, 1, 2)
                txt2 = Mid(mc, 3, 2)
                If (IsEmpty(mc) = False And Len(mc) = 4 And txt = "MH" And IsNumeric(txt2) = True _
                And IsEmpty(mq) = False And IsNumeric(mq) = True) Then
                    sKey = mc
                    If Not Dict.exists(sKey) Then
                        Dict.Add sKey, mc
                    Else
                        Dict.Item(sKey) = Dict.Item(sKey) + mq
                    End If
                End If
            End If
'=======================================================================
            If (a > 0) Then
            For i = 1 To UBound(StoreCode, 1)
                mc = StoreCode(i, 1): mq = StoreQty(i, 1): txt = Mid(mc, 1, 2): txt2 = Mid(mc, 3, 2)
                If (IsEmpty(mc) = False And Len(mc) = 4 And txt = "MH" And IsNumeric(txt2) = True _
                And IsEmpty(mq) = False And IsNumeric(mq) = True) Then
                    sKey = StoreCode(i, 1)
                    If Not Dict.exists(sKey) Then
                        Dict.Add sKey, StoreQty(i, 1)
                    Else
                        Dict.Item(sKey) = Dict.Item(sKey) + StoreQty(i, 1)
                    End If
                End If
            Next
            End If
        End With
Next Seq
With Sheets("Data")
SArr = .Range(.Cells(3, 2), .Cells(1000000, 2).End(xlUp)).Value
ReDim RArr(1 To UBound(SArr, 1), 1 To 1)
For i = 1 To UBound(SArr, 1)
    If Dict.exists(SArr(i, 1)) Then
        RArr(i, 1) = Dict.Item(SArr(i, 1))
    Else
        RArr(i, 1) = 0
    End If
Next

.Range("D3").Resize(UBound(SArr, 1), 1) = RArr
End With
End Sub
Bài đã được tự động gộp:

Vụ chỉ có 1 dòng 1 cột, 1 mình ên không tạo được "chợ" mảng, có thể xử lý đơn giản là mượn người kế bên, lấy 2 cột
StoreCode = .Range(.Cells(RowArrCode(Seq), ColumnArrCode(Seq)), _
.Cells(DataRwCode, ColumnArrCode(Seq)+1)).Value
Tạm thời em chưa test theo cách thầy được. Nhưng chỗ a = 0 vì có 1 dòng nên mảng là một giá trị , không truy xuất theo kiểu Arr(i,j) được nên phải khuân cả tảng theo dấu bằng của nó!
Chỗ đoan code xét a = 0 ấy thầy!
PHP:
- Nếu 1 giá trị mà gán StoreCode lỗi ngay
Phải gán  .Range(.Cells(RowArrCode(Seq), ColumnArrCode(Seq)),.Cells(DataRwCode, ColumnArrCode(Seq))).Value
- Và  StoreQty lỗi phải gán .Range(.Cells(RowArrQty(Seq), ColumnArrQty(Seq)), .Cells(DataRwQty, ColumnArrQty(Seq))).Value
Thì mới được thầy @HieuCD ơi.
Vẫn biết Array là cao cấp, đến đây được Chú chỉ cho mà mãi mới mò ra được ạ! Sướng thiệt. Nhớ đời!
 
Lần chỉnh sửa cuối:
Upvote 0
Đã hoàn thành nà ná na, giờ đã hiểu DataArr là giá trị đơn, xét trực tiếp không cần vòng lặp (bao gồm StoreCode và SoreQty) là câu này ạ!
PHP:
Sub Dict_Episode_8_finish()
Dim DataRw As Long, i As Long, sKey As String
Dim Dict, SArr(), RArr(), txt As String, txt2 As String
Dim ShArr, ColumnArrCode, RowArrCode, ColumnArrQty, RowArrQty, StoreCode, StoreQty
Set Dict = CreateObject("Scripting.Dictionary")
ShArr = Array(2, 3, 4, 5, 6, 7, 8)
ColumnArrCode = Array(2, 4, 7, 3, 12, 12, 2)
RowArrCode = Array(7, 19, 10, 12, 11, 8, 6)
ColumnArrQty = Array(8, 14, 20, 7, 4, 6, 7)
RowArrQty = Array(9, 7, 15, 4, 17, 13, 13)
For Seq = 0 To 6
    With Sheets(ShArr(Seq))
        DataRwCode = .Cells(1000000, ColumnArrCode(Seq)).End(xlUp).Row
        DataRwQty = .Cells(1000000, ColumnArrQty(Seq)).End(xlUp).Row
        StoreCode = .Range(.Cells(RowArrCode(Seq), ColumnArrCode(Seq)), _
        .Cells(DataRwCode, ColumnArrCode(Seq))).Value
        StoreQty = .Range(.Cells(RowArrQty(Seq), ColumnArrQty(Seq)), _
        .Cells(DataRwQty, ColumnArrQty(Seq))).Value
        a = DataRwCode - RowArrCode(Seq)
            If (a = 0) Then
'=====================================================================
'Toàn bộ đoạn code trong khoảng đánh dấu này thật nhớ đời
                mc = .Range(.Cells(RowArrCode(Seq), ColumnArrCode(Seq)), _
                .Cells(DataRwCode, ColumnArrCode(Seq))).Value
                mq = .Range(.Cells(RowArrQty(Seq), ColumnArrQty(Seq)), _
                .Cells(DataRwQty, ColumnArrQty(Seq))).Value
                txt = Mid(mc, 1, 2)
                txt2 = Mid(mc, 3, 2)
                If (IsEmpty(mc) = False And Len(mc) = 4 And txt = "MH" And IsNumeric(txt2) = True _
                And IsEmpty(mq) = False And IsNumeric(mq) = True) Then
                    sKey = mc
                    If Not Dict.exists(sKey) Then
                        Dict.Add sKey, mc
                    Else
                        Dict.Item(sKey) = Dict.Item(sKey) + mq
                    End If
                End If
            End If
'=======================================================================
            If (a > 0) Then
            For i = 1 To UBound(StoreCode, 1)
                mc = StoreCode(i, 1): mq = StoreQty(i, 1): txt = Mid(mc, 1, 2): txt2 = Mid(mc, 3, 2)
                If (IsEmpty(mc) = False And Len(mc) = 4 And txt = "MH" And IsNumeric(txt2) = True _
                And IsEmpty(mq) = False And IsNumeric(mq) = True) Then
                    sKey = StoreCode(i, 1)
                    If Not Dict.exists(sKey) Then
                        Dict.Add sKey, StoreQty(i, 1)
                    Else
                        Dict.Item(sKey) = Dict.Item(sKey) + StoreQty(i, 1)
                    End If
                End If
            Next
            End If
        End With
Next Seq
With Sheets("Data")
SArr = .Range(.Cells(3, 2), .Cells(1000000, 2).End(xlUp)).Value
ReDim RArr(1 To UBound(SArr, 1), 1 To 1)
For i = 1 To UBound(SArr, 1)
    If Dict.exists(SArr(i, 1)) Then
        RArr(i, 1) = Dict.Item(SArr(i, 1))
    Else
        RArr(i, 1) = 0
    End If
Next

.Range("D3").Resize(UBound(SArr, 1), 1) = RArr
End With
End Sub
Bài đã được tự động gộp:


Chỗ đoan code xét a = 0 ấy thầy!
PHP:
- Nếu 1 giá trị mà gán StoreCode lỗi ngay
Phải gán  .Range(.Cells(RowArrCode(Seq), ColumnArrCode(Seq)),.Cells(DataRwCode, ColumnArrCode(Seq))).Value
- Và  StoreQty lỗi phải gán .Range(.Cells(RowArrQty(Seq), ColumnArrQty(Seq)), .Cells(DataRwQty, ColumnArrQty(Seq))).Value
Thì mới được thầy @HieuCD ơi.
Vẫn biết Array là cao cấp, đến đây được Chú chỉ cho mà mãi mới mò ra được ạ! Sướng thiệt. Nhớ đời!
Lấy 2 cột, a=0 hay a>0 đều ngon
 
Upvote 0
Lấy 2 cột, a=0 hay a>0 đều ngon
Vậy ạ. Mai em test để tổng hợp các bài trong top này lại ạ! Thầy đi nghỉ sớm ạ!
Chú Mỹ chưa đi ngủ sao? Túm lại thay vì nhẹ nhàng xách theo StoreCode và StoreQty thì phải khuân tất cả các thứ cồng kềnh sau dấu bằng của nó vào trường hợp a = 0 chú ạ. Thế mới hiểu cái mảng Arr(i) và Arr(i,j) là gì đấy chú Mỹ ạ!
 
Upvote 0
Vậy ạ. Mai em test để tổng hợp các bài trong top này lại ạ! Thầy đi nghỉ sớm ạ!
Chú Mỹ chưa đi ngủ sao? Túm lại thay vì nhẹ nhàng xách theo StoreCode và StoreQty thì phải khuân tất cả các thứ cồng kềnh sau dấu bằng của nó vào trường hợp a = 0 chú ạ. Thế mới hiểu cái mảng Arr(i) và Arr(i,j) là gì đấy chú Mỹ ạ!
Mới hơn 10 giờ sáng :)
Chúc ngủ ngon
 
Upvote 0
Vậy ạ. Mai em test để tổng hợp các bài trong top này lại ạ! Thầy đi nghỉ sớm ạ!
Chú Mỹ chưa đi ngủ sao? Túm lại thay vì nhẹ nhàng xách theo StoreCode và StoreQty thì phải khuân tất cả các thứ cồng kềnh sau dấu bằng của nó vào trường hợp a = 0 chú ạ. Thế mới hiểu cái mảng Arr(i) và Arr(i,j) là gì đấy chú Mỹ ạ!
Lấy Arr thêm cột là 1 giải pháp khiến cho viết code nhẹ nhàng nhưung với dữ liệu lớn (vài trăm ngàn, 1 triệu) thì tổn hao bộ nhớ. Nhất là 6/7 cửa hàng có dữ liệu nhiều, chỉ 1 cửa hàng có 1 dòng.
Còn mục số 3: mặt hàng #$% chưa có trong danh mục sẽ có 3 tuỳ chọn:
- Buộc người dùng phải khai báo trước rồi mới được mua bán, nếu không thì mất doanh số ráng chịu
- Thêm 1 vòng lặp duyệt Dict, nếu chưa có trong danh mục thì thêm 1 dòng vào danh mục
- Dùng 1 mảng kết quả song song với Dict, mảng này có thể có nhiều cột như Mã, Tên, SL. Số lượng không cộng dồn trên item của Dict mà cộng dồn trên cột SL của mảng kết quả. Cuối cùng đập 1 phát kết quả xuống sheet.

Không bao giờ xét cấu trúc mã. Mã nếu toàn ký tự chữ hay toàn ký số, hay mã dài 10 ký tự chữ và số lẫn lộn, lấy gì phân biệt
 
Upvote 0
Lấy Arr thêm cột là 1 giải pháp khiến cho viết code nhẹ nhàng nhưung với dữ liệu lớn (vài trăm ngàn, 1 triệu) thì tổn hao bộ nhớ. Nhất là 6/7 cửa hàng có dữ liệu nhiều, chỉ 1 cửa hàng có 1 dòng.
Còn mục số 3: mặt hàng #$% chưa có trong danh mục sẽ có 3 tuỳ chọn:
- Buộc người dùng phải khai báo trước rồi mới được mua bán, nếu không thì mất doanh số ráng chịu
- Thêm 1 vòng lặp duyệt Dict, nếu chưa có trong danh mục thì thêm 1 dòng vào danh mục
- Dùng 1 mảng kết quả song song với Dict, mảng này có thể có nhiều cột như Mã, Tên, SL. Số lượng không cộng dồn trên item của Dict mà cộng dồn trên cột SL của mảng kết quả. Cuối cùng đập 1 phát kết quả xuống sheet.

Không bao giờ xét cấu trúc mã. Mã nếu toàn ký tự chữ hay toàn ký số, hay mã dài 10 ký tự chữ và số lẫn lộn, lấy gì phân biệt
Vâng ạ. Khả năng có thức thứ 9 chăng? Cháu cố gắng biên tập lại Top này, vì nó như cái đề cương mà lại ra sản phẩm dùng được luôn. Hay nhất là có chỗ sai, rồi sửa sai. Rất có khả năng với Top này có rất nhiều người 1 tuần là trang bị đủ kiến thức để tự học và đọc code được.
 
Lần chỉnh sửa cuối:
Upvote 0
Chị em thôi, em mới 18+. Gọi chị là tỷ tỷ rồi.
- Hồi đi học đại học cả lớp không ai làm thêm tải trong động đất trong đồ án tốt nghiệp. Mỗi mình muội vì yêu thích nên lao vào làm. Hội bạn thì cứ file excel cũ, bản vẽ cũ để sửa lại. Còn muội phải tự thiết kế file excel cho riêng mình và bản vẽ cực kỳ mất công
- Nhưng đến giáp năm mới năm nay thời điểm đó quay lại diễn đàn còn không nhớ được gì Excel ấy. Nhân covi covit mới thấy cái các cái file ngày xưa mình viết sao nặng quá thể. Nên mới học VBA. Mà tính em đã học là phải học kỳ được. Rồi giờ cảm thấy hiểu được code và tự kiếm tài liệu được. Cực nhưng vui thật!
Thời teen ai chả từng tài năng một cách đặc biệt, những ý tưởng vượt thời gian vượt không gian, tầm cỡ 10 năm 20 năm sau thì những công nghệ đương thời mới phát triển kịp để giải quyết các ý tưởng ngày đò. Muội học ngành ghì mà "excel, bản vẻ cũ, vba..."
 
Upvote 0
Đây cũng là một phần rất cơ bản nhưng không kém quan trọng. Bài này của mình biên soạn nên nhìn có vẻ hơi ngố xíu.
Mã:
Sub Chon_1_Cell_Da_Biet_1()
Range("A1").Select
End Sub
Sub Chon_1_Cell_Da_Biet_2()
[A1].Select
End Sub
Sub Chon_1_Cell_Da_Biet_3()
Cells(1, 1).Select
End Sub
Sub Chon_1_Cell_Da_Biet_4()
Cells(1, "A").Select
End Sub
Sub Chon_1_Cell_Da_Biet_5()
Range("A" & 1).Select
End Sub
Sub Chon_1_Vung_Da_Biet_1()
Range("A1:B5").Select
End Sub
Sub Chon_1_Vung_Da_Biet_2()
[A1:B5].Select
End Sub
Sub Chon_1_Vung_Da_Biet_3()
Range("A1:B" & 5).Select
End Sub
Sub Chon_1_Vung_Da_Biet_4()
Range("A" & 1 & ":B5").Select
End Sub
Sub Chon_2_Vung_Da_Biet_Khong_Lien_Tuc_1()
Range("B1:B5,D3:D10").Select
End Sub
Sub Chon_2_Vung_Da_Biet_Khong_Lien_Tuc_2()
Union(Range("B1:B5"), Range("D1:D5")).Select
End Sub
Sub Chon_2_Vung_Da_Biet_Khong_Lien_Tuc_3()
Union([B1:B5], [D1:D5]).Select
End Sub
Sub Chon_1_Cot_1()
Range("C:C").Select
End Sub
Sub Chon_1_Cot_2()
Range("C1").EntireColumn.Select
End Sub
Sub Chon_1_Cot_3()
Cells(1, 3).EntireColumn.Select
End Sub
Sub Chon_1_Cot_4()
Cells(1, "C").EntireColumn.Select
End Sub
Sub Chon_1_Cot_5()
Range("C" & 1).EntireColumn.Select
End Sub
Sub Chon_1_Cot_6()
Columns("C").Select
End Sub
Sub Chon_1_Cot_7()
Columns(3).Select
End Sub
Sub Chon_Nhieu_Cot_Lien_Tiep_1()
Range("C:E").Select
End Sub
Sub Chon_Nhieu_Cot_Lien_Tiep_2()
Columns("C:E").Select
End Sub
Sub Chon_Nhieu_Cot_Khong_Lien_Tiep()
Range("A:B,E:E,G:H").Select
End Sub
Sub Chon_1_Dong_1()
Range("3:3").Select
End Sub
Sub Chon_1_Dong_2()
Rows(3).Select
End Sub
Sub Chon_1_Dong_3()
Cells(3, 1).EntireRow.Select
End Sub
Sub Chon_1_Dong_4()
Cells(3, "A").EntireRow.Select
End Sub
Sub Chon_1_Dong_5()
Range("A" & 3).EntireRow.Select
End Sub
Sub Chon_1_Dong_6()
Range("A3").EntireRow.Select
End Sub
Sub Chon_Nhieu_Dong_Lien_Tiep_1()
Range("3:5").Select
End Sub
Sub Chon_Nhieu_Dong_Lien_Tiep_2()
Rows("3:5").Select
End Sub
Sub Chon_Nhieu_Dong_Khong_Lien_Tiep()
Union(Rows(3), Rows(5)).Select
End Sub
Sub Chon_1_Vung_Chua_Biet_Dong_Cuoi_1()
Range("A6", Range("I" & Rows.Count).End(3)).Select
End Sub
Sub Chon_1_Vung_Chua_Biet_Dong_Cuoi_2()
Range("A6", Range("A" & Rows.Count).End(3)).Resize(, 9).Select
End Sub
Sub Chon_1_Vung_Chua_Biet_Dong_Cuoi_Cot_Cuoi()
Dim LastRow As Long, LastCol As Long
LastRow = Range("A" & Rows.Count).End(3).Row
LastCol = Range("IV4").End(xlToLeft).Column
Range("A6", Range("A" & LastRow)).Resize(, LastCol).Select
End Sub
 
Upvote 0
Hic hic dồn nhiều việc quá mà bài 9 lại mới toanh với cháu!
Ở các bài trước trong TOP này thì Sheets("Data") có cột Mã và Tên mặt hàng. Nhưng đến bài số 9,Sheets("Datat") chẳng có gì (chết dở, toi thật ấy chứ)
khongdanhsach.jpg
Vậy thì làm cho Sheets("Data") ,nó có danh sách rồi, ốp bài 8 vào là ok
- Bài tập số 9 áp dụng Dictionary (cách đặt tên theo quy định)
- Mong chú Mỹ và các thầy cho cháu(em) cách giải thứ 2,3... để cháu có thể biên tập lại Top này.
- Sau đây là thức thứ 9 Dictionary Bí Truyền - Cửu Âm Chân Kinh (cái này em đặt)
PHP:
Sub Dict_Episode_9()
Dim DataRw As Long, sKey As String, Dict, RArr()
Set Dict = CreateObject("Scripting.Dictionary")
ShArr = Array(2, 3, 4, 5, 6, 7, 8)
ColumnArrCode = Array(2, 4, 7, 3, 12, 12, 2)
RowArrCode = Array(7, 19, 10, 12, 11, 8, 6)
ColumnArrQty = Array(8, 14, 20, 7, 4, 6, 7)
RowArrQty = Array(9, 7, 15, 4, 17, 13, 13)
ColumArrName = Array(5, 9, 12, 5, 8, 9, 4)
RowArrName = Array(4, 14, 14, 17, 21, 16, 10)
For Seq = 0 To 6
    With Sheets(ShArr(Seq))
        DataRwCode = .Cells(1000000, ColumnArrCode(Seq)).End(xlUp).Row
        DataRwQty = .Cells(1000000, ColumnArrQty(Seq)).End(xlUp).Row
        DataRwName = .Cells(1000000, ColumArrName(Seq)).End(xlUp).Row
        StoreCode = .Range(.Cells(RowArrCode(Seq), ColumnArrCode(Seq)), _
        .Cells(DataRwCode, ColumnArrCode(Seq) + 1)).Value
        StoreQty = .Range(.Cells(RowArrQty(Seq), ColumnArrQty(Seq)), _
        .Cells(DataRwQty, ColumnArrQty(Seq) + 1)).Value
        ItemsName = .Range(.Cells(RowArrName(Seq), ColumArrName(Seq)), _
        .Cells(DataRwName, ColumArrName(Seq) + 1)).Value
         For i = 1 To UBound(StoreCode, 1)
                mc = StoreCode(i, 1): mq = StoreQty(i, 1): txt = Mid(mc, 1, 2): txt2 = Mid(mc, 3, 2)
                If (IsEmpty(mc) = False And Len(mc) = 4 And txt = "MH" And IsNumeric(txt2) = True _
                And IsEmpty(mq) = False And IsNumeric(mq) = True) Then
                    sKey = StoreCode(i, 1) & "|" & ItemsName(i, 1)
                    If Not Dict.exists(sKey) Then
                        Dict.Add sKey, StoreQty(i, 1)
                    Else
                        Dict.Item(sKey) = Dict.Item(sKey) + StoreQty(i, 1)
                    End If
                End If
        Next
    End With
Next Seq
For i = 1 To Dict.Count
    Sheets("Data").Cells(i + 2, 2).Value = Split(Dict.keys()(i - 1), "|")(0)
    Sheets("Data").Cells(i + 2, 3).Value = Split(Dict.keys()(i - 1), "|")(1)
Next i
Sheets("Data").Range("B3:C" & Dict.Count).Sort [B3], xlAscending
With Sheets("Data")
SArr = .Range(.Cells(3, 2), .Cells(1000000, 3).End(xlUp)).Value
ReDim RArr(1 To UBound(SArr, 1), 1 To 1)
For i = 1 To UBound(SArr, 1)
    sKey = SArr(i, 1) & "|" & SArr(i, 2)
    If Dict.exists(SArr(i, 1) & "|" & SArr(i, 2)) Then
        RArr(i, 1) = Dict.Item(SArr(i, 1) & "|" & SArr(i, 2))
    Else
        RArr(i, 1) = 0
    End If
Next
.Range("D3").Resize(UBound(SArr, 1), 1) = RArr
End With
End Sub
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
- Bài tập số 9 áp dụng Dictionary (cách đặt tên theo quy định)
Bài 147 có chữ nào hay câu nào không hiểu vậy?
Trích 147:
- Dùng 1 mảng kết quả song song với Dict, mảng này có thể có nhiều cột như Mã, Tên, SL. Số lượng không cộng dồn trên item của Dict mà cộng dồn trên cột SL của mảng kết quả. Cuối cùng đập 1 phát kết quả xuống sheet.

Không bao giờ xét cấu trúc mã. Mã nếu toàn ký tự chữ hay toàn ký số, hay mã dài 10 ký tự chữ và số lẫn lộn, lấy gì phân biệt
 
Upvote 0
Bài 147 có chữ nào hay câu nào không hiểu vậy?
Trích 147:
- Dùng 1 mảng kết quả song song với Dict, mảng này có thể có nhiều cột như Mã, Tên, SL. Số lượng không cộng dồn trên item của Dict mà cộng dồn trên cột SL của mảng kết quả. Cuối cùng đập 1 phát kết quả xuống sheet.

Không bao giờ xét cấu trúc mã. Mã nếu toàn ký tự chữ hay toàn ký số, hay mã dài 10 ký tự chữ và số lẫn lộn, lấy gì phân biệt
Vâng. Để ( ) nếu người nào bảo đặt tên kiểu giật gân, sợ bị nhòm nên có thòng câu đó vào cho chắc ạ.
Khi ngồi máy tính cháu chỉnh lại code. Cách chú bảo cháu không tưởng tượng ra. Với lại ham biểu diễn tý key chuỗi, mà cũng chưa có bài nào trong top áp dụng ạ (câu views ạ )
 
Lần chỉnh sửa cuối:
Upvote 0
Vâng. Để ( ) nếu người nào bảo đặt tên kiểu giật gân, sợ bị nhòm nên có thòng câu đó vào cho chắc ạ.
Khi ngồi máy tính cháu chỉnh lại code. Cách chú bảo cháu không tưởng tượng ra. Với lại biểu diễn tý key chuỗi, nó ứng dụng cao ạ
Câu hỏi đơn giản vậy mà trả lời đâu đâu á. Câu sau đây, đọc chậm, đọc kỹ, và nhớ lại xem đã từng nói bao nhiêu lần, mà cứ tự làm theo ý mình?
Không bao giờ xét cấu trúc mã
Khi người dùng tự ý đặt mã và chấp nhận thêm mã của người ta thì xét làm gì? Thí dụ người ta đặt mã MaH105, một là thêm mã vào danh mục, hai là chấp nhận.
 
Upvote 0
Câu hỏi đơn giản vậy mà trả lời đâu đâu á. Câu sau đây, đọc chậm, đọc kỹ, và nhớ lại xem đã từng nói bao nhiêu lần, mà cứ tự làm theo ý mình?
Không bao giờ xét cấu trúc mã
Khi người dùng tự ý đặt mã và chấp nhận thêm mã của người ta thì xét làm gì? Thí dụ người ta đặt mã MaH105, một là thêm mã vào danh mục, hai là chấp nhận.
Dạ. Cháu sẽ sửa lại khi ngồi máy tính ạ. Chỉ để điều kiện Qty là không trống và là số là đc ạ
 
Upvote 0
Dạ. Cháu sẽ sửa lại khi ngồi máy tính ạ. Chỉ để điều kiện Qty là không trống và là số là đc ạ
Nếu đang sửa thì làm 2 chuyện:
- Không xét cấu trúc mã
- Sử dụng 1 mảng kết quả 3 cột, bớt 1 vòng lặp for. Đọc lại câu: "Số lượng không cộng dồn trên item của Dict mà cộng dồn trên cột SL của mảng kết quả. Cuối cùng đập 1 phát kết quả xuống sheet."
Gợi ý:
- item của Dict là thứ tự dòng của mảng kết quả.
- Số dòng của mảng kết quả chưa biết thì khi Redim lấy tạm 2 lần số dòng của danh mục gốc với giả định là số mã tự ý đặt thêm không nhiều quá đến thế
 
Upvote 0
Nếu đang sửa thì làm 2 chuyện:
- Không xét cấu trúc mã
- Sử dụng 1 mảng kết quả 3 cột, bớt 1 vòng lặp for. Đọc lại câu: "Số lượng không cộng dồn trên item của Dict mà cộng dồn trên cột SL của mảng kết quả. Cuối cùng đập 1 phát kết quả xuống sheet."
Gợi ý:
- item của Dict là thứ tự dòng của mảng kết quả.
- Số dòng của mảng kết quả chưa biết thì khi Redim lấy tạm 2 lần số dòng của danh mục gốc với giả định là số mã tự ý đặt thêm không nhiều quá đến thế
PHP:
...............................
sKey = StoreCode(i, 1)
If Not Dict.exists(sKey) Then
   j = j + 1
Dict.Add sKey, j
..............................
ReDim Res(1 to Dict.count, 1 to 3)
Rồi truyền sang mảng kết quả
Res(j,1) = sKey
Res(j,2) = ItemsName(i, 1)
Res(Dict.Item(sKey),3) = Res(Dict.Item(sKey),3) + StoreoQty(i, 1)
Cách này cháu làm hoài không được
Còn bài 9 cháu post lên: MH30 = Mặt hàng 29 hay là do dòng lệnh Sort chú nhỉ. Không sửa nổi, xin chú chỉ lỗi 2 cách cháu với!
Tại sao bài 9 cháu post lên lại có hiện tượng MH30 = Mặt hàng 29 vậy chú nhỉ (file dữ liệu 3 cột so le nhau đồng thời rồi ạ)
 
Lần chỉnh sửa cuối:
Upvote 0
Upvote 0
- Nghĩa là cách làm key chuỗi đúng rồi ạ.
- Còn cách gán ra mảng kết quả Res nếu không phải tạo Key chuỗi thì làm sao dồn được cột Tên ạ?

ReDim Res(1 to Dict.count, 1 to 3)
Rồi truyền sang mảng kết quả
Res(j,1) = sKey
Res(j,2) = ItemsName(i, 1)
Res(Dict.Item(sKey),3) = Res(Dict.Item(sKey),3) + StoreoQty(i, 1)


- Mảng kết quả song song Dict tức là chưa có Dict.Count, làm sao Redim Dict.Count được
- Nếu skey không tồn tại mới gán 3 cột kết quả, ngược lại sKey tồn tại thì cộng dồn. Thế mới là song song và loại bỏ vòng lặp. Code dưới đây 1 vòng lặp duy nhất chứ không phải 3
PHP:
Sub Dict_Episode_9()
Dim DataRw As Long, sKey As String, Dict, RArr()
Dim ShArr, ColumnArrCode, RowArrCode, ColumnArrQty, RowArrQty, ColumnArrName, RowArrName
Dim DataRwCode As Long, DataRwQty As Long, DataRwName As Long
Dim StoreCode, StoreQty, ItemsName
Set Dict = CreateObject("Scripting.Dictionary")
ShArr = Array(2, 3, 4, 5, 6, 7, 8)
ColumnArrCode = Array(2, 4, 7, 3, 12, 12, 2)
RowArrCode = Array(7, 19, 10, 12, 11, 8, 6)
ColumnArrQty = Array(8, 14, 20, 7, 4, 6, 7)
RowArrQty = Array(9, 7, 15, 4, 17, 13, 13)
ColumArrName = Array(5, 9, 12, 5, 8, 9, 4)
RowArrName = Array(4, 14, 14, 17, 21, 16, 10)
ReDim RArr(1 To 100, 1 To 3)
For Seq = 0 To 6
    With Sheets(ShArr(Seq))
        DataRwCode = .Cells(1000000, ColumnArrCode(Seq)).End(xlUp).Row
        DataRwQty = .Cells(1000000, ColumnArrQty(Seq)).End(xlUp).Row
        DataRwName = .Cells(1000000, ColumArrName(Seq)).End(xlUp).Row
        StoreCode = .Range(.Cells(RowArrCode(Seq), ColumnArrCode(Seq)), _
        .Cells(DataRwCode, ColumnArrCode(Seq) + 1)).Value
        StoreQty = .Range(.Cells(RowArrQty(Seq), ColumnArrQty(Seq)), _
        .Cells(DataRwQty, ColumnArrQty(Seq) + 1)).Value
        ItemsName = .Range(.Cells(RowArrName(Seq), ColumArrName(Seq)), _
        .Cells(DataRwName, ColumArrName(Seq) + 1)).Value
         For i = 1 To UBound(StoreCode, 1)
                mc = StoreCode(i, 1): mq = StoreQty(i, 1)
                If IsEmpty(mc) = False And IsEmpty(mq) = False Then
                    sKey = StoreCode(i, 1)
                    If Not Dict.exists(sKey) Then
                        k = k + 1
                        Dict.Add sKey, k
                        RArr(k, 1) = sKey
                        RArr(k, 2) = ItemsName(i, 1)
                        RArr(k, 3) = StoreQty(i, 1)
                    Else
                        RArr(Dict.Item(sKey), 3) = RArr(Dict.Item(sKey), 3) + StoreQty(i, 1)
                    End If
                End If
        Next
    End With
Next Seq
With Sheets("Data")
    .Range("B3:D100").ClearContents
    .Range("B3").Resize(k, 3) = RArr
    .Range("B2").Resize(k + 1, 3).Sort Range("B2"), xlAscending, Header:=xlYes
End With
End Sub

1616170301375.png
 
Upvote 0
- Mảng kết quả song song Dict tức là chưa có Dict.Count, làm sao Redim Dict.Count được
- Nếu skey không tồn tại mới gán 3 cột kết quả, ngược lại sKey tồn tại thì cộng dồn. Thế mới là song song và loại bỏ vòng lặp. Code dưới đây 1 vòng lặp duy nhất chứ không phải 3
PHP:
Sub Dict_Episode_9()
Dim DataRw As Long, sKey As String, Dict, RArr()
Dim ShArr, ColumnArrCode, RowArrCode, ColumnArrQty, RowArrQty, ColumnArrName, RowArrName
Dim DataRwCode As Long, DataRwQty As Long, DataRwName As Long
Dim StoreCode, StoreQty, ItemsName
Set Dict = CreateObject("Scripting.Dictionary")
ShArr = Array(2, 3, 4, 5, 6, 7, 8)
ColumnArrCode = Array(2, 4, 7, 3, 12, 12, 2)
RowArrCode = Array(7, 19, 10, 12, 11, 8, 6)
ColumnArrQty = Array(8, 14, 20, 7, 4, 6, 7)
RowArrQty = Array(9, 7, 15, 4, 17, 13, 13)
ColumArrName = Array(5, 9, 12, 5, 8, 9, 4)
RowArrName = Array(4, 14, 14, 17, 21, 16, 10)
ReDim RArr(1 To 100, 1 To 3)
For Seq = 0 To 6
    With Sheets(ShArr(Seq))
        DataRwCode = .Cells(1000000, ColumnArrCode(Seq)).End(xlUp).Row
        DataRwQty = .Cells(1000000, ColumnArrQty(Seq)).End(xlUp).Row
        DataRwName = .Cells(1000000, ColumArrName(Seq)).End(xlUp).Row
        StoreCode = .Range(.Cells(RowArrCode(Seq), ColumnArrCode(Seq)), _
        .Cells(DataRwCode, ColumnArrCode(Seq) + 1)).Value
        StoreQty = .Range(.Cells(RowArrQty(Seq), ColumnArrQty(Seq)), _
        .Cells(DataRwQty, ColumnArrQty(Seq) + 1)).Value
        ItemsName = .Range(.Cells(RowArrName(Seq), ColumArrName(Seq)), _
        .Cells(DataRwName, ColumArrName(Seq) + 1)).Value
         For i = 1 To UBound(StoreCode, 1)
                mc = StoreCode(i, 1): mq = StoreQty(i, 1)
                If IsEmpty(mc) = False And IsEmpty(mq) = False Then
                    sKey = StoreCode(i, 1)
                    If Not Dict.exists(sKey) Then
                        k = k + 1
                        Dict.Add sKey, k
                        RArr(k, 1) = sKey
                        RArr(k, 2) = ItemsName(i, 1)
                        RArr(k, 3) = StoreQty(i, 1)
                    Else
                        RArr(Dict.Item(sKey), 3) = RArr(Dict.Item(sKey), 3) + StoreQty(i, 1)
                    End If
                End If
        Next
    End With
Next Seq
With Sheets("Data")
    .Range("B3:D100").ClearContents
    .Range("B3").Resize(k, 3) = RArr
    .Range("B2").Resize(k + 1, 3).Sort Range("B2"), xlAscending, Header:=xlYes
End With
End Sub

View attachment 255747
- Tuyệt đẹp. Loay hoay mãi cách ghi chỉ số dòng mà không được. Rồi đâm ra nghi ngờ do mảng nó không liên tục nên không làm được rồi, mà so với code thầy thì thiếu chỗ ước lượng chiều thứ nhất của mảng kết quả song song, và thiếu RArr(k,3) = StoreQty(i,1) nhưng giờ thì tường tận rồi ạ.
 
Lần chỉnh sửa cuối:
Upvote 0
- Vậy đã đến thức cuối cùng Cửu Âm Chân Kinh rồi, thức này có 2 chiêu: 1 là dùng Key nối chuỗi, 2 là ghi lại chỉ số dòng rồi gán vào mảng kết quả(chi tiết và data chuẩn file đính kèm, 2 Sub đều sử dụng lệnh Sort nên các bạn phải ở Sheets("Data" mới Run chạy Code nhé)
- Và đã qua tháng Giêng, năm 2021 Tân Sửu là 1 tuần rồi. Vèo 1 cái hết tháng Giêng. Được thầy @ptm0412 dìu dắt đã đến bài số 9 xử dụng Dictionary. Các bài tập trong TOP rất đa dạng và bao trùm các trường hợp, mà người mới học có thể áp dụng được luôn sau 1 tiếng là ra được kết quả mong muốn. Và có thể mất khoảng 1 tuần cày TOP này là cũng đủ sức đọc code và mày mò tự học. Điều này cũng phản ánh 1 thực trạng của đa số giáo trình là ví dụ quá sơ sài, mà càng đọc càng thấy rồi rắm. chỗ cần ví dụ sâu sắc thì lại hời hợt mà lý thuyết người mới học lại cần như bài #24 của bác @batman1 , bài #26 của chú @ptm0412 và bài #150 của thầy @Quang_Hải đó mới là những lý thuyết người mới học cần thì giáo trình rất ít đề cập. Riêng mình thì học lý thuyết đa phần các giáo trình và xem youtuber là vô bổ mất thời gian. Trong khi đó chỉ cần những ví dụ sâu sắc, từ đó lồng những từ khóa để tra ngược lý thuyết để bổ sung là xong. Quan trong là biết đọc code, sau chế lại, rồi phát huy được nếu định hướng theo nghề lập trình.
- Các dạng bài tập trong TOP:
+ Ban đầu thì các bảng chung 1 Sheet
+ Sau các bảng khác Sheet
+ Sau nữa các bảng có các cột tách rời nhau, rồi đổi vị trí trước sau, rồi so le nhau
+ Cuối cùng là Sheet "Data" lại không có gì luôn.
- Rồi nhờ chú @ptm0412 đưa đi lần lượt giải các bài tập, xuyên suốt là cách duyệt "Xiên Thịt Nướng" của chú quá tối tân, trong quá trình học đó lại biết cả đến code tà đạo của phái Ngũ Độc Giáo của tiền bối @Nhattanktnn, hay cách xử lý cao minh ở bài #141 (...ColumnArrCode(Seq)+1)).Value) của lão đại hiệp @HieuCD phái Võ Đang, hay các đặt biến và duyệt Sheets("CH1","CH2",....) rất chân phương ở bài #87 của lão tiền bối @Ba Tê phái Thiếu Lâm(do bác gán lệnh vào ông sư gõ mõ, cháu xin phép).
- Ban đầu mình muốn đến bài này biên tập và chỉnh sửa code. Nhưng số trang hiện tại không quá nhiều. Mà ai học thì thấy chỗ sai, chỗ sửa lần lượt để có từng bài, sẽ tốt hơn là đọc bài biên tập. Cho nên mình không biên tập lại nữa. Và quan điểm của mình thì sao cho tiết kiệm thời gian học mà nhớ được nhiều và áp dụng xử lý mớ dữ liệu hỗn độn, sau 9 bài này thì ta biết đọc code, có dữ liệu MỊN để học tiếp các hàm con(nếu muốn học nhiều hơn)
- Đáng nhẽ đến đây thì vui vẻ vì đã biết đọc code và tự học được rồi. Nhưng ở bài #113 lại đắc tội với bác @huuthang_bd, trong cuộc sống nếu sơ suất mà để đắc tội kiểu này thì mọi chuyện có thể đảo lộn và sụp đổ nhanh chóng. Rất mong bác @huuthang_bd cho cháu được gửi lời xin lỗi tới bác. Thời điểm đó có một số ý kiến khiến cháu cảm thấy bị áp đặt ý, bị núp lùm, bị để ý khiến cháu ức chế. Rất may được chú Mỹ chỉ cho mới biết được lỗi của mình.Một lần nữa cháu xin lỗi bác @huuthang_bd, đây là bài học nhớ đời với cháu.
- @truongvu317 em học ngành kỹ thuật, nhưng chuyển sang làm kinh doanh rồi ạ. Cái này chẳng thì chẳng có 9 bài Bí Truyền mà áp dụng.
Trước: Sản xuất - Trung Gian - Người Tiêu Dùng, Hiện giờ: Sản xuất - Người Tiêu Dùng. Mà làm sản xuất thì sợ nhất hàng giả hàng nhái, chính quy thì sợ nhất đối thủ này, sản xuất thông thường thì lại kiểu thu hồi công nợ hết sức mệt mỏi, thường thì lãi không thu được khi khách hàng bị bể.
Giờ thì sao ta??????????? Thôi thì Cứ cái gì thành hàng hóa là đổi thành tiền, cái gì giúp cho người khác đỡ mất thời gian và trí tuệ, công sức là dịch vụ. Quan trọng là đừng mắc lỗi như bài #113.
Xin cảm ơn chú Mỹ @ptm0412 hôm nay con xuống núi ạ, hi vọng được gặp thần tượng trong tương lại không xa (chắc là không để chú biết là Cô Bé Dễ Thương rồi hihi)
Xin chúc diễn đàn thành công!
 

File đính kèm

Upvote 0
Điều này cũng phản ánh 1 thực trạng của đa số giáo trình là ví dụ quá sơ sài, mà càng đọc càng thấy rồi rắm
Bạn viết vậy phải đưa ra căn cứ đàng hoàng nhé. Không có chuyện viết xơi xơi thế được. Chuyện này hết sức cẩn trọng trước khi đăng lên, không phải chuyện đùa đâu nhé.

Và có thể mất khoảng 1 tuần cày TOP này là cũng đủ sức đọc code và mày mò tự học.
Mấy cái tốp tép này là ý kiến chủ quan, là cái nhìn phiến diện.

Các kiến thức căn bản về cấu trúc chuẩn, các chuẩn liên hệ của bảng tính trải rộng, kế tới là các nội dung cơ bản trong lập trình VBA Excel bạn còn thiếu nhiếu nhiều mà cứ phát biểu ghê gớm vậy?
 
Upvote 0
- Vậy đã đến thức cuối cùng Cửu Âm Chân Kinh rồi, thức này có 2 chiêu: 1 là dùng Key nối chuỗi, 2 là ghi lại chỉ số dòng rồi gán vào mảng kết quả(chi tiết và data chuẩn file đính kèm, 2 Sub đều sử dụng lệnh Sort nên các bạn phải ở Sheets("Data" mới Run chạy Code nhé)
- Và đã qua tháng Giêng, năm 2021 Tân Sửu là 1 tuần rồi. Vèo 1 cái hết tháng Giêng. Được thầy @ptm0412 dìu dắt đã đến bài số 9 xử dụng Dictionary. Các bài tập trong TOP rất đa dạng và bao trùm các trường hợp, mà người mới học có thể áp dụng được luôn sau 1 tiếng là ra được kết quả mong muốn. Và có thể mất khoảng 1 tuần cày TOP này là cũng đủ sức đọc code và mày mò tự học. Điều này cũng phản ánh 1 thực trạng của đa số giáo trình là ví dụ quá sơ sài, mà càng đọc càng thấy rồi rắm. chỗ cần ví dụ sâu sắc thì lại hời hợt mà lý thuyết người mới học lại cần như bài #24 của bác @batman1 , bài #26 của chú @ptm0412 và bài #150 của thầy @Quang_Hải đó mới là những lý thuyết người mới học cần thì giáo trình rất ít đề cập. Riêng mình thì học lý thuyết đa phần các giáo trình và xem youtuber là vô bổ mất thời gian. Trong khi đó chỉ cần những ví dụ sâu sắc, từ đó lồng những từ khóa để tra ngược lý thuyết để bổ sung là xong. Quan trong là biết đọc code, sau chế lại, rồi phát huy được nếu định hướng theo nghề lập trình.
- Các dạng bài tập trong TOP:
+ Ban đầu thì các bảng chung 1 Sheet
+ Sau các bảng khác Sheet
+ Sau nữa các bảng có các cột tách rời nhau, rồi đổi vị trí trước sau, rồi so le nhau
+ Cuối cùng là Sheet "Data" lại không có gì luôn.
- Rồi nhờ chú @ptm0412 đưa đi lần lượt giải các bài tập, xuyên suốt là cách duyệt "Xiên Thịt Nướng" của chú quá tối tân, trong quá trình học đó lại biết cả đến code tà đạo của phái Ngũ Độc Giáo của tiền bối @Nhattanktnn, hay cách xử lý cao minh ở bài #141 (...ColumnArrCode(Seq)+1)).Value) của lão đại hiệp @HieuCD phái Võ Đang, hay các đặt biến và duyệt Sheets("CH1","CH2",....) rất chân phương ở bài #87 của lão tiền bối @Ba Tê phái Thiếu Lâm(do bác gán lệnh vào ông sư gõ mõ, cháu xin phép).
- Ban đầu mình muốn đến bài này biên tập và chỉnh sửa code. Nhưng số trang hiện tại không quá nhiều. Mà ai học thì thấy chỗ sai, chỗ sửa lần lượt để có từng bài, sẽ tốt hơn là đọc bài biên tập. Cho nên mình không biên tập lại nữa. Và quan điểm của mình thì sao cho tiết kiệm thời gian học mà nhớ được nhiều và áp dụng xử lý mớ dữ liệu hỗn độn, sau 9 bài này thì ta biết đọc code, có dữ liệu MỊN để học tiếp các hàm con(nếu muốn học nhiều hơn)
- Đáng nhẽ đến đây thì vui vẻ vì đã biết đọc code và tự học được rồi. Nhưng ở bài #113 lại đắc tội với bác @huuthang_bd, trong cuộc sống nếu sơ suất mà để đắc tội kiểu này thì mọi chuyện có thể đảo lộn và sụp đổ nhanh chóng. Rất mong bác @huuthang_bd cho cháu được gửi lời xin lỗi tới bác. Thời điểm đó có một số ý kiến khiến cháu cảm thấy bị áp đặt ý, bị núp lùm, bị để ý khiến cháu ức chế. Rất may được chú Mỹ chỉ cho mới biết được lỗi của mình.Một lần nữa cháu xin lỗi bác @huuthang_bd, đây là bài học nhớ đời với cháu.
- @truongvu317 em học ngành kỹ thuật, nhưng chuyển sang làm kinh doanh rồi ạ. Cái này chẳng thì chẳng có 9 bài Bí Truyền mà áp dụng.
Trước: Sản xuất - Trung Gian - Người Tiêu Dùng, Hiện giờ: Sản xuất - Người Tiêu Dùng. Mà làm sản xuất thì sợ nhất hàng giả hàng nhái, chính quy thì sợ nhất đối thủ này, sản xuất thông thường thì lại kiểu thu hồi công nợ hết sức mệt mỏi, thường thì lãi không thu được khi khách hàng bị bể.
Giờ thì sao ta??????????? Thôi thì Cứ cái gì thành hàng hóa là đổi thành tiền, cái gì giúp cho người khác đỡ mất thời gian và trí tuệ, công sức là dịch vụ. Quan trọng là đừng mắc lỗi như bài #113.
Xin cảm ơn chú Mỹ @ptm0412 hôm nay con xuống núi ạ, hi vọng được gặp thần tượng trong tương lại không xa (chắc là không để chú biết là Cô Bé Dễ Thương rồi hihi)
Xin chúc diễn đàn thành công!
Luyện cửu âm chân kinh nên đi từ căn bản, luyện kiểu bạn dể trở thành Mai Siêu Phong thời @
 
Upvote 0
Bạn viết vậy phải đưa ra căn cứ đàng hoàng nhé. Không có chuyện viết xơi xơi thế được. Chuyện này hết sức cẩn trọng trước khi đăng lên, không phải chuyện đùa đâu nhé.


Mấy cái tốp tép này là ý kiến chủ quan, là cái nhìn phiến diện.

Các kiến thức căn bản về cấu trúc chuẩn, các chuẩn liên hệ của bảng tính trải rộng, kế tới là các nội dung cơ bản trong lập trình VBA Excel bạn còn thiếu nhiếu nhiều mà cứ phát biểu ghê gớm vậy?
Cháu biết các bác các thầy đều là người chuyên sâu về lập trình và kiếm usd bằng lập trình. Ý kiến của cháu dành cho ai cần áp dụng, thiếu thời gian để tự mình ra sản phẩm. Và ý kiến của cháu là tìm thấy các giáo trình ngoài diễn đàn nó rất sơ sài bác ạ.
Và 1 tiết lộ thú vị nữa là cháu chẳng biết tý gì tiếng Anh.
Không biết Tiếng Anh, nên khi cháu đọc code đều nạp vào bộ nhớ theo hình ảnh.
Bởi cháu học tiếng Pháp, lâu rồi cũng chỉ biết đếm từ 1 đến 5.
Cháu chúc bác sức khỏe và luôn vui vẻ
 
Lần chỉnh sửa cuối:
Upvote 0
Xin cảm ơn chú Mỹ @ptm0412 hôm nay con xuống núi ạ, hi vọng được gặp thần tượng trong tương lại không xa (chắc là không để chú biết là Cô Bé Dễ Thương rồi hihi)
Chưa hết đâu. Đối phó với việc Data chỉ 1 ô không gán vào mảng được, bác @HieuCD bảo thêm 1 cột và đã làm theo, cách này có nguy cơ hao tổn bộ nhớ khi dữ liệu lớn, nay có cách khác nhẹ nhàng hơn (thay vì dùng If tách trường hợp giá trị đơn kéo theo 1 lô 1 lốc các câu lệnh) như sau:
Cách 1: Lấy dư ra 1 dòng thay vì 1 cột, chắc chắn ít hao tổn bộ nhớ hơn, nhưng phải có If để loại sKey rỗng
Cách 2: Thêm dòng hoặc thêm cột như trên, nhưng dùng hàm IIf để cho gọn:
Mã:
        StoreCode = .Range(.Cells(RowArrCode(Seq), ColumnArrCode(Seq)), _
        .Cells(DataRwCode, ColumnArrCode(Seq) + _
        IIf( DataRwCode = RowArrCode(Seq), 1, 0))).Value
Như vậy chỉ sheet nào chỉ có 1 dòng dữ liệu mới thêm 1 cột/ hoặc thêm 1 dòng cho mảng.
Dict - Item - Mảng còn vô vàn điều khác chứ chưa hết đâu.
_________
Ngoài ra theo góp ý của các đại ca ở trên (@befaint, @huuthang_bd), các chú bác khác, và cả tôi nữa, còn nhiều điều căn bản phải học (đáng lẽ trước cả vòng lặp, chứ đừng nói mảng và Dict). Các lỗi khác cần phải khắc phục:
- Chưa khai báo biến đầy đủ (code bài 160 tôi phải khai báo bổ sung hàng tỷ biến)
- Tên biến chưa đặt theo ý nghĩa của giá trị biến (cứ copy code bài trước qua bài sau vô tội vạ)
- Suy luận logic chưa thấu đáo, chắc chắn là chưa từng viết cái thuật toán ra giấy để mà nghiền ngẫm chỉnh sửa.
- Copy câu lệnh bên trên xuống bên dưới, bài này sang bài nọ mà không hiểu thấu đáo câu lệnh, dẫn đến sai hoặc lỗi.
 
Upvote 0
Chưa hết đâu. Đối phó với việc Data chỉ 1 ô không gán vào mảng được, bác @HieuCD bảo thêm 1 cột và đã làm theo, cách này có nguy cơ hao tổn bộ nhớ khi dữ liệu lớn, nay có cách khác nhẹ nhàng hơn (thay vì dùng If tách trường hợp giá trị đơn kéo theo 1 lô 1 lốc các câu lệnh) như sau:
Cách 1: Lấy dư ra 1 dòng thay vì 1 cột, chắc chắn ít hao tổn bộ nhớ hơn, nhưng phải có If để loại sKey rỗng
Cách 2: Thêm dòng hoặc thêm cột như trên, nhưng dùng hàm IIf để cho gọn:
Mã:
        StoreCode = .Range(.Cells(RowArrCode(Seq), ColumnArrCode(Seq)), _
        .Cells(DataRwCode, ColumnArrCode(Seq) + _
        IIf( DataRwCode = RowArrCode(Seq), 1, 0))).Value
Như vậy chỉ sheet nào chỉ có 1 dòng dữ liệu mới thêm 1 cột/ hoặc thêm 1 dòng cho mảng.
Dict - Item - Mảng còn vô vàn điều khác chứ chưa hết đâu.
_________
Ngoài ra theo góp ý của các đại ca ở trên (@befaint, @huuthang_bd), các chú bác khác, và cả tôi nữa, còn nhiều điều căn bản phải học (đáng lẽ trước cả vòng lặp, chứ đừng nói mảng và Dict). Các lỗi khác cần phải khắc phục:
- Chưa khai báo biến đầy đủ (code bài 160 tôi phải khai báo bổ sung hàng tỷ biến)
- Tên biến chưa đặt theo ý nghĩa của giá trị biến (cứ copy code bài trước qua bài sau vô tội vạ)
- Suy luận logic chưa thấu đáo, chắc chắn là chưa từng viết cái thuật toán ra giấy để mà nghiền ngẫm chỉnh sửa.
- Copy câu lệnh bên trên xuống bên dưới, bài này sang bài nọ mà không hiểu thấu đáo câu lệnh, dẫn đến sai hoặc lỗi.
Vậy là có cả cách cao siêu này nữa.
Do khả năng lưu bộ nhớ là hình ảnh thiên về ra kết quả luôn nên có bỏ sót những thứ mà code đổi ra usd phải có.
Và Array đúng là môn nội công thâm hậu, còn Dictionary như "Thần Khí" và đương nhiên xử dụng bất kỳ vũ khí hay thần khí nào thì phải có nội công thâm hậu (Array).
Chú đừng thức khuya nhé!
 
Lần chỉnh sửa cuối:
Upvote 0
Upvote 0
Cái gì mà khuya tầm này?

Nếu lỡ có gặp thì luôn luôn đội mũ bảo hiểm trên đầu, 1 là bị kú lủng đầu, 2 là bị tưới nước sôi
Dạ. Chịu được hết ạ.
Giờ cháu mới khai xuân đầu năm đây ạ. Bề bộn quá. Gọn gàng ngon lành làm chuyến xuyên Việt ạ.
 
Upvote 0
Upvote 0
Em nhờ các anh chị giúp đỡ em với ạ. Em đang có nhiều file excel, mỗi file một sheet có tên "Danh sách hưởng TCTN". Do tên sheet dài nên khi em thực hiện ghép file đều bị báo lỗi. Nếu giờ đổi tên thủ công thì sẽ mất rất nhiều thời gian vì mỗi một tháng có khoảng 60-100 file cần ghép ạ. Mong anh chị chỉ giáo giúp em có cách nào không ạ? Em cảm ơn rất nhiều ạ
 
Upvote 0
Em nhờ các anh chị giúp đỡ em với ạ. Em đang có nhiều file excel, mỗi file một sheet có tên "Danh sách hưởng TCTN". Do tên sheet dài nên khi em thực hiện ghép file đều bị báo lỗi. Nếu giờ đổi tên thủ công thì sẽ mất rất nhiều thời gian vì mỗi một tháng có khoảng 60-100 file cần ghép ạ. Mong anh chị chỉ giáo giúp em có cách nào không ạ? Em cảm ơn rất nhiều ạ
Tôi nghĩ không phải lỗi do tên sheet dài mà do tên file có vấn đề.

1) Nếu tên file viết liền nhau, không có dấu, không có khoảng trắng và không có ký tự đặt biệt, ví dụ như: TenFileCanGhep hoặc Ten_File_Can_Ghep cách viết tên file như sau:
Mã:
=[TenFileCanGhep.xlsm]Sheet1!$A$1

=[Ten_File_Can_Ghep.xlsm]Sheet1!$A$1

2) Nếu như tên có dấu tiếng Việt hoặc có khoảng trắng hoặc có chứa ký tự đặc biệt, ví dụ như: Tên File Cần Ghép hoặc Ten-File-Can-Ghep cách viết tên file như sau:

Mã:
='[Tên File Cần Ghép.xlsm]Sheet1'!$A$1

='[Ten-File-Can-Ghep.xlsm]Sheet1'!$A$1

(1)(2) chỉ khác nhau có 2 dấu nháy (') bao bọc tên file và tên sheet.

Như vậy, nếu mình không xác định được file như thế nào, cứ "phang" cấu trúc (2) là tốt nhất.
 
Upvote 0
Tôi nghĩ không phải lỗi do tên sheet dài mà do tên file có vấn đề.

1) Nếu tên file viết liền nhau, không có dấu, không có khoảng trắng và không có ký tự đặt biệt ví dụ như: TenFileCanGhep hoặc Ten_File_Can_Ghep cách viết tên file như sau:
Mã:
=[TenFileCanGhep.xlsm]Sheet1!$A$1

=[Ten_File_Can_Ghep.xlsm]Sheet1!$A$1

2) Nếu như tên có dấu tiếng Việt hoặc có khoảng trắng hoặc có chứa ký tự đặc biệt, ví dụ như: Tên File Cần Ghép hoặc Ten-File-Can-Ghep cách viết tên file như sau:

Mã:
='[Tên File Cần Ghép.xlsm]Sheet1'!$A$1

='[Ten-File-Can-Ghep.xlsm]Sheet1!'$A$1

(1)(2) chỉ khác nhau có 2 dấu nháy (') bao bọc tên file và tên sheet.

Như vậy, nếu mình không xác định được file như thế nào, cứ "phang" cấu trúc (2) là tốt nhất.
dạ em đã thử đổi tên sheet thành ngắn hơn thì ghép được luôn anh ạ
 
Upvote 0
Upvote 0
dạ e đổi thành số cho nhanh ạ. em chỉ ghi 1, 2, 3....thôi ạ. Còn tên file e vẫn giữ nguyên. Tên file của em là Danh sách chi trả thất nghiệp, Danh sách chi trả thất nghiệp (1)........lần lượt ạ
Ở bài này:

Tên sheet cũng tương tự tên file, nếu có ký tự trắng hay dấu tiếng Việt hay có ký tự đặc biệt đều phải sử dụng dấu nháy bạn nhé.

Do bạn đổi tên sheet lại không có cấu trúc tên sheet như (2) cho nên không phát sinh lỗi, chứ không phải do tên sheet dài hay ngắn bạn nhé.
 
Upvote 0
Ở bài này:

Tên sheet cũng tương tự tên file, nếu có ký tự trắng hay dấu tiếng Việt hay có ký tự đặc biệt đều phải sử dụng dấu nháy bạn nhé.

Do bạn đổi tên sheet lại không có cấu trúc tên sheet như (2) cho nên không phát sinh lỗi, chứ không phải do tên sheet dài hay ngắn bạn nhé.
anh ơi, anh cho em xin số điện thoại add zalo của anh em hỏi với được không ạ? Em gà mới nên ngu ngơ lắm, e ko hiểu được cặn kẽ nên ko biết làm thế nào ạ. Mà lương file lớn lại cần gấp :(
 
Upvote 0
Upvote 0

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

Back
Top Bottom