Giúp đặt Biến i cho số lượng dòng

Liên hệ QC

quochuy2022

Thành viên bị đình chỉ hoạt động
Thành viên bị đình chỉ hoạt động
Tham gia
21/11/22
Bài viết
20
Được thích
-1
Chào GPE. Tôi có đoạn code sau, nhưng số lượng dòng không cố định mình muốn đưa biến i thế vào chổ 10000 thì phải làm thế nào
Ví dụ: [bAOCAOds!AJ2:AJ10000] sẽ thành là [bAOCAOds!AJ2:AJ&i] . Xin cảm ơn

Code cần sửa:

Sub test()
[bAOCAOds!AJ2:AJ10000] = [ IF(bAOCAOds!AA2:AA10000="","",bAOCAOds!T2:T10000&" x "&bAOCAOds!AA2:AA10000) ]
End Sub
 
Chào GPE. Tôi có đoạn code sau, nhưng số lượng dòng không cố định mình muốn đưa biến i thế vào chổ 10000 thì phải làm thế nào
Ví dụ: [bAOCAOds!AJ2:AJ10000] sẽ thành là [bAOCAOds!AJ2:AJ&i] . Xin cảm ơn

Code cần sửa:


Sub test()
[bAOCAOds!AJ2:AJ10000] = [ IF(bAOCAOds!AA2:AA10000="","",bAOCAOds!T2:T10000&" x "&bAOCAOds!AA2:AA10000) ]
End Sub
Cặp toán tử [ ] chỉ dùng hằng rõ rệt (literals) chứ không chấp nhận biến.
Muốn dùng biến thì phải dùng hàm Evaluate và biểu thức cộng chuỗi.
 
Upvote 0
???:
PHP:
Sub BienDong()
 Dim W As Long
 
 W = Sheets("Cu Tí").[B3].CurrentRegion.Rows.Count
 If W > 3 Then
    With Sheets("BaoCaoDS")
        .Range(.[AJ2], .Cells(W, "AJ")).Value = "Má Mày " & .[B35].Value & "!"
    End With
 End If
End Sub
 
Upvote 0
???:
PHP:
Sub BienDong()
...
End Sub
Code ở bài #1 của thớt là loại code viết tắt, chạy cũng khá hiệu quả với mảng 1 chiều.
Nếu code của thớt tự viết thì với chỉ dẫn của tôi ở bài #2, thớt sẽ tự chỉnh được.
Nếu không phải code của thớt thì có khả năng thớt sẽ hỏi thêm.
 
Upvote 0
Code ở bài #1 của thớt là loại code viết tắt, chạy cũng khá hiệu quả với mảng 1 chiều.
Nếu code của thớt tự viết thì với chỉ dẫn của tôi ở bài #2, thớt sẽ tự chỉnh được.
Nếu không phải code của thớt thì có khả năng thớt sẽ hỏi thêm.
Em cũng đang theo dõi để coi cách dùng. Toán tử [ ] với em hơi lạ. Sáng thấy bài mới đi tìm hiểu.
 
Upvote 0
Em cũng đang theo dõi để coi cách dùng. Toán tử [ ] với em hơi lạ. Sáng thấy bài mới đi tìm hiểu.
Có lẽ giờ này bạn đã tìm hiểu xong.
Tôi chỉ ra đây cho các bạn chưa tìm ra:

