Dim và Set

Liên hệ QC

feelingyes

Thành viên tiêu biểu
Tham gia
24/9/07
Bài viết
459
Được thích
395
Nghề nghiệp
Economic
Các anh chị cho em hỏi
Dim và Set khác nhau ở chỗ nào?
Có phải là Dim cho các thuộc tính, còn Set cho các Object?

Ví dụ
PHP:
Sub Bignumber()
Dim rowNumber As Integer, colNumber As Integer, currCell As Range
RowNum = Active.Row
Colnum = Active.Column
Set currCell = ActiveSheet.Cells(RowNum, Colnum)
Do While currCell.Value <> ""
If IsNumeric(currCell.Value) Then
If currCell.Value >= 1000 Then
currCell.Font.Color = VBAColor("magenta")
End If
End If
RowNum = RowNum + 1
Set currCell = ActiceSheet.Cells(RowNum, Colnum)
Loop
End Sub
Trong ví dụ trên em chạy không được (thủ tục dùng vòng lặp Do loop khi gặp một ô trắng), không biết sai ở chỗ nào?

Anh chị giúp em với
 
Chỉnh sửa lần cuối bởi điều hành viên:
Dim dùng để khai báo biến
Set dùng để gán giá trị cho biến đối tượng
 
Upvote 0
Sửa lại thế này là chạy được

PHP:
Option Explicit

Sub Bignumber()
Dim rowNum As Integer, colNum As Integer, currCell As Range
rowNum = ActiveCell.Row
colNum = ActiveCell.Column
Set currCell = ActiveSheet.Cells(rowNum, colNum)
Do While currCell.Value <> ""
If IsNumeric(currCell.Value) Then
If currCell.Value >= 1000 Then
currCell.Font.ColorIndex = 7
End If
End If
rowNum = rowNum + 1
Set currCell = ActiveSheet.Cells(rowNum, colNum)
Loop
End Sub
 
Upvote 0
Đây là đoạn code mình đã sửa:
Mã:
Option Explicit
Sub Bignumber()
Dim rowNumber As Integer, colNumber As Integer, currCell As Range

rowNumber = ActiveCell.Row
colNumber = ActiveCell.Column
 
Set currCell = ActiveSheet.Cells(rowNumber, colNumber)
 
Do While Not IsEmpty(currCell.Value)
    If IsNumeric(currCell.Value) Then
        If currCell.Value >= 1000 Then
            currCell.Font.Color = -16776961 'Red color
            'currCell.Font.Color = VBAColor("magenta")
        End If
    End If
    rowNumber = rowNumber + 1
    Set currCell = ActiveSheet.Cells(rowNumber, colNumber)
Loop
End Sub

P/S:
Để kiểm tra ô rỗng hay không bạn dùng hàm IsEmpty.
Chú ý viết tên các từ khóa, tên biến... cho đúng.
(Đánh vài chữ đầu, rồi nhấn Ctrl+Space để hiện ra danh sách, di chuyển phím mũi tên để chọn, cuối cùng là nhấn Enter.)
 
Upvote 0

Vì dùng Do While!
Trong Do While currCell.Value <> "", .value <>”” là điều kiện chạy code, khi .value = “” là không còn thoả đk chạy, thì phải thoát Do.

Vậy trong cột kín dữ liệu thì thôi, hễ có cell trống thì nó thoát đúng rồi.

 
Upvote 0
ptm0412 đã viết:
Vì dùng Do While!
Trong Do While currCell.Value <> "", .value <>”” là điều kiện chạy code, khi .value = “” là không còn thoả đk chạy, thì phải thoát Do.

Vậy trong cột kín dữ liệu thì thôi, hễ có cell trống thì nó thoát đúng rồi.
Nhưng đại ca ơi cho hỏi: có phải code này đễ tô màu cell nào có giá trị >=1000 hay ko?
(Chả biết Do While xài thế nào nên ko hiểu)
ANH TUẤN
 
Upvote 0
Theo em biết có 3 dạng vòng lặp
1. Do loop (dùng khi không biết chính xác số lần lặp là ?)
-------------trong DO LOOP có 4 cú pháp
a) Do while condition [statement] Loop
kiểm tra condition trước khi vào vòng lặp. Thực hiện câu lệnh statement khi condition là true
b) Do [statement] loop while condition
kiểm tra condition sau khi chạy vòng lặp 1 lần
c) Do until condition [statement] loop
kiểm tra condition trước khi vào vòng lặp, thực hiện câu lệnh [statement] khi condition là fasle
d) do [statement] loop untill condition
kiểm tra condition sau khi chạy vòng lặp một lần. thực hiện statement khi condition là false
2. Vòng lặp for ..next
3. vòng lặp for each next
 
