Hỏi về Hàm If Then Else có điều kiện là Hàm Left trong VBA

Thảo luận trong 'Lập Trình với Excel' bắt đầu bởi anhtotbung35, 12 Tháng sáu 2010.

  1. anhtotbung35

    anhtotbung35 New Member

    Tại ô C7 (tương ứng với dòng 7, cột 3) của Sheet A có giá trị thay đổi:

    Ô C7 giá trị sẽ thay đổi hoặc C7 = 131 hoặc C7 = 331
    Mình viết code trong VBA cho Kết quả hiện ở ô J9 như sau:

    If Left(R7C3,1) = 1 Then
    Range("A!J9") = 1
    Else
    Range("A!J9") = 3
    End If

    Cho mình hỏi, mình lần lượt thay đổi ô C7 là 131 hoặc 331 nhưng kết quả tại ô J9 đều cho 1 giá trị là 3. Vậy mình viết code này sai chỗ nào và sửa như thế nào?
     
  2. Hai Lúa Miền Tây

    Hai Lúa Miền Tây Well-Known Member

    Thử test code sau nhé
    Ví dụ nằm trên sheet A
    Mã:
    Sub Test()
    With Sheets("a")
    If Left(.Range("C7"), 1) = 1 Then
         .Range("J9") = 1
       Else
         .Range("J9") = 3
    End If
    End With
    
    End Sub
     
  3. anhtotbung35

    anhtotbung35 New Member

    Mình đã Test trên File rồi. Kết quả cho đúng như ý, nhưng mình nhờ bạn hướng dẫn thêm đoạn này nhé.
    PHP:
    With Sheets("THCN")
    If 
    Left(.Range("C7"), 1) = 1 Then
    .Range("J11") = -10                        ' ô J11 là một công thức cho ra giá trị có âm hoặc dương
      If Range("J11").Value > 0 Then
        Range("D11").Value = Range("J11").Value
      Else
        Range("E11").Value = -Range("J11").Value
      End If
    Else
    ...
    End With
    Đoạn code này mình đã rút ngắn bớt. Mục đích của mình là: tại ô J11 là một công thức Sumproduct tính các số liệu, số này có thể âm hoặc dương. Nếu ô J11 là số dương thì gán số đó vào ô D11, nếu là số âm thì gán vào ô E11 (lúc này ô E11 thể hiện là số dương của ô J11), sau đó xóa giá trị tại ô J11. Nếu code có thể rút ngắn đuợc xin bạn chỉ giáo.
     
    Last edited by a moderator: 12 Tháng sáu 2010
  4. Hai Lúa Miền Tây

    Hai Lúa Miền Tây Well-Known Member

    Thử code sau:

    Mã:
    Sub Test()
    With Sheets("THCN")
        If Left(.Range("C7"), 1) = 1 Then .Range("J11") = -10
            Select Case .Range("J11").Value
              Case Is >= 0
                 .Range("D11") = .Range("J11")
              Case Else
                 .Range("E11") = (.Range("J11")) * -1
            End Select
            .Range("J11").ClearContents
    End With
    
    End Sub
    
     
  5. sealand

    sealand Well-Known Member

    Mình thấy có cái gì đó không được, ô J11 là công thức vậy khi gán giá trị thì bỏ công thức sao?
    Nếu đúng vậy Code chỉ có thế này chứ

    Mã:
    1 With Sheets("THCN")
    2 If Left(.Range("C7"), 1) = 1 Then
    3 .Range("J11") = -10 'ô J11 la? mô?t công thu+?c cho ra gia? tri? co? âm hoa(?c du+o+ng
    4 .Range("D11").Value = .Range("J11").Value
    5 Else
    6 '...
    7 End If
    8 End With
    Toàn bộ Code nằm sau câu lệnh 2 và trước câu lệnh 5 thì đương nhiên chỉ có J11=-10 chứ còn làm gì có trường hợp khác

    Lưu ý bạn sau lệnh With bạn phải có dấu chấm dẫn chiếu nếu không dễ lỗi lắm vì không xác định được o đó là của Sheet nào. (Nếu là code của Sheet thì khỏi cần With khi tham chiếu đến vùng của Sheet đó). Lỗi này có trong khá nhiều bài viết của bạn.
     
    Last edited: 12 Tháng sáu 2010
  6. Nguyễn Duy Tuân

    Nguyễn Duy Tuân Nghị Hách

    Code của bạn nhìn qua tưởng là đúng nhưng sai một điểm nghiêm trọng đó là kiểu giá trị.
    Kết quả của hàm LEFT, RIGHT, TRIM,....là một văn bản. Trong biểu thức tính toán, giá trị văn bản (hằng số) phải đặt trong nháy kép ("").

    Code của bạn cần sửa lại như sau:
    Mã:
    If Left(R7C3,1) = "1" Then [COLOR="SeaGreen"]'So sánh 2 giá trị văn bản[/COLOR]
      Range("A!J9") = 1
    Else
      Range("A!J9") = 3
    End If
    Hoặc
    Mã:
    If CLng(Left(R7C3,1)) = 1 Then [COLOR="SeaGreen"]'So sánh 2 số kiểu Long[/COLOR]
      Range("A!J9") = 1
    Else
      Range("A!J9") = 3
    End If
     
  7. ndu96081631

    ndu96081631 Well-Known Member

    Tuy là sai về kiểu giá trị khi so sánh nhưng Excel nó vẫn hiểu đấy Tuân à! Dù vậy, ta vẫn nên hiểu mà mô ta thật chính xác khi viết code (như TuanVNUNI đã sửa ở trên)
     
  8. Nguyễn Duy Tuân

    Nguyễn Duy Tuân Nghị Hách

    Test lại đúng là trong VBA nó tự convert về kiểu phù hợp. Nếu công thức đặt trong bảng tính như dưới đây sẽ là sai kết quả
    =IF(LEFT(C7,1)=1,1,3)

    Công thức sau sẽ là đúng (vì xác định đúng kiểu giá trị)
    =IF(LEFT(C7,1)="1",1,3)
     
  9. ndu96081631

    ndu96081631 Well-Known Member

    Ví dụ:
    - Tại cell A1 ta gõ số 123
    - Tại cell B1 ta gõ số 1
    Code này cho kết quả = TRUE
    PHP:
    Sub Test()
      
    MsgBox Left([A1], 1) = 1
    End Sub
    Nhưng code này thì cho kết quả = FALSE
    PHP:
    Sub Test()
      
    MsgBox Left([A1], 1) = [B1]
    End Sub
    Tương tự thế với các trường hợp sô sánh giá trị dạng số trong 1 TextBox với giá trị của 1 cell

     
  10. anhtotbung35

    anhtotbung35 New Member

    Cảm ơn bạn đã Lưu ý dùm mình, mình đưa lên diễn đàn để cho gọn mình gán luôn giá trị ô J11 là -10, chứ code đầy đủ như sau:

    PHP:
    With Sheets("THCN")
        If 
    Left(.Range("C7"), 1) = 1 Then
           
    .Range("THCN!J11:J" 9).FormulaR1C1 _
            
    "=SUMPRODUCT(--(Data!R3C4:R" "C4<R6C3),--(Data!R3C6:R" "C6=R7C3),--(Data!R3C17:R" "C17=RC2),--(Data!R3C8:R" "C8))-SUMPRODUCT(--(Data!R3C4:R" "C4<R6C3),--(Data!R3C7:R" "C7=R7C3),--(Data!R3C18:R" "C18=RC2),--(Data!R3C8:R" "C8))"
            
    Select Case .Range("THCN!J11:J" 9)
              Case 
    Is >= 0
               
    .Range("THCN!D11:D" 9).Value = .Range("THCN!J11:J" 9).Value
              
    Case Else
               .
    Range("THCN!E11:E" 9).Value = (.Range("THCN!J11:J" 9).Value) * -1
            End Select
            
    .Range("THCN!J11:J" 9).ClearContents
        
    Else
            .
    Range("THCN!J11:J" 9).FormulaR1C1 _
            
    "=SUMPRODUCT(--(Data!R3C4:R" "C4<R6C3),--(Data!R3C7:R" "C7=R7C3),--(Data!R3C18:R" "C18=RC2),--(Data!R3C8:R" "C8))-SUMPRODUCT(--(Data!R3C4:R" "C4<R6C3),--(Data!R3C6:R" "C6=R7C3),--(Data!R3C17:R" "C17=RC2),--(Data!R3C8:R" "C8))"
            
    Select Case .Range("THCN!J11:J" 9)
               Case 
    Is >= 0
               
    .Range("THCN!E11:E" 9).Value = .Range("THCN!J11:J" 9).Value
               
    Case Else
               .
    Range("THCN!D11:D" 9).Value = (.Range("THCN!J11:J" 9).Value) * -1
            End Select
            
    .Range("THCN!J11:J" 9).ClearContents
        End 
    If
       
    End With
    Đoạn code này là mình điều chỉnh lại theo đoạn code của anh Domfootwear, như sao sau khi tính tại cột D vẫn là giá trị âm (nếu kết quả đúng thì số âm này phải ở cột E và giá trị âm. Nhờ mấy Anh xem gúp.
     
    Last edited by a moderator: 14 Tháng sáu 2010
  11. sealand

    sealand Well-Known Member

    Bạn đưa file lên đi chứ hiện giờ cái Select Case của bạn sai rồi, tại sao 1 vùng Multi_Cells lại>0 hay <0 được (Cái này chỉ được khi Range là 1 ô). Nó là kết quả của hàm tính toán nào đó chứ.
    Mặt khác, dùng select Case không hợp lý vì chỉ có 2 điều kiện thì If đã quá ổn rồi mà lại bớt đi 1 dòng lệnh. Mình thấy cột J của bạn giống như 1 vùng trung gian nên đã dùng Code thì có thể tính trực tiếp và khỏi cần dùng đến nó.
     
    Last edited: 14 Tháng sáu 2010
  12. anhtotbung35

    anhtotbung35 New Member

    Nhờ bạn xem giúp nhé. Dữ liệu ở Sheet THCN.
     

    Các file đính kèm:

  13. nguyenmanhnam

    nguyenmanhnam New Member

    Xin thêm một số bài tập đơn giản về If.. then và Next.. For

    Xin các thày cho em một số bài tập đơn giản về If... then, có thể kết hợp thêm về next...for để em có thể thực hành. Hôm trước em có tải một số bài tập Next.. For trên diễn đàn tại địa chỉ http://www.giaiphapexcel.com/forum/showthread.php?39326-Bài-tập-về-vòng-lặp . Tuy vậy, những bài này do mới học nên em cũng chưa làm được nhiều.
     
  14. nhtri0907

    nhtri0907 New Member

    Các anh chị ơi em muốn viết 1 hàm phân loại hàng hóa nhưng cần nhiều hàm if lồng vào nhau (dùng excel chỉ được 7 vòng và phai dùng nhiều dễ bi nhầm lẫn) nhưng em không biết dùng cấu trúc gì vì dùng if then thì không bị báo lỗi có cách gì các anh chị chỉ giúp em với. VBA em gần như chưa biết gi hì hì:
    Nhu cầu em phân loại như sau:


    Function phanloai(hanghoa As String) As String

    If hanghoa = "TM dk 1" Then
    If hanghoa = "TM dk 1.1" Then
    If hanghoa = "TM dk 1.1.1" Then
    If hanghoa = "TM dk 1.1.1.1" Then phan loai = "1.1.1.1"

    If hanghoa = "TM dk 1.1.2" Then phan loai = "1.1.2"

    If hanghoa = "TM dk 1.2" Then phan loai = "1.2"
    If hanghoa = "TM dk 2" Then phan loai = "2"


    If hanghoa = "TM dk 3" Then
    If hanghoa = "TM dk 3.1" Then
    If hanghoa = "TM dk 3.1.1" Then
    If hanghoa = "TM dk 3.1.1.1" Then phan loai = "3.1.1.1"

    If hanghoa = "TM dk 3.1.2" Then phan loai = "3.1.2"

    If hanghoa = "TM dk 3.2" Then phan loai = "3.2"


    End If
    End Function



    Em xin chân thành cám ơn
     
  15. Hai Lúa Miền Tây

    Hai Lúa Miền Tây Well-Known Member

    Bạn dùng select case thử nhé.
     
  16. nhtri0907

    nhtri0907 New Member

    Em xin cám ơn để em thử xem vì em chưa dùng cấu trúc này
     
  17. HieuCD

    HieuCD Well-Known Member

    nếu lệnh if như vậy thì có thể bỏ bớt if
    Mã:
    Function phanloai(hanghoa As String) As String
    
      If hanghoa = "TM dk 1.1.1.1" Then phan loai = "1.1.1.1"
       If hanghoa = "TM dk 1.1.2" Then phan loai = "1.1.2"
       If hanghoa = "TM dk 1.2" Then phan loai = "1.2"
       If hanghoa = "TM dk 2" Then phan loai = "2"
    
      If hanghoa = "TM dk 3.1.1.1" Then phan loai = "3.1.1.1"
       If hanghoa = "TM dk 3.1.2" Then phan loai = "3.1.2"
       
       If hanghoa = "TM dk 3.2" Then phan loai = "3.2"
    
    End Function
    
    bạn có thể dùng Case, hoặc nếu code trên chạy đúng thì bạn dùng hàm
    Mã:
    If ....... Then phan loai =Right(hanghoa, Len(hanghoa) - InStr(2, hanghoa, " "))
    
     
    Last edited: 19 Tháng tám 2016
  18. nhtri0907

    nhtri0907 New Member

    em loay hoay mãi nhưng không được do điều kiện của em là hanghoa có chứa chuỗi con biết trước nên sử dụng hàm case không được
     
  19. nhtri0907

    nhtri0907 New Member

    Mục tiêu của em lập hàm trong BVA thay thế cho công thức cột E nhưng không bít làm (và muốn mỏ rong nhiều nhánh điều kiện nua nhung khong lam duoc). xin đuoc mọi nguòi dạy bảo
     
  20. nhtri0907

    nhtri0907 New Member

    Mục tiêu của em lập hàm trong BVA thay thế cho công thức cột E nhưng không bít làm (và muốn mỏ rong nhiều nhánh điều kiện nua nhung khong lam duoc). xin đuoc mọi nguòi dạy bảo
     

    Các file đính kèm:

    • Book3.xls
      Kích thước:
      17.5 KB
      Đọc:
      4
    Last edited: 19 Tháng tám 2016

Chia sẻ trang này