Thảo luận về IF, AND, OR... trong lập trình VBA (2 người xem)

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

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

VetMini

Ăn cùng góc phố
Tham gia
21/12/12
Bài viết
17,745
Được thích
24,589
Bạn mô tả kiểu võ lâm thì mình làm theo kiểu thiếu lâm tự nhé, còn thiếu xíu nữa là hoàn chỉnh bạn tự bổ sung nhé. Khi nào siêng thì rút gọn code lại tí

Đúng ra Sub này nên tách ra làm 2 sub. Nếu H7 <> "" thì chạy 1 Sub và ngược lại
PHP:
Sub loc()
Dim Data(), Res(), i, j, k
[A13:H5000].ClearContents
Data = Sheet1.Range(Sheet1.[AB9], Sheet1.[AB65536].End(3)).Resize(, 10).Value
ReDim Res(1 To UBound(Data), 1 To 8)
For i = 1 To UBound(Data)
   If Data(i, 1) >= [D5].Value Then
      If Data(i, 1) <= [D6].Value Then
         If [H7].Value = "" Then
            If Data(i, 9) = [H6].Value Or Data(i, 8) = [H6].Value Then
               k = k + 1
               Res(k, 1) = Data(i, 1)
               Res(k, 2) = Data(i, 2)
               Res(k, 3) = Data(i, 3)
               Res(k, 4) = Data(i, 5)
               Res(k, 5) = Data(i, 7)
               If Data(i, 8) = [H6].Value Then Res(k, 6) = Data(i, 9)
               If Data(i, 9) = [H6].Value Then Res(k, 6) = Data(i, 8)
               If Data(i, 8) = [H6].Value Then Res(k, 7) = Data(i, 10)
               If Data(i, 9) = [H6].Value Then Res(k, 8) = Data(i, 10)
            End If
         Else
            If Data(i, 6) = [H7].Value Then
                If Data(i, 9) = [H6].Value Or Data(i, 8) = [H6].Value Then
                  k = k + 1
                  Res(k, 1) = Data(i, 1)
                  Res(k, 2) = Data(i, 2)
                  Res(k, 3) = Data(i, 3)
                  Res(k, 4) = Data(i, 5)
                  Res(k, 5) = Data(i, 7)
                  If Data(i, 8) = [H6].Value Then Res(k, 6) = Data(i, 9)
                  If Data(i, 9) = [H6].Value Then Res(k, 6) = Data(i, 8)
                  If Data(i, 8) = [H6].Value Then Res(k, 7) = Data(i, 10)
                  If Data(i, 9) = [H6].Value Then Res(k, 8) = Data(i, 10)
               End If
            End If
         End If
      End If
   End If
Next
k = k + 1
Res(k, 7) = "=sum(R13C:R[-1]C)"
Res(k, 8) = "=sum(R13C:R[-1]C)"
[A13].Resize(k, 8) = Res
End Sub

Không cần phải vậy. Các IF's trong bài này lồng trơn vào nhau - tức là không có lệnh khác. Như vậy ta có thể dùng AND. Phần code trong ELSE cũng in hệt như IF, nên có thể dùng OR

PHP:
   If Data(i, 1) >= [D5].Value AND Data(i, 1) <= [D6].Value _ ' trong giới hạn ngày '
         AND ([H7].Value = "" OR Data(i, 6) = [H7].Value) _ ' đúng mã KH '
            AND (Data(i, 9) = [H6].Value Or Data(i, 8) = [H6].Value) Then ' dúng mã tài khoản đối chiếu '
               k = k + 1
               Res(k, 1) = Data(i, 1)
               Res(k, 2) = Data(i, 2)
               Res(k, 3) = Data(i, 3)
               Res(k, 4) = Data(i, 5)
               Res(k, 5) = Data(i, 7)
               ' If Data(i, 8) = [H6].Value Then Res(k, 6) = Data(i, 9) '
               ' If Data(i, 9) = [H6].Value Then Res(k, 6) = Data(i, 8) '
               ' If Data(i, 8) = [H6].Value Then Res(k, 7) = Data(i, 10) '
               ' If Data(i, 9) = [H6].Value Then Res(k, 8) = Data(i, 10) '
               ' điều kiện đã thử rồi, [H6].Value bắt buộc phải = Data(i, 8 hoặc 9) '
               Res(k, 6) = Data(i, Iif(Data(i, 8) = [H6].Value, 9, 8))
               Res(k, Iif(Data(i, 8) = [H6].Value, 7, 8)) = Data(i, 10)
   End If
 
Lần chỉnh sửa cuối:
Em đã sửa nội dung cần hỏi trong cell nhờ các anh chị, các bạn trên diễn đàn giúp em code vba với
 
Upvote 0
Khó Khăn Về IF trong VBA