Upvote 0
ptm0412 đã viết:
Vì dùng Do While!
Trong Do While currCell.Value <> "", .value <>”” là điều kiện chạy code, khi .value = “” là không còn thoả đk chạy, thì phải thoát Do.

Vậy trong cột kín dữ liệu thì thôi, hễ có cell trống thì nó thoát đúng rồi.

ý anh là em phải thêm
Exit do
đúng không anh?
 
Upvote 0
code của em dùng để chạy suốt một cột của worksheet và thay đổi màu font là Magenta bất cứ một ô nào chứa một số lớn hơn hoặc bằng 1000
 
Upvote 0
Ah... còn câu hỏi: Code của bạn feelingyes dùng đễ làm gì? Sao ko thấy ai trả lời thế nhỉ?
Đúng là tô màu như anhtuan đoán.
ý anh là em phải thêm
Exit do
Theo code hiện tại nếu dọc đường chưa hết cột mà gặp cell rỗng, nó thoát. Muốn cho nó chạy tiếp đến hết cột thì sửa điều kiện thoát lại:
Do While Currcell.row <= xEndrow
với xEndRow khai báo và gán giá trị từ đầu là
xEndRow = ActiveCell.End(xlDown).Row
 
Upvote 0
feelingyes đã viết:
code của em dùng để chạy suốt một cột của worksheet và thay đổi màu font là Magenta bất cứ một ô nào chứa một số lớn hơn hoặc bằng 1000
Ai cha... thế sao ko For Each cho tiện và dể hiểu (hay định nghiên cứu thêm vậy?)... Sao ko là:
PHP:
Sub TOMAU()
  Dim Vung As Range, Clls As Range
  Set Vung = Selection
  Set Vung = Application.InputBox(Prompt:="Chon vung can to mau", Default:=Vung.Address, Type:=8)
     For Each Clls In Vung
       If Clls <> "" And Clls.Value >= 1000 Then
          Clls.Font.ColorIndex = 3 'hay =cái gì đó tùy bạn
       End If
     Next
End Sub
Mà nghỉ cũng ngộ... Với trò tô màu này thì bảo đãm ko có code nào nhanh dc bằng Custom Format hoặc Conditional Formating... Sao bạn ko chọn cái hay, lại đi chọn cái dở hơn thế nhỉ?
ANH TUẤN
 
Upvote 0
anhtuan1066 đã viết:
Ai cha... thế sao ko For Each cho tiện và dể hiểu (hay định nghiên cứu thêm vậy?)... Sao ko là:

Dùng Do While như bạn ý tiện hơn atuan ah, khi đó k cần chọn chỉ cần đặt con trỏ vào ô đầu tiên cột muốn xét
 
Upvote 0
tigertiger đã viết:
Dùng Do While như bạn ý tiện hơn atuan ah, khi đó k cần chọn chỉ cần đặt con trỏ vào ô đầu tiên cột muốn xét
Tôi chưa biết Do While, nhưng nếu bạn ấy muốn thế (tức đặt con trỏ vào ô đầu tiên cột muốn xét) thì vẫn làm dc như thường... Việc tìm cell cuối cùng bằng lệnh End ai mà chẳng biết...
Ý tôi đang thắc mắc là ko biết có phải bạn ấy đang thử code chơi thôi hay dùng thật vào công việc? Test chơi thì ko nói làm gì.. còn dùng thật thì.. có vẽ ko cần thiết
ANH TUẤN
 
Upvote 0
AnhTuan nói đúng đó, em đang mầy mò thử thôi, chứ em không dùng trong công việc. Cám ơn anh
 
Upvote 0
anhtuan1066 đã viết:
Ai cha... thế sao ko For Each cho tiện và dể hiểu (hay định nghiên cứu thêm vậy?)... Sao ko là:
PHP:
Sub TOMAU()
  Dim Vung As Range, Clls As Range
  Set Vung = Selection
  Set Vung = Application.InputBox(Prompt:="Chon vung can to mau", Default:=Vung.Address, Type:=8)
     For Each Clls In Vung
       If Clls <> "" And Clls.Value >= 1000 Then
          Clls.Font.ColorIndex = 3 'hay =cái gì đó tùy bạn
       End If
     Next
End Sub
Mà nghỉ cũng ngộ... Với trò tô màu này thì bảo đãm ko có code nào nhanh dc bằng Custom Format hoặc Conditional Formating... Sao bạn ko chọn cái hay, lại đi chọn cái dở hơn thế nhỉ?
ANH TUẤN

