Công thức mảng trong worksheet function

Liên hệ QC
Tôi tuân thủ nội quy khi đăng bài

gakon113

Thành viên mới
Tham gia
31/5/24
Bài viết
4
Được thích
0
Em chào cả nhà ạ !
Em có đoạn code này mà máy báo lỗi.
Không biết là sai ở đâu. Mong mọi người chỉ giúp ạ.
Sub mangct()
Dim RgnA1A65, RgnE1E65, RngA1G1 As Range
Dim Rgn1, Rgn2 As Range
Set RgnA1A65 = Sheet1.Range("A1:A65")
Set RgnE1E65 = Sheet1.Range("E1:E65")
Set RngA1G1 = Sheet1.Range("A1:G1")
Set Rgn1 = Sheet2.Range("A2")
Set Rng2 = Sheet2.Range("B2")


Sheet2.Select
Sheet2.Range("C3").FormulaArray = Application.WorksheetFunction.Index(RgnA1A65, _
Application.WorksheetFunction.Match(1, --(RgnA1A65 = Rgn1) * (RgnE1E65 = Rgn2), 0), _
Application.WorksheetFunction.Match(Sheet2.Range("C2"), RngA1G1, 0))


End Sub
 
Em chào cả nhà ạ !
Em có đoạn code này mà máy báo lỗi.
Không biết là sai ở đâu. Mong mọi người chỉ giúp ạ.
Mã:
Sub mangct()
Dim RgnA1A65, RgnE1E65, RngA1G1 As Range
Dim Rgn1, Rgn2 As Range
Set RgnA1A65 = Sheet1.Range("A1:A65")
Set RgnE1E65 = Sheet1.Range("E1:E65")
Set RngA1G1 = Sheet1.Range("A1:G1")
Set Rgn1 = Sheet2.Range("A2")
Set Rng2 = Sheet2.Range("B2")

Sheet2.Select
Sheet2.Range("C3").FormulaArray = Application.WorksheetFunction.Index(RgnA1A65, _
Application.WorksheetFunction.Match(1, --(RgnA1A65 = Rgn1) * (RgnE1E65 = Rgn2), 0), _
Application.WorksheetFunction.Match(Sheet2.Range("C2"), RngA1G1, 0))

End Sub
Đầu tiên là sai ở chỗ đoạn code phải đưa vào thẻ code đã, giống như thế này:
 
Lần chỉnh sửa cuối:
Cũng như bạn gửi message cho Bác Sĩ:
Cháu nhà tôi đau bụng, làm cách nào đây? (kèm gửi hình cháu lấy từ Face Book)
Bác sĩ thật ra cần:
- Bạn tự cho là cháu nhà bị đau bụng, trong khi rất có khả năng là đau ngực.
- Bác sĩ cần xem cháu nhà, và hỏi chuyện chứ hình lấy từ FB chả có nghĩa lý gì cả.

Trên thực tế:
- Code bạn gửi mà không có file thì giá trị rất thấp. Chỉ có thể nhìn ra lỗi quá hiển nhiên. Điển hình ở đây, hàm Match trả về lỗi nếu không tìm được. Trong namespace WorhSheetFunction thì lỗi ấy sẽ là run time error, và code dừng lại. Lối này chưa chắc đa là lỗi chính mà bạn vướng.
- Bạn chỉ nói một từ "lỗi", mà không nói lỗi gì, VBA bôi vàng ở đâu. Lại còn tự cho là "công thức mảng" trong khi Match không phải là hàm mảng. Lỗi "đau ngực mà cho là đau bụng"
- Người ta cần xem dữ liệu để mò xem bạn bị sai chỗ nào. Lỗi "không đưa bệnh nhân gặp BS trực tiếp".

Chú thích:
Bây giờ kỹ thuật mạng cao, ở một số nước ngoài chính phủ cho phép BS chẩn qua mạng. Nhưng chỉ là trường hợp BS có hồ sơ bệnh nhân khá chi tiết, và triệu chứng bệnh chỉ nhẹ. Nếu triệu chứng nặng thì BS phải gặp mặt hoặc bảo bệnh nhân gọi nhà thương (cấp cứu)
 
Cũng như bạn gửi message cho Bác Sĩ:
Cháu nhà tôi đau bụng, làm cách nào đây? (kèm gửi hình cháu lấy từ Face Book)
Bác sĩ thật ra cần:
- Bạn tự cho là cháu nhà bị đau bụng, trong khi rất có khả năng là đau ngực.
- Bác sĩ cần xem cháu nhà, và hỏi chuyện chứ hình lấy từ FB chả có nghĩa lý gì cả.

Trên thực tế:
- Code bạn gửi mà không có file thì giá trị rất thấp. Chỉ có thể nhìn ra lỗi quá hiển nhiên. Điển hình ở đây, hàm Match trả về lỗi nếu không tìm được. Trong namespace WorhSheetFunction thì lỗi ấy sẽ là run time error, và code dừng lại. Lối này chưa chắc đa là lỗi chính mà bạn vướng.
- Bạn chỉ nói một từ "lỗi", mà không nói lỗi gì, VBA bôi vàng ở đâu. Lại còn tự cho là "công thức mảng" trong khi Match không phải là hàm mảng. Lỗi "đau ngực mà cho là đau bụng"
- Người ta cần xem dữ liệu để mò xem bạn bị sai chỗ nào. Lỗi "không đưa bệnh nhân gặp BS trực tiếp".

