câu lệnh if ....then....elseif....else trong vba

Liên hệ QC
Tôi tuân thủ nội quy khi đăng bài

Dũng Tống

Thành viên mới
Tham gia
24/8/23
Bài viết
8
Được thích
0
Em muốn in 1 lúc 2 sheet, 1sheet in cố định, sheet còn lại in phụ thuộc theo điều kiện của 1 ô trong sheet in cố định. Em viêt code nhưng không biết sai ở đâu, mong các cao nhân chỉ giúp em ạ
Sub inbbnt()

Dim Wya As Worksheet, Wyb As Worksheet, Wyc As Worksheet, Wyd As Worksheet, Wye As Worksheet, Wyf As Worksheet, Wyg As Worksheet, Wyh As Worksheet, Wyi As Worksheet, i As Long
Set Wya = Sheet2
Set Wyb = Sheet1
Set Wyc = Sheet5
Set Wyd = Sheet7
Set Wye = Sheet10
Set Wyf = Sheet11
Set Wyg = Sheet12
Set Wyh = Sheet18
Set Wyi = Sheet19
Sheet2.Select
If Range("Q9").Value = 1 Then Wyb.PrintOut
ElseIf Range("Q9").Value = 2 Then Wyc.PrintOut
ElseIf Range("Q9").Value = 3 Then Wyd.PrintOut
ElseIf Range("Q9").Value = 4 Then Wye.PrintOut
ElseIf Range("Q9").Value = 5 Then Wyf.PrintOut
ElseIf Range("Q9").Value = 6 Then Wyg.PrintOut
ElseIf Range("Q9").Value = 7 Then Wyh.PrintOut
Else
Wyi.PrintOut
End If

Next
 

File đính kèm

  • NTCV.xlsm
    162.5 KB · Đọc: 6
Em muốn in 1 lúc 2 sheet, 1sheet in cố định, sheet còn lại in phụ thuộc theo điều kiện của 1 ô trong sheet in cố định. Em viêt code nhưng không biết sai ở đâu, mong các cao nhân chỉ giúp em ạ
Sub inbbnt()

Dim Wya As Worksheet, Wyb As Worksheet, Wyc As Worksheet, Wyd As Worksheet, Wye As Worksheet, Wyf As Worksheet, Wyg As Worksheet, Wyh As Worksheet, Wyi As Worksheet, i As Long
Set Wya = Sheet2
Set Wyb = Sheet1
Set Wyc = Sheet5
Set Wyd = Sheet7
Set Wye = Sheet10
Set Wyf = Sheet11
Set Wyg = Sheet12
Set Wyh = Sheet18
Set Wyi = Sheet19
Sheet2.Select
If Range("Q9").Value = 1 Then Wyb.PrintOut
ElseIf Range("Q9").Value = 2 Then Wyc.PrintOut
ElseIf Range("Q9").Value = 3 Then Wyd.PrintOut
ElseIf Range("Q9").Value = 4 Then Wye.PrintOut
ElseIf Range("Q9").Value = 5 Then Wyf.PrintOut
ElseIf Range("Q9").Value = 6 Then Wyg.PrintOut
ElseIf Range("Q9").Value = 7 Then Wyh.PrintOut
Else
Wyi.PrintOut
End If

Next
Thử thế này xem được không?
Mã:
Sub inbbnt()
    Dim WS As Worksheet
    If Range("Q9").Value > 0 And Range("Q9").Value < 8 Then
        Set WS = Array(Sheet2, Sheet1, Sheet5, Sheet7, Sheet10, Sheet11, Sheet12, Sheet18)(Range("Q9").Value)
    Else
        Set WS = Sheet19
    End If
    WS.PrintOut
End Sub
 
Upvote 0
Thêm bẫy lỗi và cặp ngoặc vuông [Sheet1]

JavaScript:
Sub inbbnt()
  On Error Resume Next
  Dim i%, a:  i = Range("Q9").value
  a = Array([Sheet19], [Sheet2], [Sheet1], [Sheet5], [Sheet7], [Sheet10], [Sheet11], [Sheet12], [Sheet18])
  On Error GoTo E
  a(i Mod (UBound(a) + 1)).PrintOut
Exit Sub
E:
MsgBox "PrintOut Error!"
End Sub
 
Upvote 0
Em hỏi cái món in mà có inputbox để ctrl chọn các sheet, liệu có được không các bác?
 