CF và Sub khác nhau chứ bác, CF là công thức "sống" nên sẽ gây nặng máy hơn là Sub, vì Sub chỉ chạy 1 lần, còn CF thì luôn luôn kiểm tra.

Thân!
 
Upvote 0
Mr Okebab đã viết:
CF và Sub khác nhau chứ bác, CF là công thức "sống" nên sẽ gây nặng máy hơn là Sub, vì Sub chỉ chạy 1 lần, còn CF thì luôn luôn kiểm tra.

Thân!
Vụ công thức nằm trực tiếp trên bảng tính thì tôi đồng ý là nó sẽ nặng thêm... Còn CF thì ko? Bắp đã thử chưa? Tôi đang thí nghiệm đây! (dử liệu 10,000 dòng)
Năng? Là Bắp nói năng theo nghĩa gì? Năng về dung lượng? Ko thể nào? File tôi có dung lượng 1M, sau khi them CF vào hầu ko tăng tí dung lượng nào cả... Còn như Bắp nói năng về tốc độ thì... he.. he.. hình như là nói ngược rồi... Code làm sao nhanh dc bằng CF chứ...
Nói chung trước khi đưa ra nhận định các bạn cứ test thử cái biết liền... Test trên file càng nhều dử liệu càng tốt.... Ai dám cá vụ tô màu này dùng code nhanh hơn CF thì tôi sẳn sàng tiếp chiêu
Khi code quét toàn bộ dử liệu trên 50.000 cell (10000 dòng x 5 cột) nó mà ko lết bánh mới là chuyện lạ... he... he...
ANH TUẤN
 
Lần chỉnh sửa cuối:
Upvote 0
anhtuan1066 đã viết:
Vụ công thức nằm trực tiếp trên bảng tính thì tôi đồng ý là nó sẽ nặng thêm... Còn CF thì ko? Bắp đã thử chưa? Tôi đang thí nghiệm đây! (dử liệu 10,000 dòng)
Năng? Là Bắp nói năng theo nghĩa gì? Năng về dung lượng? Ko thể nào? File tôi có dung lượng 1M, sau khi them CF vào hầu ko tăng tí dung lượng nào cả... Còn như Bắp nói năng về tốc độ thì... he.. he.. hình như là nói ngược rồi... Code làm sao nhanh dc bằng CF chứ...
Nói chung trước khi đưa ra nhận định các bạn cứ test thử cái biết liền... Test trên file càng nhều dử liệu càng tốt.... Ai dám cá vụ tô màu này dùng code nhanh hơn CF thì tôi sẳn sàng tiếp chiêu
Khi code quét toàn bộ dử liệu trên 50.000 cell (10000 dòng x 5 cột) nó mà ko lết bánh mới là chuyện lạ... he... he...
ANH TUẤN

Em cho rằng CF nặng hơn Sub, Sub chỉ nặng khi nó chạy, còn lúc nó không chạy thì . . . . chẳng ảnh hưởng đến ai cả, còn CF thì lúc nào cũng chạy, nặng là ở chỗ này bác ạ.

Bác cứ thử cho em VD nhiều nhiều dữ liệu xíu, em và bác cùng thử.

Thân!
 
Upvote 0
Mr Okebab đã viết:
Em cho rằng CF nặng hơn Sub, Sub chỉ nặng khi nó chạy, còn lúc nó không chạy thì . . . . chẳng ảnh hưởng đến ai cả, còn CF thì lúc nào cũng chạy, nặng là ở chỗ này bác ạ.

Bác cứ thử cho em VD nhiều nhiều dữ liệu xíu, em và bác cùng thử.

Thân!
Bắp nói Sub chỉ nặng khi chạy thì tôi đồng ý... Còn bảo CF sẽ nặng thì tôi ko tán thành... Thử file này xem!
ANH TUẤN
 
Lần chỉnh sửa cuối:
Upvote 0
He... he... Đúng là làm khó mình thiệt... Giả lập dử liệu có khó gì chứ, cứ bắt mình phải post file lên... Hic..
Các bạn tải file về nhanh nhé, ngày mai tôi sẽ xóa nó đi... Hết tài nguyên rồi
ANH TUẤN
 
Upvote 0
Đại ca ơi... vậy Đại ca làm cách nào đễ test với Sub đây ? Thay đổi dử liệu nhưng code có chạy đâu mà test?
Tôi nghĩ thêm 1 phương pháp nữa đễ thử nghiệm... Đại ca xóa hết điều kiện trong CF rồi cũng gõ số 1 và Ctrl + Enter xem... he... he... Dù ko có CF nó vẫn chạy thế cơ mà... Vậy suy ra cái gì ta tự hiểu nhé
ANH TUẤN
 
Upvote 0
Web KT

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

Back
Top Bottom