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

Liên hệ QC

anhtotbung35

Thành viên hoạt động
Tham gia
16/2/09
Bài viết
149
Được thích
26
Nghề nghiệp
Kế toán
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?
 
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?

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
 
Upvote 0
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.
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
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é.

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.

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
 
Upvote 0
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.
 
Lần chỉnh sửa cuối:
Upvote 0
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?

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
 
Upvote 0
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 ("").
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)
 
Upvote 0
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)

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)
 
Upvote 0
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)
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

 
Upvote 0
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?

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.
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" & i + 9).FormulaR1C1 = _
        "=SUMPRODUCT(--(Data!R3C4:R" & r & "C4<R6C3),--(Data!R3C6:R" & r & "C6=R7C3),--(Data!R3C17:R" & r & "C17=RC2),--(Data!R3C8:R" & r & "C8))-SUMPRODUCT(--(Data!R3C4:R" & j & "C4<R6C3),--(Data!R3C7:R" & j & "C7=R7C3),--(Data!R3C18:R" & j & "C18=RC2),--(Data!R3C8:R" & j & "C8))"
        Select Case .Range("THCN!J11:J" & i + 9)
          Case Is >= 0
           .Range("THCN!D11:D" & i + 9).Value = .Range("THCN!J11:J" & i + 9).Value
          Case Else
           .Range("THCN!E11:E" & i + 9).Value = (.Range("THCN!J11:J" & i + 9).Value) * -1
        End Select
        .Range("THCN!J11:J" & i + 9).ClearContents
    Else
        .Range("THCN!J11:J" & i + 9).FormulaR1C1 = _
        "=SUMPRODUCT(--(Data!R3C4:R" & j & "C4<R6C3),--(Data!R3C7:R" & j & "C7=R7C3),--(Data!R3C18:R" & j & "C18=RC2),--(Data!R3C8:R" & j & "C8))-SUMPRODUCT(--(Data!R3C4:R" & r & "C4<R6C3),--(Data!R3C6:R" & r & "C6=R7C3),--(Data!R3C17:R" & r & "C17=RC2),--(Data!R3C8:R" & r & "C8))"
        Select Case .Range("THCN!J11:J" & i + 9)
           Case Is >= 0
           .Range("THCN!E11:E" & i + 9).Value = .Range("THCN!J11:J" & i + 9).Value
           Case Else
           .Range("THCN!D11:D" & i + 9).Value = (.Range("THCN!J11:J" & i + 9).Value) * -1
        End Select
        .Range("THCN!J11:J" & i + 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.
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
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ó.
 
Lần chỉnh sửa cuối:
Upvote 0
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

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

File đính kèm

  • Ketoan (V.5).rar
    60 KB · Đọc: 53
Upvote 0
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.
 
Upvote 0
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
 
Upvote 0
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
Bạn dùng select case thử nhé.
 
Upvote 0
Em xin cám ơn để em thử xem vì em chưa dùng cấu trúc này
 
Upvote 0
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, " "))
 
Lần chỉnh sửa cuối:
Upvote 0
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
 
Upvote 0
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
 
Upvote 0
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
 

File đính kèm

  • Book3.xls
    17.5 KB · Đọc: 10
Lần chỉnh sửa cuối:
Upvote 0
Web KT
Back
Top Bottom