Nhờ bổ sung đoạn code điều kiện cho câu lệnh For kết hợp IF!

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

MinhCong

Thành viên gắn bó
Tham gia
28/5/09
Bài viết
1,645
Được thích
1,806
Nghề nghiệp
Xây dựng Cầu đường
Tôi có viết 1 đoạn code để copy 1 số vùng theo điều kiện như sau:
Mã:
Sub NT_Congviec()
Dim i, J, K As Integer
Dim n As Long
  For i = 155 To 235 Step 8
     J = i + 2: K = i + 7: n = Range("C" & i)
       With Range("C" & J & ":C" & K)
           If [COLOR=Blue]n > 1[/COLOR] Then .Copy .Offset(, 1).Resize(, n - 1)
       End With
  Next
End Sub
Yêu cầu nhờ giúp đỡ:
Nếu: n<1 thì dòng Rows("C" & J & ":C" & K) sẽ ẩn đi
Nếu: n=1 thì không copy vùng
Range("C" & J & ":C" & K) sang

Rất mong được giúp đỡ. Xin chân thành cảm ơn!
 
Bạn ơi nếu ẩn thì phải ẩn cả dòng hay cột chứ ẩn 1 vùng thì ẩn làm sao. Còn câu lệnh if viết như sau:

Mã:
Sub NT_Congviec()
Dim i, J, K As Integer
Dim n As Long
  For i = 155 To 235 Step 8
     J = i + 2: K = i + 7: n = Range("C" & i)
       With Range("C" & J & ":C" & K)
           If n > 1 Then
           .Copy .Offset(, 1)
           ElseIf n < 0 Then
           Rows(J & ":" & K).Hidden = True
           End If
       End With
  Next
End Sub
 
Upvote 0
Bạn ơi nếu ẩn thì phải ẩn cả dòng hay cột chứ ẩn 1 vùng thì ẩn làm sao
Đúng rồi Anh à. Ẩn nguyên cả dòng. Đoạn code đã đúng ý Em rồi.
Anh cho Em hỏi nhé!
Mã:
For [COLOR=Blue][COLOR=Black]i =[/COLOR] 24[/COLOR] To [COLOR=Blue]144[/COLOR] Step 10
Chỗ cái số 24144 ấy. Nếu Em đặt name (OBĐ=Row($C24) và OKT=Row($C144) cho nó ) thì khi đưa vào đoạn code trên sẽ như thế nào nhỉ?
Vì mục đích đặt name để có lỡ sau này insert thêm 1 dòng ở phía trên dòng thứ 24 thì nó tự động chạy ấy mà.
 
Lần chỉnh sửa cuối:
Upvote 0
Nhờ các Anh, Chị giúp:

1/Như bài trên:
Mã:
For [COLOR=Blue][COLOR=Black]i =[/COLOR] 24[/COLOR] To [COLOR=Blue]144[/COLOR] Step 10
Chỗ cái số 24144 ấy. Nếu Em đặt name (OBĐ=Row($C24) và OKT=Row($C144) cho nó ) thì khi đưa vào đoạn code trên sẽ như thế nào nhỉ?
Vì mục đích đặt name để có lỡ sau này insert thêm 1 dòng ở phía trên dòng thứ 24 thì nó tự động chạy ấy mà.

2/Lấy tên sheet tham chiếu từ 1 ô:
VD: Tại ô A1 tôi có giá trị là DaoNen (Đây cũng là tên của sheet DaoNen)
Vậy bằng cách nào để khi chay code nó chọn đến ô A1 thì sheet DaoNen được chọn không? Tức Sheets("A1.value") là sheets("DaoNen")
 
Lần chỉnh sửa cuối:
Upvote 0
1/ For i= Sheetxxxx.Range("ODB").Value to sheetxxxx.Range("OKT").Value Step 10
Mà cũng có thể (Chưa rõ ý bạn)
For i= Sheetxxxx.Range("ODB").Row to sheetxxxx.Range("OKT").Row Step 10