Upvote 0
em cảm ơn các anh đã quan tâm, e dùng if ... then ... và làm được rồi ạ

Sub inbbnt()
Dim Wya As Worksheet, Wyb As Worksheet, Wyc As Worksheet, Wyd As Worksheet, Wye As Worksheet, Wyf As Worksheet, Wyg As Worksheet, Wyh As Worksheet, Wyi As Worksheet, i As Long
Set Wya = Sheet2
Set Wyb = Sheet1
Set Wyc = Sheet5
Set Wyd = Sheet7
Set Wye = Sheet10
Set Wyf = Sheet11
Set Wyg = Sheet12
Set Wyh = Sheet18
Set Wyi = Sheet19
For i = Wya.Range("p5").Value To Wya.Range("p6").Value
Wya.Range("l6") = i
Wya.PrintOut
If Range("Q9").Value = "D" Then Wyb.PrintOut
If Range("Q9").Value = "CT" Then Wyc.PrintOut
If Range("Q9").Value = "CP" Then Wyd.PrintOut
If Range("Q9").Value = "BT" Then Wye.PrintOut
If Range("Q9").Value = "X" Then Wyf.PrintOut
If Range("Q9").Value = "T" Then Wyg.PrintOut
If Range("Q9").Value = "S" Then Wyh.PrintOut
If Range("Q9").Value = "C" Then Wyi.PrintOut

Next
 
Upvote 0
em cảm ơn các anh đã quan tâm, e dùng if ... then ... và làm được rồi ạ


Next
9 biến worksheet, 8 cái If. Không phải là code tối ưu nhé.
Nếu các bài trả lời ở #2 và #3 mà ra kết quả đúng thì nên dùng.
Ít ra bạn cũng nên xác nhận cho mọi người về kết quả đúng hay sai.
 
Upvote 0
9 biến worksheet, 8 cái If. Không phải là code tối ưu nhé.
Nếu các bài trả lời ở #2 và #3 mà ra kết quả đúng thì nên dùng.
Ít ra bạn cũng nên xác nhận cho mọi người về kết quả đúng hay sai.
Vâng e cảm ơn. 2 cái cách mà 2 bác ở trên hướng dẫn e thử k được bác ạ, e muốn in cố định là sheet 2, và trong ô Q9 sheet 2 có chữ D thì in sheet 1, chữ CT in sheet 5( tương tự mấy sheet khác). Bác xem có cái cách nào tối ưu hơn, e xin bác chỉ giúp
 
Upvote 0
Vâng e cảm ơn. 2 cái cách mà 2 bác ở trên hướng dẫn e thử k được bác ạ, e muốn in cố định là sheet 2, và trong ô Q9 sheet 2 có chữ D thì in sheet 1, chữ CT in sheet 5( tương tự mấy sheet khác). Bác xem có cái cách nào tối ưu hơn, e xin bác chỉ giúp
Có rất nhiều Cách

JavaScript:
Sub inbbnt()
  On Error GoTo E
  Dim W as object:
  Select case cstr(Sheet2.Range("Q9").value)
  Case "D": Set W = [Sheet1]
 Case "CT": Set W = [Sheet5]
  End Select
  If W Is nothing then goto E
  W.PrintOut
Exit Sub
E:
MsgBox "PrintOut Error!"
End Sub
 
Upvote 0
em cảm ơn các anh đã quan tâm, e dùng if ... then ... và làm được rồi ạ

Sub inbbnt()
Dim Wya As Worksheet, Wyb As Worksheet, Wyc As Worksheet, Wyd As Worksheet, Wye As Worksheet, Wyf As Worksheet, Wyg As Worksheet, Wyh As Worksheet, Wyi As Worksheet, i As Long
Set Wya = Sheet2
Set Wyb = Sheet1
Set Wyc = Sheet5
Set Wyd = Sheet7
Set Wye = Sheet10
Set Wyf = Sheet11
Set Wyg = Sheet12
Set Wyh = Sheet18
Set Wyi = Sheet19
For i = Wya.Range("p5").Value To Wya.Range("p6").Value
Wya.Range("l6") = i
Wya.PrintOut
If Range("Q9").Value = "D" Then Wyb.PrintOut
If Range("Q9").Value = "CT" Then Wyc.PrintOut
If Range("Q9").Value = "CP" Then Wyd.PrintOut
If Range("Q9").Value = "BT" Then Wye.PrintOut
If Range("Q9").Value = "X" Then Wyf.PrintOut
If Range("Q9").Value = "T" Then Wyg.PrintOut
If Range("Q9").Value = "S" Then Wyh.PrintOut
If Range("Q9").Value = "C" Then Wyi.PrintOut