mình đang tập làm quen với VBA mà gặp khó khăn về IF trong VBA mò mẫn mãi mà vẫn chưa ra mong các Bạn GPE trợ giúp
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, [C3:C1000]) Is Nothing Then
' If Range("E2") < 1500000 Then Code1 'Nho Hon 1,5 Trieu
' If Range("E2") > 1500000 Or Range("E2") = 15000000 Then Code2 'Lon Hon 1,5 Trieu
' If Range("E2") > 15000000 Or Range("E2") = 30000000 Then Code3 'Lon Hon 15 Trieu
' If Range("E2") > 30000000 Then Code4 'Lon Hon 30 Trieu
'**********
If Range("E2") < 1500000 Then Code1
If Range("E2") > 1500000 Then Code2
If Range("E2") > 15000000 Then Code3
If Range("E2") > 30000000 Then Code4
End If
End Sub

code mình viết nếu điều kiện tại cell E2 thay đổi. nếu E2<=1500000 thì code1 chạy và tương tự như vậy nếu E2>1.500.000 thì code2 chạy...khó khăn ở chỗ nếu E2 tăng trên 30 triệu thì thì code2,code3 và code4 điều chạy hết
Mình mong muốn nếu E2 có giá trị từ 1500.000 =>15.000.000 thì code2 chạy và E2 >15.000.000 or =30.000.000 thì code3 chạy và code4 cũng như vậy .mà chưa làm được mong các bạn trợ giúp
xin cảm ơn
Kiều Mạnh
 

File đính kèm

Upvote 0
mình đang tập làm quen với VBA mà gặp khó khăn về IF trong VBA mò mẫn mãi mà vẫn chưa ra mong các Bạn GPE trợ giúp
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, [C3:C1000]) Is Nothing Then
' If Range("E2") < 1500000 Then Code1 'Nho Hon 1,5 Trieu
' If Range("E2") > 1500000 Or Range("E2") = 15000000 Then Code2 'Lon Hon 1,5 Trieu
' If Range("E2") > 15000000 Or Range("E2") = 30000000 Then Code3 'Lon Hon 15 Trieu
' If Range("E2") > 30000000 Then Code4 'Lon Hon 30 Trieu
'**********
If Range("E2") < 1500000 Then Code1
If Range("E2") > 1500000 Then Code2
If Range("E2") > 15000000 Then Code3
If Range("E2") > 30000000 Then Code4
End If
End Sub

code mình viết nếu điều kiện tại cell E2 thay đổi. nếu E2<=1500000 thì code1 chạy và tương tự như vậy nếu E2>1.500.000 thì code2 chạy...khó khăn ở chỗ nếu E2 tăng trên 30 triệu thì thì code2,code3 và code4 điều chạy hết
Mình mong muốn nếu E2 có giá trị từ 1500.000 =>15.000.000 thì code2 chạy và E2 >15.000.000 or =30.000.000 thì code3 chạy và code4 cũng như vậy .mà chưa làm được mong các bạn trợ giúp
xin cảm ơn
Kiều Mạnh
Mã:
dim x
x=range("E2").value/1500000
If x<1 then
code1
Elseif x<10 then
code2
Elseif x<20 then
code3
Else
code4
Endif
 
Upvote 0
code như vậy có rút gọn được không...
Sub Print_out()
Dim i As Integer, j As Integer
n = Range("AO4").Value
l = Range("AP4").Value
k = Range("AN4").Value

If n > 0 And l > 0 And k > 0 And l > n Then

For i = l To n Step -1
Range("AB4").Value = i
Range("Q4").Value = k
ActiveWindow.SelectedSheets.PrintOut 1, 1, 1, False, False

Next i
End If

n = Range("AO4").Offset(1, 0).Value
l = Range("AP4").Offset(1, 0).Value
k = Range("AN4").Offset(1, 0).Value

If n > 0 And l > 0 And k > 0 And l > n Then

For i = l To n Step -1
Range("AB4").Value = i
Range("Q4").Value = k
ActiveWindow.SelectedSheets.PrintOut 1, 1, 1, False, False
Next i
End If


End Sub
 

File đính kèm

Upvote 0
code như vậy có rút gọn được không...
Sub Print_out()
Dim i As Integer, j As Integer
n = Range("AO4").Value
l = Range("AP4").Value
k = Range("AN4").Value

If n > 0 And l > 0 And k > 0 And l > n Then

For i = l To n Step -1
Range("AB4").Value = i
Range("Q4").Value = k
ActiveWindow.SelectedSheets.PrintOut 1, 1, 1, False, False

Next i
End If

n = Range("AO4").Offset(1, 0).Value
l = Range("AP4").Offset(1, 0).Value
k = Range("AN4").Offset(1, 0).Value

If n > 0 And l > 0 And k > 0 And l > n Then

