Làm cách nào bỏ qua mảng toàn giá trị rỗng ?

  • Thread starter Thread starter boma
  • Ngày gửi Ngày gửi
Liên hệ QC

boma

Thành viên mới
Tham gia
8/12/06
Bài viết
43
Được thích
5
Giới tính
Nữ
-Mình tạo một form để nhập dữ liệu (như file đính kèm), mô phỏng đúng y như form giấy thực tế.
-Gán giá trị vùng màu trắng vào mảng tmp, và vùng màu xanh vào mảng tmv để đưa vào sheet2 và sheet 3.
-Một trong 2 vùng đôi khi không có dữ liệu nào (vì máy nghỉ)
-Vấn đề là khi 2 vùng trắng, xanh có dữ liệu thì ko code chạy ok còn khi một trong hai vùng ko có dữ liệu nào thì cứ chạy tới dòng cuối (dòng gán dữ liệu) là báo lỗi "1004". Mình biết là do mảng đó toàn giá trị rỗng nên không gán được. Viết tách ra làm 2 nút nghi thì không có gì để nói. Vậy xin hỏi có cách nào để trương trình bỏ qua mảng rỗng và chỉ gán mảng có dữ liệu không ? Đã thử cả "If Isempty(array) Then Earse array" rồi mà sao vẫn không được. Mong các bạn giúp đỡ.
 

File đính kèm

-Mình tạo một form để nhập dữ liệu (như file đính kèm), mô phỏng đúng y như form giấy thực tế.
-Gán giá trị vùng màu trắng vào mảng tmp, và vùng màu xanh vào mảng tmv để đưa vào sheet2 và sheet 3.
-Một trong 2 vùng đôi khi không có dữ liệu nào (vì máy nghỉ)
-Vấn đề là khi 2 vùng trắng, xanh có dữ liệu thì ko code chạy ok còn khi một trong hai vùng ko có dữ liệu nào thì cứ chạy tới dòng cuối (dòng gán dữ liệu) là báo lỗi "1004". Mình biết là do mảng đó toàn giá trị rỗng nên không gán được. Viết tách ra làm 2 nút nghi thì không có gì để nói. Vậy xin hỏi có cách nào để trương trình bỏ qua mảng rỗng và chỉ gán mảng có dữ liệu không ? Đã thử cả "If Isempty(array) Then Earse array" rồi mà sao vẫn không được. Mong các bạn giúp đỡ.
Trong Sub Ghi bản sửa 2 câu lệnh cũ thành
Mã:
  If k Then Sheet2.Range("B" & rng + 1).Resize(k, 8) = tmp
  If m Then Sheet3.Range("B" & rng2 + 1).Resize(m, 11) = tmv
 
Upvote 0
Trong Sub Ghi bản sửa 2 câu lệnh cũ thành
Mã:
  If k Then Sheet2.Range("B" & rng + 1).Resize(k, 8) = tmp
  If m Then Sheet3.Range("B" & rng2 + 1).Resize(m, 11) = tmv
Cảm ơn bạn, đơn giản mà hay quá, không để ý là nếu các phần tử của mảng DataV mà =0 thì thoát ra khỏi vòng if, m không thay đổi nên đặt điều kiện theo m và k là giải quyêt được.
 
Upvote 0
- Xin hỏi các bạn một vấn đề mới phát sinh. Trước đây, trong file_1, sheet2 (PVC), mình tính SUM trong code VBA rồi gán giá trị vào cột TỔNG. Nay mình dùng vba gán vào cột Tổng một công thức tính SUM, mình viết thêm đoạn code như sau :

Sheet2.Range("I" & rng + 1).Select
ActiveCell.FormulaR1C1 = "=SUM(RC[-3]:RC[-1])"


Vấn đề là nếu đang ở sheet2 thì code chạy ok, nhưng nếu đang ở sheet1 (form nhập liệu) thì bị báo lỗi 1004. Tại sao ở dòng code gán mảng Sheet2.Range("B" & rng + 1).Resize(k, 7) = tmp thì đang ở sheet1 cũng không sao nhưng khi dùng phương thức này để gán công thức thì báo lỗi ?

- Mình gởi file_2 đính kèm
 

File đính kèm

Upvote 0
- Xin hỏi các bạn một vấn đề mới phát sinh. Trước đây, trong file_1, sheet2 (PVC), mình tính SUM trong code VBA rồi gán giá trị vào cột TỔNG. Nay mình dùng vba gán vào cột Tổng một công thức tính SUM, mình viết thêm đoạn code như sau :