Next
Bạn khai báo các tham biến từ Wya cho tới Wyi là không cần thiết
Cùng lắm chỉ cần 1 tham biến thôi, như
PHP:
  Dim GPE As WorkSheet
 If Range("Q9").Value = "CT" Then
      Set GPE = Sheet5:      GPE.PrintOut
. . . .
 
Upvote 0
9 biến worksheet, 8 cái If. Không phải là code tối ưu nhé.
...
Có khi cần thiết.
Cứ mỗi IF là có một lệnh in. Biết đâu lúc in có bẫy event gì đó ảnh hưởng đến cái IF kế tiếp. Ví dụ, thay đỏi trị Range("Q9").

Bạn khai báo các tham biến từ Wya cho tới Wyi là không cần thiết
Cùng lắm chỉ cần 1 tham biến thôi, như
PHP:
  Dim GPE As WorkSheet
 If Range("Q9").Value = "CT" Then
      Set GPE = Sheet5:      GPE.PrintOut
. . . .
Có khi cần thiết.
Đâu có ai bắt buộc Wya và Wyi phải trỏ vào hai sheets khác nhau đâu?
Khai báo nhiều biến có khi dễ chỉnh sửa và kiểm soát hơn.
(Chỉ có điều mấy cái tên đăt Wyi khơi khó hiểu. Nhưng biết đâu nó phản ánh cái gì đó trong môi trường thớt)
 
Upvote 0
Có rất nhiều Cách

JavaScript:
Sub inbbnt()
  On Error GoTo E
  Dim W as object:
  Select case cstr(Sheet2.Range("Q9").value)
  Case "D": Set W = [Sheet1]
 Case "CT": Set W = [Sheet5]
  End Select
  If W Is nothing then goto E
  W.PrintOut
Exit Sub
E:
MsgBox "PrintOut Error!"
End Sub
anh ơi, giờ nêu ô Q9 của em nó bằng 0 thì em không in sheet nào thì câu lệnh viết thế nào ạ, mong anh giúp đỡ. Em cảm ơn anh ạ
 
Upvote 0
Em muốn in 1 lúc 2 sheet, 1sheet in cố định, sheet còn lại in phụ thuộc theo điều kiện của 1 ô trong sheet in cố định. Em viêt code nhưng không biết sai ở đâu, mong các cao nhân chỉ giúp em ạ
Sub inbbnt()

Dim Wya As Worksheet, Wyb As Worksheet, Wyc As Worksheet, Wyd As Worksheet, Wye As Worksheet, Wyf As Worksheet, Wyg As Worksheet, Wyh As Worksheet, Wyi As Worksheet, i As Long
Set Wya = Sheet2
Set Wyb = Sheet1
Set Wyc = Sheet5
Set Wyd = Sheet7
Set Wye = Sheet10
Set Wyf = Sheet11
Set Wyg = Sheet12
Set Wyh = Sheet18
Set Wyi = Sheet19
Sheet2.Select
If Range("Q9").Value = 1 Then Wyb.PrintOut
ElseIf Range("Q9").Value = 2 Then Wyc.PrintOut
ElseIf Range("Q9").Value = 3 Then Wyd.PrintOut
ElseIf Range("Q9").Value = 4 Then Wye.PrintOut
ElseIf Range("Q9").Value = 5 Then Wyf.PrintOut
ElseIf Range("Q9").Value = 6 Then Wyg.PrintOut
ElseIf Range("Q9").Value = 7 Then Wyh.PrintOut
Else
Wyi.PrintOut
End If

Next
Xin chào, nhìn vào đoạn mã của bạn, tôi thấy rằng bạn đang có một số lỗi tại đây. Đầu tiên, các đối tượng trang tính cần phải được tham chiếu bằng cách sử dụng tên dưới dạng chuỗi ("Sheet2") hoặc sử dụng đối tượng Worksheets như Sheet1, Sheet2, v.v.Dưới đây là đoạn mã đã được sửa lỗi:

Mã:
Sub PrintSheets()
    Dim Wya As Worksheet, Wyb As Worksheet, Wyc As Worksheet, Wyd As Worksheet, Wye As Worksheet, Wyf As Worksheet, Wyg As Worksheet, Wyh As Worksheet, Wyi As Worksheet
    Set Wya = Worksheets("Sheet2")
    Set Wyb = Worksheets("Sheet1")
    Set Wyc = Worksheets("Sheet5")
    Set Wyd = Worksheets("Sheet7")
    Set Wye = Worksheets("Sheet10")
    Set Wyf = Worksheets("Sheet11")
    Set Wyg = Worksheets("Sheet12")
    Set Wyh = Worksheets("Sheet13")
    Set Wyi = Worksheets("Sheet14")
    
    ' Code to print the fixed sheet
    
    Wyb.PrintOut
    
    ' Code to print the dynamic sheet based on a condition in a fixed sheet
    
    For i = 1 To Wya.Cells(Rows.Count, 1).End(xlUp).Row
        If Wya.Cells(i, 1).Value = "Your Condition" Then
            ' Change the sheet reference and printout code based on your requirement
            Wyc.PrintOut
            Exit For
        End If
    Next i
End Sub

Trong đoạn mã trên, tôi đã tham chiếu đúng đến các đối tượng trang tính và sửa lỗi việc kết thúc đoạn mã. Bạn chỉ cần thay đổi "Your Condition" thành điều kiện mà bạn muốn để in trang tính phụ thuộc.Hãy thử chạy lại đoạn mã này và cảm nhận nếu có bất kỳ lỗi nào xuất hiện. Nếu có vấn đề hoặc câu hỏi nào khác, xin hãy cho tôi biết.
 
Upvote 0
Xin chào, nhìn vào đoạn mã của bạn, tôi thấy rằng bạn đang có một số lỗi tại đây. Đầu tiên, các đối tượng trang tính cần phải được tham chiếu bằng cách sử dụng tên dưới dạng chuỗi ("Sheet2") hoặc sử dụng đối tượng Worksheets như Sheet1, Sheet2, v.v.Dưới đây là đoạn mã đã được sửa lỗi:

Mã:
Sub PrintSheets()
    Dim Wya As Worksheet, Wyb As Worksheet, Wyc As Worksheet, Wyd As Worksheet, Wye As Worksheet, Wyf As Worksheet, Wyg As Worksheet, Wyh As Worksheet, Wyi As Worksheet
    Set Wya = Worksheets("Sheet2")
    Set Wyb = Worksheets("Sheet1")
    Set Wyc = Worksheets("Sheet5")
    Set Wyd = Worksheets("Sheet7")
    Set Wye = Worksheets("Sheet10")
    Set Wyf = Worksheets("Sheet11")
    Set Wyg = Worksheets("Sheet12")
    Set Wyh = Worksheets("Sheet13")
    Set Wyi = Worksheets("Sheet14")
    
    ' Code to print the fixed sheet
    
    Wyb.PrintOut
    
    ' Code to print the dynamic sheet based on a condition in a fixed sheet
    
    For i = 1 To Wya.Cells(Rows.Count, 1).End(xlUp).Row
        If Wya.Cells(i, 1).Value = "Your Condition" Then
            ' Change the sheet reference and printout code based on your requirement
            Wyc.PrintOut
            Exit For
        End If
    Next i
End Sub

Trong đoạn mã trên, tôi đã tham chiếu đúng đến các đối tượng trang tính và sửa lỗi việc kết thúc đoạn mã. Bạn chỉ cần thay đổi "Your Condition" thành điều kiện mà bạn muốn để in trang tính phụ thuộc.Hãy thử chạy lại đoạn mã này và cảm nhận nếu có bất kỳ lỗi nào xuất hiện. Nếu có vấn đề hoặc câu hỏi nào khác, xin hãy cho tôi biết.
Do e cũng k biết nhiều nên a gửi a xem file, file này e muốn in nhanh nhiều biên bản, vi dụ e muốn in tự động 5 cái biên bản liên tục từ 1 đến 5, cái biên bản là của sheet 2, trong sheet 2 có ô Q9 là điều kiên để in các sheet khác, nếu bb 1 ô q9 là chữ D thì in thêm sheet 1, bb số 2 ô Q9 =0 thì in mỗi sheet2 và chuyển tiếp sang bb số 3, ô Q9 theo bb số 3 =VK thì in thêm sheet7
 

File đính kèm

  • NTCV.xlsm
    207.3 KB · Đọc: 2
