Cell "RỖNG BÌNH THƯỜNG" và cell "BỊ CÔNG THỨC LÀM CHO RỖNG" có gì khác nhau?

Liên hệ QC
Ý tôi ko phải bắt bẽ chuyện TÊN... Tôi thấy MS có phân biệt rõ 2 tên là: BLANK và EMPTY... vậy chẳng lẽ VN mình chưa có... Nếu thế thì khó cho việc dạy và học đấy nhé!
 
Tôi đang tưởng tượng thấy giáo giãng bài cho học sinh và nói rằng: Ô này là 1 ô rỗng (EMPTY)... còn ô kia là 1 ô.. rào (2 dấu "", nghĩa là BLANK)... ha... ha... Nếu thế thì thà đọc nguyên mẫu tiếng Anh còn dễ hiểu hơn... EMPTY và BLANK...
Ai dà.. tiếng Việt... Bởi vậy tôi thà xài Win tiếng Anh chứ nhất định ko thèm xài Win Việt hóa (mặc dù ko rành tiếng Anh lắm)... Điện thoại cũng thế, đễ tiếng Anh còn thấy dễ hiểu hơn... ha... ha...
 
Thực tình không hẳn cái gì dịch ra TV cũng tốt, và ngược lại để nguyên TA cũng tốt. Tuy nhiên dù thế nào đi chăng nữa thì khái niệm về một cái gì đó nhất định phải diễn giải ra Tiếng Việt.

Vô cực là một khái niệm (trong đó có số vô cực và miền vô cực), phép chia 0/0 cũng là một TH phải vận dụng khái niệm để giải thích. Và tất cả mọi thứ đều phải giải nghĩa theo Tiếng Việt. Khi đó tên gọi trở thành không quan trọng, bản chất(được khái quát bởi khái niệm) mới là quan trọng.

Rất khó cho người mới bước vào toán học, nhưng đến một trình độ nào đó thì họ buộc phải hiểu điều này.

Như vậy khái niệm về blank và empty cũng gần như thế.

Ta có thể nói : ô này rỗng, ô này có giá trị rỗng . . . không sao cả. Quan trọng là hiểu cái đó là như thế nào, TH nào thì 2 cái là 1.

Thân!
 
Tất nhiên chúng ta hiểu điều này... dù chỉ nói RỖNG ko thôi, nhưng khi nhìn vào trạng thái 1 cell chúng ta cũng hiểu là mình đang nói đến cái rỗng nào: EMPTY hay cái BLANK... tuy nhiên, ở đây tôi muốn nói đến 1 vấn đề có liên quan đến việc dạy cho người mới học... Ko khéo họ sẽ hiểu lầm, tưởng cái nào cũng như nhau... nền tãng đã sai thì mai này càng sai nhiều hơn..
 
anhtuan1066 đã viết:
Tất nhiên chúng ta hiểu điều này... dù chỉ nói RỖNG ko thôi, nhưng khi nhìn vào trạng thái 1 cell chúng ta cũng hiểu là mình đang nói đến cái rỗng nào: EMPTY hay cái BLANK... tuy nhiên, ở đây tôi muốn nói đến 1 vấn đề có liên quan đến việc dạy cho người mới học... Ko khéo họ sẽ hiểu lầm, tưởng cái nào cũng như nhau... nền tãng đã sai thì mai này càng sai nhiều hơn..

Tiếng Việt thì đơn giản lắm : Chỉ có 2 TH : RỖNG và CÓ GIÁ TRỊ (không rỗng)

Còn blank chỉ là TH đặc biệt của CÓ GIÁ TRỊ thôi mà


Người mới bắt đầu thì sẽ được học như thế nào là sheet, là các ô, là công thức . . , cách sử dụng . . .

Mặc dù nó là nền tảng, nhưng phải ở cấp độ nào đó thì người học mới hiểu được những điều này.

Khi ta học toán, ta sẽ học 1+1=2; rồi sau đó là phép nhân phép chia, số không, số âm, số vô cực, số vô tỷ . . . .

Mặc dù tất cả đều là nền tảng, nhưng không có nghĩa rằng với người mới bắt đầu phải học hết mọi nền tảng đấy. Trong tương lai họ sẽ được học tương đương với cấp độ của họ (để họ còn hiểu chứ)

Học về ngành điện không có nghĩa rằng tất cả các khái niệm nền tảng về điện đều được dạy ngay từ đầu, nào là ion âm, ion dương, nào là phân tử, nào là nguyên tử, nào là hạt cơ bản, nào là vật chất, nào là phản vật chất. Sự tương tác của vật chất và phản vật chất sẽ cho ra dòng điện thế nào, sự phân rã sẽ cho dòng điện thế nào, năng lượng ra sao, rồi điện năng, rồi hao phí, rồi hiệu điện thế, rồi kháng trở . . .