2/Sheets(Sheetxxxx.[a].Text).Select
 
Lần chỉnh sửa cuối:
Upvote 0
1/ For i= Sheetxxxx.Range("ODB").Value to sheetxxxx.Range("OKT").Value Step 10
Mà cũng có thể (Chưa rõ ý bạn)
For i= Sheetxxxx.Range("ODB").Row to sheetxxxx.Range("OKT").Row Step 10

2/Sheets(Sheetxxxx.[a].Text).Select
Câu hỏi 1:
Bị lỗi 400 rồi Anh à. Để Em nói rõ thêm nhé!
Mã:
Sub NT_Xaylap()
Dim i, J, K As Integer: Dim n As Long
  For i = Range("BDXL").Value To Range("KTXL").Value Step 10
    J = i + 2: K = i + 9: n = Range("C" & i)
       With Range("C" & J & ":C" & K)
           If n = 0 Then
              Rows(i & ":" & K + 1).Hidden = True
           ElseIf n > 1 Then
              Rows(i & ":" & K + 1).Hidden = False
              Range("C" & J & ":C" & K).Copy .Offset(, 1).Resize(, n - 1)
           End If
       End With
  Next
End Sub
Trong sheet Menu, Vào Name đặt tên OBD có giá trị =ROW($C24) => Có giá trị là 24; OKT có giá trị =ROW($C144) => Kết quả có giá trị là 144 (Mục đích đặt name là muốn: Lỡ có insert thêm 1 dòng trên dòng thứ 24 nữa tức lúc này OBD không còn là =ROW($C24) nữa mà là ROW($C25)=25 tương từ OKT có giá trị là ROW($C145)=145 (Nó giống name động vậy)
Khi đó trong code ta có:
Lúc chưa insert 1 dòng trên dòng 24 thì nó là:
Mã:
For i = [COLOR=Blue]24[/COLOR] To [COLOR=Blue]144[/COLOR] step 10
Khi đã insert 1 dòng trên dòng 24 thì code nó sẽ tự hiểu là:
Mã:
For i = [COLOR=Blue]25[/COLOR] To [COLOR=Blue]145[/COLOR] step 10
2/Mục đích câu hỏi 2: Để ẩn sheet
Mã:
Sub AnsheetNT_Xaylap()
Dim i, J As Integer: Dim n As Long
  For i = 24 To 144 Step 10
     J = i + 2: K = i + 7: n = Range("C" & i)
       With Sheets(Sheets("Menu").Range("A" & J).Text)
           If n = 0 Then
              Sheets(Sheets("Menu").Range("A" & J).Text).Visible = False
           ElseIf n > 1 Then
              Sheets(Sheets("Menu").Range("A" & J).Text).Visible = True
           End If
       End With
  Next
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Thay vì dùng:
For i = Range("BDXL").Value To Range("KTXL").Value Step 10
Bạn thử vầy xem:
For i = Evaluate("BDXL") To Evaluate("KTXL") Step 10
Nó hiện lỗi Type mismatch Anh à. Đoạn code của Em như sau:
Mã:
Sub NT_Xaylap()
Dim i, J, K As Integer: Dim n As Long
  For i = Evaluate("BDXL") To Evaluate("KTXL") Step 10
    J = i + 2: K = i + 9: n = Range("C" & i)
       With Range("C" & J & ":C" & K)
           If n = 0 Then
              Rows(i & ":" & K + 1).Hidden = True
              Sheets(Range("A" & J).Text).Visible = False
           ElseIf n > 1 Then
              Rows(i & ":" & K + 1).Hidden = False
              Range("C" & J & ":C" & K).Copy .Offset(, 1).Resize(, n - 1)
              Sheets(Range("A" & J).Text).Visible = True
           End If
       End With
  Next
End Sub
 
Upvote 0
Nó hiện lỗi Type mismatch Anh à. Đoạn code của Em như sau:
Mã:
Sub NT_Xaylap()
Dim i, J, K As Integer: Dim n As Long
  For i = Evaluate("BDXL") To Evaluate("KTXL") Step 10
    J = i + 2: K = i + 9: n = Range("C" & i)
       With Range("C" & J & ":C" & K)
           If n = 0 Then
              Rows(i & ":" & K + 1).Hidden = True
              Sheets(Range("A" & J).Text).Visible = False
           ElseIf n > 1 Then
              Rows(i & ":" & K + 1).Hidden = False
              Range("C" & J & ":C" & K).Copy .Offset(, 1).Resize(, n - 1)
              Sheets(Range("A" & J).Text).Visible = True
           End If
       End With
  Next
End Sub
Chết cha!... Hàm ROW là hàm mảng, sao mà lấy được giá trị của nó cho vào VBA đây chứ
Vậy, thay vì bạn đặt name:
BDXL=ROW($C24)
bạn thử sửa lại thành:
BDXL=ROWS($1:$24)
rồi áp dụng Evaluate như tôi nói ở trên xem
Đây là 1 trường hợp thực tế khiến ta phải suy nghĩ nên dùng ROWS chứ không nên ROW (như có lần tôi đã cảnh báo)
 
Lần chỉnh sửa cuối:
Upvote 0
Lại tìm ra được 1 cách khác!
Vì ROW là hàm mảng nên ta sẽ truy xuất nó như 1 mảng vậy:
PHP:
Sub Test()
  Dim i As Long, Tmp1, Tmp2
  Tmp1 = Evaluate("BDXL")
  Tmp2 = Evaluate("KTXL")
  For i = Tmp1(1) To Tmp2(1) Step 10
    ...
    ...
  Next
End Sub
 
Upvote 0
Mình thấy bạn làm vậy là tự làm khó bạn mà thôi. Sao bạn lại phải dùng row trong Name làm gì? Bạn cứ đặt 2 cái Name đơn giản nhất có thể như sau (Gõ trực tiếp ngay thanh công thức là được):

BDXL ( Refer To): Sheet1!$C$24
KTXL (Refer To): Sheet1!$C$144

Và trong Code bạn viết

For i = Range("BDXL").Row To Range("KTXL").Row Step 10
...
...
Next
 
Upvote 0
Mình thấy bạn làm vậy là tự làm khó bạn mà thôi. Sao bạn lại phải dùng row trong Name làm gì? Bạn cứ đặt 2 cái Name đơn giản nhất có thể như sau (Gõ trực tiếp ngay thanh công thức là được):

BDXL ( Refer To): Sheet1!$C$24
KTXL (Refer To): Sheet1!$C$144

Và trong Code bạn viết

For i = Range("BDXL").Row To Range("KTXL").RowStep 10
...
...
Next
Không biết vì sao nó vẫn lỗi 400 Anh à.
Mã:
Sub NT_Xaylap()
Dim i, J, K, n As Long
  For i = Range("BDXL").Row To Range("KTXL").Row Step 10
    J = i + 2: K = i + 9: n = Range("C" & i)
       With Range("C" & J & ":C" & K)
           If n = 0 Then
              Rows(i & ":" & K).Hidden = True
              Sheets(Range("A" & J).Text).Visible = False
           ElseIf n > 1 Then
              Rows(i & ":" & K).Hidden = False
              Range("C" & J & ":C" & K).Copy .Offset(, 1).Resize(, n - 1)
              Sheets(Range("A" & J).Text).Visible = True
           End If
       End With
  Next
End Sub
Xin lỗi Anh nhé. Cách của Anh và cách thứ 1 của Anh NDU cũng đúng theo yêu cầu rồi. cảm ơn các Anh đã quan tâm giúp đỡ.
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT

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

Back
Top Bottom