Có cách nào nạp một loạt giá trị Name (Name trong Name Manager) vào các Biến tương ứng trong VBA hay không?

Liên hệ QC

hung2412

Thành viên tích cực
Tham gia
5/8/08
Bài viết
925
Được thích
240
Giới tính
Nam
Xin chào các bạn GPE!
Có cách nào nạp một loạt giá trị Name (Name trong Name Manager) vào các Biến tương ứng trong VBA hay không?
Untitled 01.png
Untitled 02.png
Mong các bạn chỉ giúp cho
Xin cảm ơn
 

File đính kèm

  • Nap gia tri Name vao Bien tuong ung.xls
    55.5 KB · Đọc: 10
Upvote 0
Có gì đâu bạn, biến như là Public Bien_1 as String chẳng hạn
Mục đích để làm gì để xem giải pháp thế nào, chứ mình vẫn chưa hiểu vấn đề (chắc người khác cũng không hiểu nên giờ vẫn chưa thấy ai trả lời).
 
Upvote 0
Khai báo Bien(1 to 7) chứ đừng khai báo 7 biến riêng lẻ
Sau đó:
Mã:
For i = 1 to 7
    Bien(i) =Sheet1.Range("Name_" & i).Value
Next

Nếu name là 1 giá trị hằng như trong file thì thay Sheet1.Range bằng ThisWorkbook.Names
 
Lần chỉnh sửa cuối:
Upvote 0
Khai báo Bien(1 to 7) chứ đừng khai báo 7 biến riêng lẻ
Sau đó:
Mã:
For i = 1 to 7
    Bien(i) =Sheet1.Range("Name_" & i).Value
Next
. ..
Thớt không biết căn bản về biến cho nên mới có ý tưởng ấy.
Names là những thông số nằm ngoài. Nhưng đem chúng vào làm biến không đơn giản vậy.
Vì names không phải là hằng cho nên chúng có thể thay đổi. Và vì vậy, phải xác định trước là mình muốn lấy các trị khởi đầu, lúc nào muốn trị mới thì run code cập nhật?
Bình thường thì người ta muốn trị mói nhất. Và sẽ code theo function, mỗi function trả về cho trị của một name - bao nhiêu names là bấy nhiêu function. Nếu biết căn bản hàm thì sẽ thấy chúng hình dạng và hoạt động in hệt như biến trỏ vào names, kể cả array (hàm với tham số là chỉ số trong array)

Public Function XNames(ByVal i As Long) As Variant
XNames =Sheet1.Range("Name_" & i).Value
End Function

Gọi trong các sub/func khác:
a = XNames(2)

If XNames(3) = “abc” Then …
 
Upvote 0
Public Function XNames(ByVal i As Long) As Variant
XNames =Sheet1.Range("Name_" & i).Value
End Function
...
a = XNames(2)
Không có vòng lặp thì không có biến i. Không khai báo XNames(1 to 7) thì không gán giá trị XNames(2) được
Nếu Function có biến i thì rốt cục phải tạo 7 function(s)

Có vòng lặp thì y như tôi viết.
Tôi viết Range.Value vì chưa coi file, khi coi file thì thấy tất cả name là hằng, nên thêm 1 câu ghi chú ở dưới.
Thử lại thì dù hằng hay Range thì ThisWorkbook.Names("Name_" & i).Value đều hoạt động. Lúc đó dùng thêm dòng lệnh kiểm tra IsArray trước khi dùng.

Còn phía sau tôi cho rằng y ta xài cùng lúc 7 biến nên mới muốn "nạp một loạt giá trị Name (Name trong Name Manager) vào các Biến tương ứng"
 
Lần chỉnh sửa cuối:
Upvote 0
Mục đích để làm gì để xem giải pháp thế nào, chứ mình vẫn chưa hiểu vấn đề (chắc người khác cũng không hiểu nên giờ vẫn chưa thấy ai trả lời).
- Ban đầu là chạy Code từ File Excel A (Mũi tên màu vàng chạy trong Module của File Excel A), có các biến là Phieuthu, Phieuchi, Giaydenghithanhtoan,... (Còn như Bien_1, Bien_2, Bien_3,... chỉ là minh họa mà thôi)
- Mình truyền các biến Phieuthu, Phieuchi, Giaydenghithanhtoan,... ở trên vào các Name (Cái này mình biết dùng vòng lặp)
- Sau đó Mũi tên màu vàng chạy đến Module của File Excel B
- Tại đây mình muốn truyền giá trị các Name ở trên (Các Name này đã nạp giá trị từ các biến rồi) vào các biến tương ứng Phieuthu, Phieuchi, Giaydenghithanhtoan,.. ở File Excel B

=> Nạp thủ công từng Name vào biến thì mình biết (Phieuthu
= Workbooks(FileExcelB).Names(Name_gi_do)). Nhưng làm thế nào để dùng vòng lặp hoặc Array gì đó cho nhanh?
Bài đã được tự động gộp:

Khai báo Bien(1 to 7) chứ đừng khai báo 7 biến riêng lẻ
Sau đó:
Mã:
For i = 1 to 7
    Bien(i) =Sheet1.Range("Name_" & i).Value
Next

Nếu name là 1 giá trị hằng như trong file thì thay Sheet1.Range bằng ThisWorkbook.Names
Bien_1, Bien_2,... chỉ là minh họa thôi ạ. Trên thực tế tên các biến là Phieuthu, phieuchi,...
Còn Bien(i) =Sheet1.Range("Name_" & i).Value => Thực tế thì trên File Excel sẽ không có như thế, chỉ là minh họa để nêu câu hỏi mà thôi
Mà gán các biến xuống Sheet thì dùng Name làm gì nữa ạ (Thực tế sẽ không như thế)
 
Upvote 0
ủa, Thấy có vẻ mọi người làm phức tạp hóa ý bác ấy lên sao ấy nhỉ. Code trong file bác tham khảo xem đúng chưa?
 

File đính kèm

  • Nap gia tri Name vao Bien tuong ung.xls
    64.5 KB · Đọc: 4
Upvote 0
- Ban đầu là chạy Code từ File Excel A (Mũi tên màu vàng chạy trong Module của File Excel A), có các biến là Phieuthu, Phieuchi, Giaydenghithanhtoan,... (Còn như Bien_1, Bien_2, Bien_3,... chỉ là minh họa mà thôi)
- Mình truyền các biến Phieuthu, Phieuchi, Giaydenghithanhtoan,... ở trên vào các Name (Cái này mình biết dùng vòng lặp)
- Sau đó Mũi tên màu vàng chạy đến Module của File Excel B
- Tại đây mình muốn truyền giá trị các Name ở trên (Các Name này đã nạp giá trị từ các biến rồi) vào các biến tương ứng Phieuthu, Phieuchi, Giaydenghithanhtoan,.. ở File Excel B

=> Nạp thủ công từng Name vào biến thì mình biết (Phieuthu
= Workbooks(FileExcelB).Names(Name_gi_do)). Nhưng làm thế nào để dùng vòng lặp hoặc Array gì đó cho nhanh?
Bài đã được tự động gộp:


Bien_1, Bien_2,... chỉ là minh họa thôi ạ. Trên thực tế tên các biến là Phieuthu, phieuchi,...
Còn Bien(i) =Sheet1.Range("Name_" & i).Value => Thực tế thì trên File Excel sẽ không có như thế, chỉ là minh họa để nêu câu hỏi mà thôi
Mà gán các biến xuống Sheet thì dùng Name làm gì nữa ạ (Thực tế sẽ không như thế)
Nếu muốn từ A đến Z thì bạn chỉ việc hỏi làm thế nào để đi từ A đến Z, đừng tự vẽ ra con đường A-B-C..Y-Z rồi hỏi từng đoạn vì có thể có đường tắt đi thẳng từ A đến Z mà không qua B-Y.
--
Theo suy đoán của tôi là bạn muốn truyền giá trị biến từ thủ tục ở file A (gọi là thủ tục A) sang thủ tục ở file B (gọi là thủ tục B). Nếu đúng như vậy thì sẽ như sau:
- Trường hợp thủ tục B được gọi trực tiếp thông qua câu lệnh ở thủ tục A thì quá đơn giản, cứ truyền trực tiếp không cần phải qua trung gian gì cả.
- Trường hợp thủ tục B không được gọi trực tiếp từ thủ tục A (kích hoạt bằng sự kiện, hoặc người dùng) thì cũng có nhiều cách khác hiệu quả hơn là ghi vào Names.
 
Upvote 0
- Trường hợp thủ tục B được gọi trực tiếp thông qua câu lệnh ở thủ tục A thì quá đơn giản, cứ truyền trực tiếp không cần phải qua trung gian gì cả.
Biến PhieuthuFile Excel A làm sao mà truyền trực tiếp sang biến PhieuthuFile Excel B được (Mũi tên màu vàng chạy từ Module File Excel A sang Module File Excel B)? (Mình Test rồi, nhưng không được, cho dù khai báo là Public đi chăng nữa)
Bài đã được tự động gộp:

- Trường hợp thủ tục B không được gọi trực tiếp từ thủ tục A (kích hoạt bằng sự kiện, hoặc người dùng) thì cũng có nhiều cách khác hiệu quả hơn là ghi vào Names.
Mình có thử dùng References Project, nhưng không đáp ứng được nhu cầu do File References không cố định, vả lại nó không References chéo cho nhau được. Bạn có cách nào tốt hơn không (Không dùng gán xuống Sheet nhé)
Bài đã được tự động gộp:

ủa, Thấy có vẻ mọi người làm phức tạp hóa ý bác ấy lên sao ấy nhỉ. Code trong file bác tham khảo xem đúng chưa?
File Excel mình gõ các biến Bien_1, Bien_2,... chỉ là minh họa thôi
Với lại trên File Excel không có sẵn Dữ liệu như thế, chỉ là trình bày để nêu câu hỏi mà thôi
 