Đấy, nếu mà học hết các điều đó thì có mà . . . chết . . . . vì không hiểu. Cần phải có một trình độ nhất định thì mới dần dần tiếp thu được.

Triết học nói : Phải có sự tích lũy về lượng mới có sự nhảy vọt về chất được.

Thân!
 
Chủ đề này quá hay. Lâu nay tôi cứ hay bị lăn tăn khi dùng các hàm đếm... Cảm ơn anhtuan đã bàn đến vấn đề này.
 
Bạn anhtuan1066 có thể giúp mình khắc phục lỗi cell rỗng trong công thức không đếm giá trị trùng sau khi filter như hướng dẫn bên dưới không. Do trong trường hợp nếu dữ liệu có ô trả về giá trị ="" thì hàm vẫn đếm là 1 (đúng ra phải không đếm).
Cảm ơn bạn.

Sau khi Autofilter thì đếm số (các số trùng nhau thì không).

chẳng hạn: sau khi E lọc TP thì sẽ đếm xem TP có bao nhiêu cụm.
E cam on A trc nhé. A mở file đính kèm, A sẽ dễ hình dung hơn.Thanks A.



- Đặt 2 name
Code:
Rng = Sheet1!$C$3:$C$22

Code:
tmp =SUBTOTAL(103,OFFSET(Rng,ROW(INDIRECT("1:"&ROWS(Rng)))-1,,1,))

(Mục đích đặt name để rút gọn công thức)
- Công thức để đếm:
Code:
=COUNT(1/FREQUENCY(IF(tmp,MATCH(Rng,Rng,0)),IF(tmp,MATCH(Rng,Rng,0))))

Công thức này là công thức mảng, gõ xong phải bấm tổ hợp phím Ctrl + Shift + Enter
Nếu vùng dữ liệu của bạn không giống với file đính kèm, sửa lại tham chiếu trong name Rng nhé
 
Tôi gặp phải vấn đề về "ô rỗng bình thường" và "ô rỗng không bình thường". Các vấn đề được nêu trong file đính kèm. Nhờ các anh chị xem và giúp đỡ. Xin chân thành cảm ơn.
 

File đính kèm

  • ORong.xlsx
    41.7 KB · Đọc: 8
Bạn chạy thử đoạn code này
Mã:
Sub test()
    Debug.Print Sheet10.Range("H1").Value
    Debug.Print VarType(Sheet10.Range("H1").Value)
    Debug.Print TypeName(Sheet10.Range("H1").Value)
    
    Debug.Print Sheet10.Range("H2").Value
    Debug.Print VarType(Sheet10.Range("H2").Value)
    Debug.Print TypeName(Sheet10.Range("H2").Value)
    
    Sheet10.Range("H1").Value = Empty
End Sub
 
Bạn chạy thử đoạn code này
Mã:
Sub test()
    Debug.Print Sheet10.Range("H1").Value
    Debug.Print VarType(Sheet10.Range("H1").Value)
    Debug.Print TypeName(Sheet10.Range("H1").Value)
   
    Debug.Print Sheet10.Range("H2").Value
    Debug.Print VarType(Sheet10.Range("H2").Value)
    Debug.Print TypeName(Sheet10.Range("H2").Value)
   
    Sheet10.Range("H1").Value = Empty
End Sub
Cảm ơn anh ThangCuAnh, nhưng vẫn chưa được anh ạ.
Tui sửa lại như vầy
Sub test()
Debug.Print Sheet10.Range("A1:H1").Value
Debug.Print VarType(Sheet10.Range("A1:H1").Value)
Debug.Print TypeName(Sheet10.Range("A1:H1").Value)

'Debug.Print Sheet10.Range("H2").Value
'Debug.Print VarType(Sheet10.Range("H2").Value)
'Debug.Print TypeName(Sheet10.Range("H2").Value)

Sheet10.Range("A1:H1").Value = Empty
'Sheet10.Range("H2").Value = Empty
End Sub
thì bị lỗi tại dòng màu vàng

219737
 
