Câu lệnh "If K Then..." có nghĩa là gì? (1 người xem)

  • Thread starter Thread starter ads_ads
  • Ngày gửi Ngày gửi

Người dùng đang xem chủ đề này

ads_ads

Thành viên mới
Tham gia
15/1/13
Bài viết
21
Được thích
5
PHP:
Public Sub GPE()
Dim Dic As Object, sArr(), dArr(), I As Long, J As Long, K As Long, Tem As Variant
Set Dic = CreateObject("Scripting.Dictionary")
With Sheets("Sheet1")
    sArr = .Range(.[A2], .[A1048576].End(xlUp)).Resize(, 8).Value
End With
ReDim dArr(1 To UBound(sArr, 1), 1 To 8)
For I = 1 To UBound(sArr, 1)
    Tem = sArr(I, 1)
    If Not Dic.Exists(Tem) Then
        K = K + 1
        Dic.Add Tem, K
        For J = 1 To 8
            dArr(K, J) = sArr(I, J)
        Next J
    Else
        For J = 3 To 8
            dArr(Dic.Item(Tem), J) = dArr(Dic.Item(Tem), J) + sArr(I, J)
        Next J
    End If
Next I
With Sheets("Process")
    .[A2:H10000].ClearContents
    If K Then .[A2].Resize(K, 8).Value = dArr 'cai dong nay a
End With
Set Dic = Nothing
End Sub