Chú thích:
Bây giờ kỹ thuật mạng cao, ở một số nước ngoài chính phủ cho phép BS chẩn qua mạng. Nhưng chỉ là trường hợp BS có hồ sơ bệnh nhân khá chi tiết, và triệu chứng bệnh chỉ nhẹ. Nếu triệu chứng nặng thì BS phải gặp mặt hoặc bảo bệnh nhân gọi nhà thương (cấp cứu)
cảm ơn bạn. Kiến thức mình còn nông cạn lắm.
Bạn xem giúp mình file nhé.
 

File đính kèm

Nếu đã dùng VBA rồi thì sao bạn không dùng vòng lặp For-Next hoặc Find Method để tìm giá trị trong vùng điều kiện và trả về giá trị tại cột mong muốn?
Dùng INDEX(MATCH nhiều điều kiện trong nhiều cột (như trong ví dụ) chỉ dùng trong sheet thôi, và bạn có thể nhập thẳng vào sheet luôn, không cần dùng code để điền vào ô.
 
Nếu đã dùng VBA rồi thì sao bạn không dùng vòng lặp For-Next hoặc Find Method để tìm giá trị trong vùng điều kiện và trả về giá trị tại cột mong muốn?
Dùng INDEX(MATCH nhiều điều kiện trong nhiều cột (như trong ví dụ) chỉ dùng trong sheet thôi, và bạn có thể nhập thẳng vào sheet luôn, không cần dùng code để điền vào ô.
cảm ơn bạn đã gợi ý.
File này mình chỉ là chạy thử để tìm giải pháp cho file chính của mình thôi.
Thực ra là mình đã thử công thức nhưng do nhiều cột đều dùng công thức như vậy trong khi vùng dữ liệu của mình lên đến gần 300000 dòng excell không chạy được.
thêm nữa là mình phải dò đến 4 cột chứa điều kiện và cột chứa kết quả lại ra từ 1 đến 3 kết quả khác nhau. Vậy dùng find method vẫn ra được hả bạn. VBA mình chỉ mới tìm hiểu nên mình còn ngu lắm.
 
Thứ nhất: Excel vốn không sử lý nổi dữ liệu khủng (trên 100000 dòng, trên 100 cột).
Để có thể vượt qua giới hạn này, Excel các đời sau đã ra Data Model. Data Model sử dụng các ký thuật của SQL Server Express nên sử lý các CSDL khủng tương đối khá hiệu quả. Đây là cái quan tọng nhất mà bạn phải học nếu bạn còn muốn làm việc ở chỗ này.

Thứ hai: Bạn không cần phải biết nhiều lắm để có thể sử dụng Excel. Nhưng vì cách sử dụng của cơ quan bạn vượt trên tầm bình thường (dữ liệu khủng, kém đồng bộ, đầu vào và đầu ra thiết kế như hạch,...) cho nên công việc cứ phải khó khăn.

Thứ ba: Bạn không có căn bản về các hàm cuat VBA và các objects của bảng tính trao về cho VBA. Vì vậy bạn chưa biết cách phân biệt chúng. Lúc bắt đầu viết code thì chỉ cần cho căn bản thôi, mấy phần rườm rà còn lại tính sau.
 
cảm ơn bạn đã gợi ý.
File này mình chỉ là chạy thử để tìm giải pháp cho file chính của mình thôi.
Thực ra là mình đã thử công thức nhưng do nhiều cột đều dùng công thức như vậy trong khi vùng dữ liệu của mình lên đến gần 300000 dòng excell không chạy được.
thêm nữa là mình phải dò đến 4 cột chứa điều kiện và cột chứa kết quả lại ra từ 1 đến 3 kết quả khác nhau. Vậy dùng find method vẫn ra được hả bạn. VBA mình chỉ mới tìm hiểu nên mình còn ngu lắm.
300K dòng, 4 cột điều kiện và 3 cột kết quả, công thức không chạy nổi đâu.
Nên nghiên cứu VBA nhé.
 
Thứ nhất: Excel vốn không sử lý nổi dữ liệu khủng (trên 100000 dòng, trên 100 cột).
Để có thể vượt qua giới hạn này, Excel các đời sau đã ra Data Model. Data Model sử dụng các ký thuật của SQL Server Express nên sử lý các CSDL khủng tương đối khá hiệu quả. Đây là cái quan tọng nhất mà bạn phải học nếu bạn còn muốn làm việc ở chỗ này.

Thứ hai: Bạn không cần phải biết nhiều lắm để có thể sử dụng Excel. Nhưng vì cách sử dụng của cơ quan bạn vượt trên tầm bình thường (dữ liệu khủng, kém đồng bộ, đầu vào và đầu ra thiết kế như hạch,...) cho nên công việc cứ phải khó khăn.

Thứ ba: Bạn không có căn bản về các hàm cuat VBA và các objects của bảng tính trao về cho VBA. Vì vậy bạn chưa biết cách phân biệt chúng. Lúc bắt đầu viết code thì chỉ cần cho căn bản thôi, mấy phần rườm rà còn lại tính sau.
cảm ơn bạn !
Chỗ mình dùng excell 2016 bạn ạ.
 
Web KT

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

Back
Top Bottom