Sheet2.Range("I" & rng + 1).Select
ActiveCell.FormulaR1C1 = "=SUM(RC[-3]:RC[-1])"


Vấn đề là nếu đang ở sheet2 thì code chạy ok, nhưng nếu đang ở sheet1 (form nhập liệu) thì bị báo lỗi 1004. Tại sao ở dòng code gán mảng Sheet2.Range("B" & rng + 1).Resize(k, 7) = tmp thì đang ở sheet1 cũng không sao nhưng khi dùng phương thức này để gán công thức thì báo lỗi ?

- Mình gởi file_2 đính kèm
Thử sửa lại thế này.
Mã:
Sheet2.Range("I" & rng + 1).FormulaR1C1 = "=SUM(RC[-3]:RC[-1])"
 
Upvote 0
Thử sửa lại thế này.
Mã:
Sheet2.Range("I" & rng + 1).FormulaR1C1 = "=SUM(RC[-3]:RC[-1])"

Sửa theo code này chương trình chạy rất tốt, nhưng xin giúp cho mấy dòng giải thích vì sao code phía trên của em chạy không được, dù trước đó có Activate sheet2 rồi mà cũng không được.
 
Upvote 0
Sửa theo code này chương trình chạy rất tốt, nhưng xin giúp cho mấy dòng giải thích vì sao code phía trên của em chạy không được, dù trước đó có Activate sheet2 rồi mà cũng không được.
Code của bạn chổ nào thể hiện Activate sheet2 chỉ tôi xem với.
 
Upvote 0
Code của bạn chổ nào thể hiện Activate sheet2 chỉ tôi xem với.
Trước đó em có thử code dùng Activate rồi nhưng không được nên xóa. Em dùng Sheet2.Range là để đặt câu hỏi vì sao dòng Sheet2.Range("B" & rng + 1).Resize(k, 8) = tmp làm được mà code ở #4 thì không. Trước khi hỏi, em cũng đã đọc chương 7 và 8 sách của anh Phan Tự Hướng về cách làm việc với các đối tượng rồi mà vẫn chưa nhìn ra được.
 
Upvote 0
có thử code dùng Activate rồi nhưng không được
Bạn chạy lại xem. Nếu lỗi thì nhớ chụp hình báo lỗi rồi gửi lên đây.
PHP:
If k Then Sheet2.Range("B" & rng + 1).Resize(k, 7) = tmp
Sheet2.Activate
Sheet2.Range("I" & rng + 1).Select
ActiveCell.FormulaR1C1 = "=SUM(RC[-3]:RC[-1])"
If m Then Sheet3.Range("B" & rng2 + 1).Resize(m, 11) = tmv
 
Upvote 0
Nguyên nhân?
Bạn chỉ có thể dùng phương thức Select của Range thuộc sheet đang Active mà thôi.

Vì thế mà sẽ lỗi ở dòng
Mã:
Sheet2.Range("I" & rng + 1).Select
khi sheet1 đang active.

Vì khi sheet1 đang active thì rõ ràng Range Sheet2.Range("I" & rng + 1) không thuộc sheet đang active là Sheet1 - range này thuộc Sheet2. Vì thế có lỗi.
Em dùng Sheet2.Range là để đặt câu hỏi vì sao dòng Sheet2.Range("B" & rng + 1).Resize(k, 8) = tmp làm được mà code ở #4 thì không.
Có những việc có thể làm trên sheet không active nhưng có những việc làm sẽ có lỗi. Việc trên làm được, việc
Mã:
Sheet2.Range("I" & rng + 1).FormulaR1C1 = "=SUM(RC[-3]:RC[-1])"
cũng làm được, nhưng việc Select không được làm.

Nói chung nếu làm được mà không cần active sheet thì bỏ cái trò sheet.Activate + Range.Select đi cho nhẹ người.
Trước khi hỏi, em cũng đã đọc chương 7 và 8 sách của anh Phan Tự Hướng về cách làm việc với các đối tượng rồi mà vẫn chưa nhìn ra được.
Tôi không biết trong những sách bạn đọc tác giả có nói rõ không nhưng nếu bạn đọc 10 sách mà tác giả không nói thì cũng như không.
 
Upvote 0
Web KT

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

Back
Top Bottom