Lần chỉnh sửa cuối:
Upvote 0
ủa, Thấy có vẻ mọi người làm phức tạp hóa ý bác ấy lên sao ấy nhỉ. Code trong file bác tham khảo xem đúng chưa?
Tự anh ta hỏi kiểu đó ở bài 1, tôi trả lời ý như bài 1. ngoài ra trong file tất cả name mẫu đều là hằng. Tới bài 8 thì mới phức tạp: Lòi đâu ra name tùm lum, biến tùm lum, lại cò 2 file A và B.
- Ban đầu là chạy Code từ File Excel A (Mũi tên màu vàng chạy trong Module của File Excel A), có các biến là Phieuthu, Phieuchi, Giaydenghithanhtoan,... (Còn như Bien_1, Bien_2, Bien_3,... chỉ là minh họa mà thôi)
- Mình truyền các biến Phieuthu, Phieuchi, Giaydenghithanhtoan,... ở trên vào các Name (Cái này mình biết dùng vòng lặp)
...
Còn Bien(i) =Sheet1.Range("Name_" & i).Value => Thực tế thì trên File Excel sẽ không có như thế, chỉ là minh họa để nêu câu hỏi mà thôi
Mà gán các biến xuống Sheet thì dùng Name làm gì nữa ạ (Thực tế sẽ không như thế)
1. Bài 1 làm quái gì có file A với file B?
2. Biến có tên lung tung thì bài 1 phải nói rõ là lung tung
3. Name cũng lung tung thì cũng phải tạo name lung tung, name là range thì phải tạo name mẫu là range chứ, sao lại tạo name mẫu toàn là hằng?
4. Tôi có gán xuống sheet đâu? tôi chỉ gán giá trị biến bằng giá trị name theo vòng lặp, sau đó làm gì thì kệ bạn mà?

Tóm lại, nếu nói như bài 8 từ đầu thì tôi đã không viết bài 5 cho phí công.
 
Lần chỉnh sửa cuối:
Upvote 0
Mình Test rồi, nhưng không được, cho dù khai báo là Public đi chăng nữa
Mình không làm được không có nghĩa là không có cách làm.
--
Như tôi đã nói, nếu có yêu cầu rõ ràng thì tôi sẽ xem liệu có hỗ trợ được không chứ tôi sẽ không chạy theo con đường bạn vẽ sẵn.
 
Upvote 0
Nếu muốn từ A đến Z thì bạn chỉ việc hỏi làm thế nào để đi từ A đến Z, đừng tự vẽ ra con đường A-B-C..Y-Z rồi hỏi từng đoạn vì có thể có đường tắt đi thẳng từ A đến Z mà không qua B-Y.
Khái niệm "XY problem" mà ngày xưa anh đi tìm kiếm --=0
 
Upvote 0
Không có vòng lặp thì không có biến i. Không khai báo XNames(1 to 7) thì không gán giá trị XNames(2) được
Nếu Function có biến i thì rốt cục phải tạo 7 function(s)

...
Đây là code thử. XNames trong các sub/func khác được sử dụng in hệt một array.
Chỉ có các tên đặc thù thì mới cần mỗi name một function

1719817362665.png
 
Lần chỉnh sửa cuối:
Upvote 0
Nếu đúng như vậy thì sẽ như sau:
- Trường hợp thủ tục B được gọi trực tiếp thông qua câu lệnh ở thủ tục A thì quá đơn giản, cứ truyền trực tiếp không cần phải qua trung gian gì cả.
Đúng là cái này bạn ơi. Bạn có thể nói cụ thể hơn được không?
 
Upvote 0
Biến PhieuthuFile Excel A làm sao mà truyền trực tiếp sang biến PhieuthuFile Excel B được (Mũi tên màu vàng chạy từ Module File Excel A sang Module File Excel B)? (Mình Test rồi, nhưng không được, cho dù khai báo là Public đi chăng nữa)
Bài đã được tự động gộp:
Nếu là 2 file Excel khác nhau nhưng muốn truyền tham số cho nhau thì có một cách lòng vòng khác là: File A lưu tên biến và giá trị của nó vào file tạm (.csv, .txt) rồi từ file B đọc file tạm đó.
Một cách khác là dùng "Hidden name space" nó lưu thông tin vào bộ nhớ ở tầm vực Application chứ không phải Workbook. Nên nếu mở các workbook cùng một phiên Excel (Excel instance - không biết dịch ra là gì) thì có thể cùng sử dụng. Bạn tìm hiểu Application.Execute4Macro xem có đáp ứng yêu cầu không.
(Tôi có test cơ bản thì thấy nó đọc được tham số truyền)
2 file cùng một Excel instance

Screen Shot 2024-07-01 at 18.22.00.png
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT
Back
Top Bottom