For i = l To n Step -1
Range("AB4").Value = i
Range("Q4").Value = k
ActiveWindow.SelectedSheets.PrintOut 1, 1, 1, False, False
Next i
End If


End Sub
Có thể sửa ngắn hơn chút nửa.
Mã:
Sub Print_out()
    Dim i As Integer, n As Integer, l As Integer, k As Integer
        n = Range("AO4").Value
        l = Range("AP4").Value
        k = Range("AN4").Value
     
    If Min(n, l, k) > 0 And l > n Then
   
        For i = l To n Step -1
            Range("AB4").Value = i
            Range("Q4").Value = k
            Sheet1.PrintOut 1, 1, 1, 0, 0
        Next i
     End If
     
        n = Range("AO5").Value
        l = Range("AP5").Value
        k = Range("AN5").Value
   
    If Min(n, l, k) > 0 And l > n Then
       
        For i = l To n Step -1
            Range("AB4").Value = i
            Range("Q4").Value = k
            Sheet1.PrintOut 1, 1, 1, 0, 0
        Next i
    End If
   
End Sub
Theo tôi thấy code của bạn có những chổ chưa hợp lý, còn chổ nào thì bạn tự tìm hiểu nhé.
 
Upvote 0
Có thể sửa ngắn hơn chút nửa.
Mã:
Sub Print_out()
    Dim i As Integer, n As Integer, l As Integer, k As Integer
        n = Range("AO4").Value
        l = Range("AP4").Value
        k = Range("AN4").Value
   
    If Min(n, l, k) > 0 And l > n Then
 
        For i = l To n Step -1
            Range("AB4").Value = i
            Range("Q4").Value = k
            Sheet1.PrintOut 1, 1, 1, 0, 0
        Next i
     End If
   
        n = Range("AO5").Value
        l = Range("AP5").Value
        k = Range("AN5").Value
 
    If Min(n, l, k) > 0 And l > n Then
     
        For i = l To n Step -1
            Range("AB4").Value = i
            Range("Q4").Value = k
            Sheet1.PrintOut 1, 1, 1, 0, 0
        Next i
    End If
 
End Sub
Theo tôi thấy code của bạn có những chổ chưa hợp lý, còn chổ nào thì bạn tự tìm hiểu nhé.
Có thể sửa ngắn hơn chút nửa.
Mã:
Sub Print_out()
    Dim i As Integer, n As Integer, l As Integer, k As Integer
        n = Range("AO4").Value
        l = Range("AP4").Value
        k = Range("AN4").Value
    
    If Min(n, l, k) > 0 And l > n Then
  
        For i = l To n Step -1
            Range("AB4").Value = i
            Range("Q4").Value = k
            Sheet1.PrintOut 1, 1, 1, 0, 0
        Next i
     End If
    
        n = Range("AO5").Value
        l = Range("AP5").Value
        k = Range("AN5").Value
  
    If Min(n, l, k) > 0 And l > n Then
      
        For i = l To n Step -1
            Range("AB4").Value = i
            Range("Q4").Value = k
            Sheet1.PrintOut 1, 1, 1, 0, 0
        Next i
    End If
  
End Sub
Theo tôi thấy code của bạn có những chổ chưa hợp lý, còn chổ nào thì bạn tự tìm hiểu nhé.
Mình cũng thấy có chổ chưa hợp lý nhưng tìm hoài chưa thông, trong trường hợp này mình chỉ lặp có 2 vòng cho 2 dòng dữ liệu, nếu lặp n vòng thì chẳng lẽ copy cả mớ code ^^.
 
Upvote 0
Mã:
Sub Print_out()
InCaiGiDo "AO4", "AP4", "AN4"
InCaiGiDo "AO5", "AP5", "AN5"
End Sub

Sub InCaiGiDo(ByVal vn As String, ByVal vl As String, ByVal vk As String)
Dim i As Integer, n As Integer, l As Integer, k As Integer
n = Range(vn).Value
l = Range(vl).Value
k = Range(vk).Value
If Min(n, l, k) > 0 And l > n Then
    For i = l To n Step -1
        Range("AB4").Value = i
        Range("Q4").Value = k
        Sheet1.PrintOut 1, 1, 1, 0, 0
    Next i
 End If
End Sub

Sub Print_out_CaDong() ' in cả đống
Dim i As Long
For i = 4 To 5 ' thay 5 bằng dòng cuối cùng
InCaiGiDo "AO" & i, "AP" & i, "AN" & i
Next i
End Sub

Tôi chỉ mách cho cách thu gọn thôi. Còn những chỗ hợp lý hay phi lý tôi không màng tới. Code mà không có chú thích thì tự nó đã rối rắm rồi.
 
Upvote 0
Mã:
Sub Print_out()
InCaiGiDo "AO4", "AP4", "AN4"
InCaiGiDo "AO5", "AP5", "AN5"
End Sub