Upvote 0
Thêm vào đoạn mã
Case else: exit sub
Trên End select
Sub inbbnt111()
Dim i As Long, printFrom As Long, printTo As Long
printFrom = Sheet2.Range("p5").Value
printTo = Sheet2.Range("p6").Value
For i = printFrom To printTo
Sheet2.Range("l6").Value = i
Sheet2.PrintOut copies:=1, preview:=False
Dim W As Object:
Select Case CStr(Range("Q9").Value)
Case "D": Set W = [Sheet1]
Case "CT": Set W = [Sheet5]
Case "VK": Set W = [Sheet7]
Case "BT": Set W = [Sheet10]
Case "X": Set W = [Sheet11]
Case "T": Set W = [Sheet12]
Case "S": Set W = [Sheet18]
Case "C": Set W = [Sheet19]
Case Else: Exit Sub
End Select
W.PrintOut
Next i
End Sub
anh ơi cho em hỏi là do em muốn in liên tục theo biến i, vi dụ e muốn in tự động 3 cái biên bản liên tục từ 1 đến 3, cái biên bản là của sheet 2, trong sheet 2 có ô Q9 là điều kiên để in các sheet khác, nếu bb 1 ô q9 là chữ D thì in sheet2 và in thêm sheet 1, bb số 2 ô Q9 =0 thì in mỗi sheet2 và tiếp tục bb số 3, ô Q9 theo bb số 3 =VK thì in sheet2 và in thêm sheet7. nhưng e nhập thêm cái Case else: exit sub vào thì nó lại dừng ở bb số 2 mà k in bb số 3 anh ạ thì có cách nào xử lý không anh
 
Upvote 0
Sub inbbnt111()
Dim i As Long, printFrom As Long, printTo As Long
printFrom = Sheet2.Range("p5").Value
printTo = Sheet2.Range("p6").Value
For i = printFrom To printTo
Sheet2.Range("l6").Value = i
Sheet2.PrintOut copies:=1, preview:=False
Dim W As Object:
Select Case CStr(Range("Q9").Value)
Case "D": Set W = [Sheet1]
Case "CT": Set W = [Sheet5]
Case "VK": Set W = [Sheet7]
Case "BT": Set W = [Sheet10]
Case "X": Set W = [Sheet11]
Case "T": Set W = [Sheet12]
Case "S": Set W = [Sheet18]
Case "C": Set W = [Sheet19]
Case Else: Exit Sub
End Select
W.PrintOut
Next i
End Sub
anh ơi cho em hỏi là do em muốn in liên tục theo biến i, vi dụ e muốn in tự động 3 cái biên bản liên tục từ 1 đến 3, cái biên bản là của sheet 2, trong sheet 2 có ô Q9 là điều kiên để in các sheet khác, nếu bb 1 ô q9 là chữ D thì in sheet2 và in thêm sheet 1, bb số 2 ô Q9 =0 thì in mỗi sheet2 và tiếp tục bb số 3, ô Q9 theo bb số 3 =VK thì in sheet2 và in thêm sheet7. nhưng e nhập thêm cái Case else: exit sub vào thì nó lại dừng ở bb số 2 mà k in bb số 3 anh ạ thì có cách nào xử lý không anh

Bạn dựa theo mã dưới đây


JavaScript:
Sub inbbnt111()
  On Error Resume Next
  Dim i As Long, W As Object: i = 1
  Select Case CStr(Range("Q9").value)
  Case "0", "D", "VK":
    i = Sheet2.Range("p6").value
    Set W = [Sheet2]: GoSub P
'  Case "1", "BT", "X", "T":
'    i = 1: i = Sheet5.Range("p6").value
'    Set W = [Sheet5]: GoSub P
  End Select

  Select Case CStr(Range("Q9").value)
  Case "D": Set W = [Sheet1]
  Case "CT": Set W = [Sheet5]
  Case "VK": Set W = [Sheet7]
  Case "BT": Set W = [Sheet10]
  Case "X": Set W = [Sheet11]
  Case "T": Set W = [Sheet12]
  Case "S": Set W = [Sheet18]
  Case "C": Set W = [Sheet19]
  End Select
  If Not W Is Nothing Then W.PrintOut
Exit Sub
P:
  If W Is Nothing Then Return
  W.PrintOut Copies:=i, preview:=False
  Set W = Nothing
Return
End Sub
 
Upvote 0
Web KT

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

Back
Top Bottom