Toán tử [ ] là một cách viết tắt của hàm Evaluate. Tuy nhiên vì nó mặc đinh không gian trình dịch (trình dịch VBA dùng cách dịch đặc biết khi gặp toán tử []) cho nên chỉ có thể sử dụng được với các điều kiện sau:
- bên trong nó là câu biểu thức viết in hệt như biểu thức trên worksheet.
- nó không nhận bất cứ cái gì không phải là hằng.
- nó chạy chậm hơn Evaluate một chút.
- vì là hàm bảng tính cho nên nó luôn luôn theo luật bảng tính. Điển hình nếu bạn dùng nó để dựng mảng thì mảng bắt buộc là (1 To n). Không bao giờ là (0 To n) như hàm Array của VBA.
- nếu dùng để xác định range (như vế bên trái của bài #1), thì nó chậm hơn hàm Range. Giải thích: Hàm range là hàm VBA, hàm Evaluate là hàm bẳng tính. Phần lớn các trường hợp, hàm VBA chạy nhanh hơn hàm bảng tính.

Evaluate cũng là hàm bảng tính. Sự thực nếu bạn gọi hàm này với tiền tố Worksheet (Ví dụ Sheet1.Evaluate) thì sẽ chạy nhanh hơn một chút.
Vì là hàm chính chắn cho nên Evaluate nhậ tham số một cách chính chắn chứ không qua cách dịch đặc biệt như [].
Tham số để nạp vào Evaluate là một string. Vì vậy hàm này uyển chuyển hơn. Cần tính gì bạn chỉ việc nắn cái string tham số cho đúng ý, rồi nạp vào.

Ví dụ: bạn khai báo một mảng 3 phần tử 2, 4, 6 với [ ]
a = [ { 2, 4, 6 } ]
Cách khai báo mảng trong bảng tính là { hằng1, hằng2,... }. Bạn hoàn toàn khong có cách nào khác.
Với Evaluate, bạn có thể:
For i = 1 to 3
s = s & "," & i*2
Next i
a = Evaluate( "{" & MId(s, 2) & "}" )
Dĩ nhiên là tôi chọn ví dụ cho các bạn thấy cách khai báo 1 gọn, đẹp hơn; nhưng cách khai báo 2 cho phép bạn dùng các con toán phức tạp để nạp các phần tử cho mảng.

Trở lại vấn đề tôi nêu ra ở bài #4. Đây là trường hợp đặc biết. Hàm Evluate dùng cho phép tính đơn gian và mảng một chiều như vậy nhanh hơn vòng lạp tính bằng hàm VBA.. (hiện hại tôi cũng chẳng hiểu tại sao, chỉ nghe nấy thằng gu ru Excel nói vậy)
 
Upvote 0
Có lẽ giờ này bạn đã tìm hiểu xong.
Tôi chỉ ra đây cho các bạn chưa tìm ra:

Toán tử [ ] là một cách viết tắt của hàm Evaluate. Tuy nhiên vì nó mặc đinh không gian trình dịch (trình dịch VBA dùng cách dịch đặc biết khi gặp toán tử []) cho nên chỉ có thể sử dụng được với các điều kiện sau:
- bên trong nó là câu biểu thức viết in hệt như biểu thức trên worksheet.
- nó không nhận bất cứ cái gì không phải là hằng.
- nó chạy chậm hơn Evaluate một chút.
- vì là hàm bảng tính cho nên nó luôn luôn theo luật bảng tính. Điển hình nếu bạn dùng nó để dựng mảng thì mảng bắt buộc là (1 To n). Không bao giờ là (0 To n) như hàm Array của VBA.
- nếu dùng để xác định range (như vế bên trái của bài #1), thì nó chậm hơn hàm Range. Giải thích: Hàm range là hàm VBA, hàm Evaluate là hàm bẳng tính. Phần lớn các trường hợp, hàm VBA chạy nhanh hơn hàm bảng tính.

Evaluate cũng là hàm bảng tính. Sự thực nếu bạn gọi hàm này với tiền tố Worksheet (Ví dụ Sheet1.Evaluate) thì sẽ chạy nhanh hơn một chút.
Vì là hàm chính chắn cho nên Evaluate nhậ tham số một cách chính chắn chứ không qua cách dịch đặc biệt như [].
Tham số để nạp vào Evaluate là một string. Vì vậy hàm này uyển chuyển hơn. Cần tính gì bạn chỉ việc nắn cái string tham số cho đúng ý, rồi nạp vào.

Ví dụ: bạn khai báo một mảng 3 phần tử 2, 4, 6 với [ ]
a = [ { 2, 4, 6 } ]
Cách khai báo mảng trong bảng tính là { hằng1, hằng2,... }. Bạn hoàn toàn khong có cách nào khác.
Với Evaluate, bạn có thể:
For i = 1 to 3
s = s & "," & i*2
Next i
a = Evaluate( "{" & MId(s, 2) & "}" )
Dĩ nhiên là tôi chọn ví dụ cho các bạn thấy cách khai báo 1 gọn, đẹp hơn; nhưng cách khai báo 2 cho phép bạn dùng các con toán phức tạp để nạp các phần tử cho mảng.

Trở lại vấn đề tôi nêu ra ở bài #4. Đây là trường hợp đặc biết. Hàm Evluate dùng cho phép tính đơn gian và mảng một chiều như vậy nhanh hơn vòng lạp tính bằng hàm VBA.. (hiện hại tôi cũng chẳng hiểu tại sao, chỉ nghe nấy thằng gu ru Excel nói vậy)
Em thử dùng các nối chuỗi và Evaluate như anh thì cái sumif ko chạy được a. Có cách nào khắc phục không ạ
 

File đính kèm

  • cau hoi 1.JPG
    cau hoi 1.JPG
    87.2 KB · Đọc: 2
Upvote 0
Web KT

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

Back
Top Bottom