Sub InCaiGiDo(ByVal vn As String, ByVal vl As String, ByVal vk As String)
'khai báo biến chổ này mình không hiểu
Dim i As Integer, n As Integer, l As Integer, k As Integer
n = Range(vn).Value
l = Range(vl).Value
k = Range(vk).Value
If Min(n, l, k) > 0 And l > n Then
' đoạn này bị báo lỗi " Sub or Funtion not defined"
    For i = l To n Step -1
        Range("AB4").Value = i
'in từ trang n đến trang l
        Range("Q4").Value = k
'giá trị trong ô "Q4=AN4" không đổi khi i thay đổi từ n đến l
        Sheet1.PrintOut 1, 1, 1, 0,
'khi in xong từ n đến l ô "Q4=AN5" không đổi, i thay đổi theo n đến l tức là dòng kế tiếp "AO5" "AP5"
    Next i
End If
End Sub

Sub Print_out_CaDong() ' in cả đống
Dim i As Long
For i = 4 To 5 ' thay 5 bằng dòng cuối cùng
InCaiGiDo "AO" & i, "AP" & i, "AN" & i
Next i
End Sub

Tôi chỉ mách cho cách thu gọn thôi. Còn những chỗ hợp lý hay phi lý tôi không màng tới. Code mà không có chú thích thì tự nó đã rối rắm rồi.
Có thể sửa ngắn hơn chút nửa.
Mã:
Sub Print_out()
    Dim i As Integer, n As Integer, l As Integer, k As Integer
        n = Range("AO4").Value
        l = Range("AP4").Value
        k = Range("AN4").Value
  
    If Min(n, l, k) > 0 And l > n Then

        For i = l To n Step -1
            Range("AB4").Value = i
            Range("Q4").Value = k
            Sheet1.PrintOut 1, 1, 1, 0, 0
        Next i
     End If
  
        n = Range("AO5").Value
        l = Range("AP5").Value
        k = Range("AN5").Value

    If Min(n, l, k) > 0 And l > n Then

    
        For i = l To n Step -1
            Range("AB4").Value = i
            Range("Q4").Value = k
            Sheet1.PrintOut 1, 1, 1, 0, 0
        Next i
    End If

End Sub
Theo tôi thấy code của bạn có những chổ chưa hợp lý, còn chổ nào thì bạn tự tìm hiểu nhé.
cám ơn bạn đã góp ý, nhưng mà đoạn code này mình có vài chổ chưa hiểu bạn giúp mình nhé
Sub Print_out()
InCaiGiDo "AO4", "AP4", "AN4"
InCaiGiDo "AO5", "AP5", "AN5"
End Sub

Sub InCaiGiDo(ByVal vn As String, ByVal vl As String, ByVal vk As String)
'khai báo biến chổ này mình không hiểu
Dim i As Integer, n As Integer, l As Integer, k As Integer
n = Range(vn).Value
l = Range(vl).Value
k = Range(vk).Value
If Min(n, l, k) > 0 And l > n Then
' đoạn này bị báo lỗi " Sub or Funtion not defined"
For i = l To n Step -1
Range("AB4").Value = i
'in từ trang n đến trang l
Range("Q4").Value = k
'giá trị trong ô "Q4=AN4" không đổi khi i thay đổi từ n đến l
Sheet1.PrintOut 1, 1, 1, 0,
'khi in xong từ n đến l ô "Q4=AN5" không đổi, i thay đổi theo n đến l tức là dòng kế tiếp "AO5" "AP5"
Next i
End If
End Sub

Sub Print_out_CaDong() ' in cả đống
Dim i As Long
For i = 4 To 5 ' thay 5 bằng dòng cuối cùng
InCaiGiDo "AO" & i, "AP" & i, "AN" & i
Next i
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
cám ơn bạn đã góp ý, nhưng mà đoạn code này mình có vài chổ chưa hiểu bạn giúp mình nhé
Tôi chỉ thâu ngắn nó lại chứ nào có hiểu code nó làm cái gì đâu mà giải thích.
Code của bạn từ đầu không giải thích thì bảo người khác giải thích giùm à?
 
Upvote 0
Tôi chỉ thâu ngắn nó lại chứ nào có hiểu code nó làm cái gì đâu mà giải thích.
Code của bạn từ đầu không giải thích thì bảo người khác giải thích giùm à?
Diễn đàn toàn pro không, mình thấy đoạn code bé tẹo này chắc các bạn có thể giúp mình ý mà, nhưng mà trong đoạn trên mình có giải thích lại rồi mà bạn
 
Upvote 0
Định mệnh...mấy thánh giỏi quá, em làm dc rồi, thanks bác VetMini nhé
 
Upvote 0
Web KT

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

Back
Top Bottom