Bữa trước em có nhờ bác Ba Tê giúp dùm đoạn code trên (link: http://www.giaiphapexcel.com/forum/...-các-giá-trị-trùng-nhau-trong-bảng&highlight=). Em đã có thể áp dụng vào công việc của mình, nhưng vẫn còn thắc mắc ở cái dòng
PHP:
If K Then .[A2].Resize(K, 8).Value = dArr
tại sao (và vì sao) lại viết là If K then mà không viết luôn
PHP:
.[A2].Resize(K, 8).Value = dArr
và ý nghĩa của việc viết If K Then là gì ạ? Mong các bác giải thích dùm với!
 
PHP:
Public Sub GPE()
Dim Dic As Object, sArr(), dArr(), I As Long, J As Long, K As Long, Tem As Variant
Set Dic = CreateObject("Scripting.Dictionary")
With Sheets("Sheet1")
    sArr = .Range(.[A2], .[A1048576].End(xlUp)).Resize(, 8).Value
End With
ReDim dArr(1 To UBound(sArr, 1), 1 To 8)
For I = 1 To UBound(sArr, 1)
    Tem = sArr(I, 1)
    If Not Dic.Exists(Tem) Then
        K = K + 1
        Dic.Add Tem, K
        For J = 1 To 8
            dArr(K, J) = sArr(I, J)
        Next J
    Else
        For J = 3 To 8
            dArr(Dic.Item(Tem), J) = dArr(Dic.Item(Tem), J) + sArr(I, J)
        Next J
    End If
Next I
With Sheets("Process")
    .[A2:H10000].ClearContents
    If K Then .[A2].Resize(K, 8).Value = dArr 'cai dong nay a
End With
Set Dic = Nothing
End Sub

Bữa trước em có nhờ bác Ba Tê giúp dùm đoạn code trên (link: http://www.giaiphapexcel.com/forum/...-các-giá-trị-trùng-nhau-trong-bảng&highlight=). Em đã có thể áp dụng vào công việc của mình, nhưng vẫn còn thắc mắc ở cái dòng
PHP:
If K Then .[A2].Resize(K, 8).Value = dArr
tại sao (và vì sao) lại viết là If K then mà không viết luôn
PHP:
.[A2].Resize(K, 8).Value = dArr
và ý nghĩa của việc viết If K Then là gì ạ? Mong các bác giải thích dùm với!
Nếu K = 0 bạn thử kiểm tra xem câu lệnh :
PHP:
.[A2].Resize(0, 8).Value = dArr
có báo lỗi không !
 
Lần chỉnh sửa cuối:
Upvote 0
Mạn phép bác BaTê về đoạn Code này để hiểu rõ hơn:
Đây là 1 cách viết không rõ ràng, dễ gây ra sai sót do sai dạng biến. Bạn thấy rõ là:

Mã:
[COLOR=#000000][COLOR=#0000BB]Dim Dic [/COLOR][COLOR=#007700]As [/COLOR][COLOR=#0000BB]Object[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000BB]sArr[/COLOR][COLOR=#007700](), [/COLOR][COLOR=#0000BB]dArr[/COLOR][COLOR=#007700](), [/COLOR][COLOR=#0000BB]I [/COLOR][COLOR=#007700]As [/COLOR][COLOR=#0000BB]Long[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000BB]J [/COLOR][COLOR=#007700]As [/COLOR][COLOR=#0000BB]Long[/COLOR][COLOR=#007700], [/COLOR][/COLOR][B][COLOR=#ff0000]K As Long[/COLOR][/B][COLOR=#000000][COLOR=#007700], [/COLOR][COLOR=#0000BB]Tem [/COLOR][COLOR=#007700]As [/COLOR][COLOR=#0000BB]Variant[/COLOR][/COLOR]

Theo như khai báo thì K là 1 biến dạng Long.

Trong mệnh đề:

If xxxxxxxxxxx then yyyyyyyyyyyy

thì xxxxxxxxxx luôn là điều kiện Logic (True/False hoặc -1/0)

Chính vì cái hoặc nói trên mà câu lệnh bạn hỏi mới chạy được (K=0 có nghĩa là False, ngược lại là True)
Câu lệnh đó viết đầy đủ sẽ là:

If K<>0 then .....................
Với điều kiện của đoạn Code này thì có thể viết
If K>0 then ......................

Tóm lại, đoạn này có thể nói là không đúng về cú pháp.

Đoạn Code If ...... then......... này buộc phải có vì nếu viết thẳng như bạn thì khi K=0 sẽ lỗi ở đoạn màu đỏ


Mã:
[COLOR=#FF0000][FONT=monospace][COLOR=#000000][COLOR=#007700].[[/COLOR][COLOR=#0000BB]A2[/COLOR][COLOR=#007700]].[/COLOR][/COLOR][/FONT][/COLOR][B][COLOR=#ff0000][FONT=monospace]Resize(K, 8)[/FONT][/COLOR][/B][COLOR=#FF0000][FONT=monospace][COLOR=#000000][COLOR=#007700].[/COLOR][COLOR=#0000BB]Value [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000BB]dArr  [/COLOR][/COLOR][/FONT][/COLOR]
 
Lần chỉnh sửa cuối:
Upvote 0
Thật ra tại vì thói quen kiểm tra của anh Ba Tê thôi, bài này dùng If k then thì có lẻ không cần vì k chắc chắn > 0
 
Upvote 0
Mệnh đề IF chỉ chấp nhận một biểu thức có trị kiểu Boolean.
VBA là loại ngôn ngữ dễ dãi về kiểu, cho nên khi cần nó sẵn sàng ép kiểu. Nếu bạn đưa một biểu thưc có kiểu Integer (hoặc Long) cho IF, nó sẽ ép kiểu thành Boolean để gải quyết.

Luật ép từ Integer sang Boolean:
0 --> False
bất cứ trị gì không phải 0 --> True

Luật ép từ Boolean sang Integer:
False --> 0
True --> -1

Thử chạy hàm này sẽ rõ:

Sub t()
k = 1
b = CBool(k)
MsgBox b ' cho ra True
k = CInt(b)
MsgBox k ' cho ra -1
k = 10 + b ' b bị tự động ép kiểu ra integer để thực hiện phép cộng
MsgBox k ' cho ra 9
End Sub

Điều này bạn cần phải biết rõ bởi vì nếu có AND hoặc OR thì VBA sẽ sử dụng phép tính AND/OR cho số nguyên trước khi ép kiểu biểu thức trờ về Boolean, và các kết quả có thể ra bất ngờ.
 
Lần chỉnh sửa cuối:
Upvote 0
Hì, lại "võ đoán" rồi. Rất nhiều khi test code không lường trường hợp file mới chưa có dữ liệu.
Không phải đâu anh, vì em nhìn kỹ rồi. Nếu phải xét dk trước khi lọc lấy dữ liệu thì mới có chuyện đôi lúc k =0, trường hợp bài này không có xét dk gì cả nên k nhất định luôn > 0
 
Upvote 0
Mạn phép bác BaTê về đoạn Code này để hiểu rõ hơn:
Đây là 1 cách viết không rõ ràng, dễ gây ra sai sót do sai dạng biến.

Giờ thì em hiểu rồi, quả thực trước đây khi khai báo 1 biến K As Long em thường hay viết (ví dụ) If K<>0 Then hoặc If K>0 Then hoặc ... chứ không viết If K Then để hiểu rằng Nếu K>0 (hoặc <>0) thì... Giờ mới biết vụ này, một lần nữa cảm ơn các anh chị nhiều nhiều!

Vậy nếu em làm như sau:
PHP:
Dim chuoi As String
.....
If chuoi then <do smt>
và hiểu rằng, Nếu chuoi <>"" thì .... Liệu hiểu như vậy có đúng không ạ?
 
Upvote 0
Vẫn không đúng, trừ khi biến đó dạng Boolean thì có thể viết vậy.
Nếu dạng chuỗi như bạn phải viết If chuoi<>"" then ..... hoặc If len(chuoi)>0 then...........
 
Upvote 0
Vẫn không đúng, trừ khi biến đó dạng Boolean thì có thể viết vậy.
Nếu dạng chuỗi như bạn phải viết If chuoi<>"" then ..... hoặc If len(chuoi)>0 then...........

Cứ theo nguyên lý ép kiểu thì VBA sẽ Val(string) trước khi ép nó snag Boolean. Vì vậy:
b = "1" (hoặc b = "0") thì
IF b Then ... sẽ miễn cưỡng được
Nhưng
b = "b" thì
IF b Then ... sẽ Error
 
Upvote 0
Không phải đâu anh, vì em nhìn kỹ rồi. Nếu phải xét dk trước khi lọc lấy dữ liệu thì mới có chuyện đôi lúc k =0, trường hợp bài này không có xét dk gì cả nên k nhất định luôn > 0

Cách giải thích của Quang Hai không thỏa đáng. Chỉ cần xem xét đoạn sau:

Mã:
[COLOR=#000000][COLOR=#0000BB]With Sheets[/COLOR][COLOR=#007700]([/COLOR][COLOR=#DD0000]"Sheet1"[/COLOR][COLOR=#007700])
    [/COLOR][COLOR=#0000BB]sArr [/COLOR][COLOR=#007700]= .[/COLOR][COLOR=#0000BB]Range[/COLOR][COLOR=#007700](.[[/COLOR][COLOR=#0000BB]A2[/COLOR][COLOR=#007700]], .[[/COLOR][COLOR=#0000BB]A1048576[/COLOR][COLOR=#007700]].[/COLOR][COLOR=#0000BB]End[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000BB]xlUp[/COLOR][COLOR=#007700])).[/COLOR][COLOR=#0000BB]Resize[/COLOR][COLOR=#007700](, [/COLOR][COLOR=#0000BB]8[/COLOR][COLOR=#007700]).[/COLOR][COLOR=#0000BB]Value
End With[/COLOR][/COLOR]

Giả sử file được xóa hết dữ liệu cũ để nhập mới dữ liệu. Lúc này, cái sArr sẽ lấy cái tiêu đề cột đấy. Thực ra, GPE viết code đôi khi chưa hoàn toàn xét hết các trường hợp. Nếu Code đoạn trên viết như sau thì mình hoàn toàn đồng ý với Hải:

Mã:
[COLOR=#000000][COLOR=#0000BB]With Sheets[/COLOR][COLOR=#007700]([/COLOR][COLOR=#DD0000]"Sheet1"[/COLOR][COLOR=#007700])
    If [COLOR=#000000][COLOR=#007700].[[/COLOR][COLOR=#0000BB]A1048576[/COLOR][COLOR=#007700]].[/COLOR][COLOR=#0000BB]End[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000BB]xlUp[/COLOR][COLOR=#007700]).Row < 2 then Exit Sub[/COLOR][/COLOR]
    [/COLOR][COLOR=#0000BB]sArr [/COLOR][COLOR=#007700]= .[/COLOR][COLOR=#0000BB]Range[/COLOR][COLOR=#007700](.[[/COLOR][COLOR=#0000BB]A2[/COLOR][COLOR=#007700]], .[[/COLOR][COLOR=#0000BB]A1048576[/COLOR][COLOR=#007700]].[/COLOR][COLOR=#0000BB]End[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000BB]xlUp[/COLOR][COLOR=#007700])).[/COLOR][COLOR=#0000BB]Resize[/COLOR][COLOR=#007700](, [/COLOR][COLOR=#0000BB]8[/COLOR][COLOR=#007700]).[/COLOR][COLOR=#0000BB]Value
End With[/COLOR][/COLOR]
 
Upvote 0
Thật ra tại vì thói quen kiểm tra của anh Ba Tê thôi, bài này dùng If k then thì có lẻ không cần vì k chắc chắn > 0
code của Anh Ba Tê em đọc khá nhiều .cũng thấy vậy hay có dòng if k then . hôm nay đọc mấy bài này lại biết thêm một ít nữa về if
thanks anh nhiều
 
Lần chỉnh sửa cuối:
Upvote 0
Cách giải thích của Quang Hai không thỏa đáng. Chỉ cần xem xét đoạn sau:

Mã:
[COLOR=#000000][COLOR=#0000BB]With Sheets[/COLOR][COLOR=#007700]([/COLOR][COLOR=#DD0000]"Sheet1"[/COLOR][COLOR=#007700])
    [/COLOR][COLOR=#0000BB]sArr [/COLOR][COLOR=#007700]= .[/COLOR][COLOR=#0000BB]Range[/COLOR][COLOR=#007700](.[[/COLOR][COLOR=#0000BB]A2[/COLOR][COLOR=#007700]], .[[/COLOR][COLOR=#0000BB]A1048576[/COLOR][COLOR=#007700]].[/COLOR][COLOR=#0000BB]End[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000BB]xlUp[/COLOR][COLOR=#007700])).[/COLOR][COLOR=#0000BB]Resize[/COLOR][COLOR=#007700](, [/COLOR][COLOR=#0000BB]8[/COLOR][COLOR=#007700]).[/COLOR][COLOR=#0000BB]Value
End With[/COLOR][/COLOR]

Giả sử file được xóa hết dữ liệu cũ để nhập mới dữ liệu. Lúc này, cái sArr sẽ lấy cái tiêu đề cột đấy.

Nếu vậy thì K cũng được ít nhất là 1 mà anh, đâu có trụi lủi đâu. Khà khà
 
Upvote 0

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

Back
Top Bottom