Sheet của file bạn đang chạy có phải là Sheet10 không, không thì sữa lại.
Đoạn code đó tui viết cho file ORong.xlsx mà bạn up đó
Khổ ghê, có chút xíu đó mà....
Thôi nói nôm na là 1 cell của Excel được lưu trữ trong bộ nhớ là 1 struct VARIANT (kiểu của Windows API), được diễn giãi thông dịch qua Excel, VBA thành kiểu wrapper là Variant
Variant là loại ba phải, chứa đủ kiểu dữ liệu trong ruột nó được hết: Char, Int, Long, Double, String, Object, Empty, Null....
Mặc định là Empty (VT_EMPTY trong Windows API) khi nó mới khởi tạo, chưa ai đụng tới nó gì hết, hay còn gọi là Blank, còn khi nó chứa String (kiểu BSTR trong Windows API) thì nếu len là 0 thì nó là chuỗi rỗng.
Sẵn đây nói luôn, kiểu tương ứng giữa Excel, VB/VBA và Windows API:
Variant = VARIANT
String = BSTR
Array = SAFEARRAY
Object = C++ Object của IUnknown interface.
 
Lần chỉnh sửa cuối:
Sheet của file bạn đang chạy có phải là Sheet10 không, không thì sữa lại.
Đoạn code đó tui viết cho file ORong.xlsx mà bạn up đó
Khổ ghê, có chút xíu đó mà....
Thôi nói nôm na là 1 cell của Excel được lưu trữ trong bộ nhớ 1 VARIANT (kiểu của Windows API), diễn giãi thông dịch qua Excel, VBA thành kiểu wrapper là Variant
Variant là loại ba phải, chứa đủ kiểu dữ liệu trong ruột nó được hết: Char, Int, Long, Double, String, Object, Empty, Null
Mặc định là Empty (VT_EMPTY trong Windows API), tức nó là Blank, còn khi nó chứa String (kiểu BSTR trong Windows API) thì nếu len là 0 thì nó là chuỗi rỗng.
Đúng sheet10 đó anh.
219753
 
Vậy thì lưu nó lại thành file Excel Macro .xlsm đi rồi thử lại.
 
Cảm ơn anh ThangCuAnh, nhưng vẫn chưa được anh ạ.
Tui sửa lại như vầy
Sub test()
Debug.Print Sheet10.Range("A1:H1").Value
Debug.Print VarType(Sheet10.Range("A1:H1").Value)
Debug.Print TypeName(Sheet10.Range("A1:H1").Value)

'Debug.Print Sheet10.Range("H2").Value
'Debug.Print VarType(Sheet10.Range("H2").Value)
'Debug.Print TypeName(Sheet10.Range("H2").Value)

Sheet10.Range("A1:H1").Value = Empty
'Sheet10.Range("H2").Value = Empty
End Sub
thì bị lỗi tại dòng màu vàng

View attachment 219737
Chổ màu vàng là sai, sửa lại là
Mã:
Debug.Print Sheet10.Range("A1").Value
thì có hy vọng.
 
Tôi đã chỉ tường minh ra cell H1 và H2, bạn lại đi sữa thày array của cell từ A1 tới H1.
2 ô màu vàng và màu xanh trong file ORong.xlsx của bạn đó.
 
Khổ ghê, bạn copy code của tui mà sữa lại chi vậy, tôi đã chỉ tường minh ra là ô H1, H2
Mã:
Sub test()
    Debug.Print Sheet10.Range("H1").Value
    Debug.Print VarType(Sheet10.Range("H1").Value)
    Debug.Print TypeName(Sheet10.Range("H1").Value)
    
    Debug.Print Sheet10.Range("H2").Value
    Debug.Print VarType(Sheet10.Range("H2").Value)
    Debug.Print TypeName(Sheet10.Range("H2").Value)
    
    Sheet10.Range("H1").Value = Empty
End Sub
 
Dà, nhưng mong muốn là: Biến các ô rỗng không bình thường thành các ô rỗng bình thường bằng VBA trong vùng đã chọn anh à.
Cảm ơn anh rất vì sự nhiệt tình.
 
Vậy thì duyệt qua từng cell trong Range, VarType thằng nào mà là vbString và Len = 0 thì cho cell.Value = Empty
Còn code sub Test mà tôi đưa ra chỉ minh họa cho bạn cách kiểm tra kiểu cell rỗng thôi. Bạn chế ra, thêm mắm muối cho yêu cầu của bạn chứ.
Bạn sữa thành A1:H1 thì báo lỗi là phải rồi, vì statement Debug.Print không accept kiểu array của Variant
 
Vậy thì duyệt qua từng cell trong Range, VarType thằng nào mà là vbString và Len = 0 thì cho cell.Value = Empty
Tui có dùng vòng lặp for next và đã giải quyết được nhưng chậm quá, (có những sheet nó quay ~90 giây, tùy theo số dòng nó duyệt) nên lên đây nhờ các anh chị trợ giúp tìm cách thực hiện nhanh hơn.
 
Web KT
Back
Top Bottom