Chuyên mục xử lý, gỡ rối code VBA

Liên hệ QC
Status
Không mở trả lời sau này.

ndu96081631

Huyền thoại GPE
Thành viên BQT
Super Moderator
Tham gia
5/6/08
Bài viết
30,703
Được thích
53,930
Đại khái là vậy, viết đầy đủ dể đọc hơn, ngoài ra trong help Call còn có tác dụng gì đó mà mình không biết rỏ
Vấn đề gì mình không biết, tự tra phần Help, tìm trên mạng, tự thử nhiều lần theo nhiều cách, kỹ năng sẽ được nâng cao
Cách tìm Max
Mã:
Nmax=0
For i=1 to gì đó
  if điều kiện xét then
    if Nmax<Arr(... , ....) then Nmax=Arr(... , ....)
  end if
Next i
Anh làm ví dụ cho em với ạ!
 

File đính kèm

  • Addin KL-CD K95 yyyyy.xlsb
    112 KB · Đọc: 3
Upvote 0
anh ơi! viết hộ em đoạn code để em add vào sub của em ạ! em cảm ơn a
chạy code Test
Mã:
Sub Test()
  Dim Nmax As Long, Lrow As Long, iMin As Long, iMax As Long
  iMin = 2
  iMax = 3
  With Sheets("TH-K95")
    Lrow = .Range("A" & Rows.Count).End(xlUp).Row
    Nmax = IfMax(.Range("A3:A" & Lrow), .Range("E3:E" & Lrow), iMin, iMax)
    MsgBox ("Max là: " & Nmax)
  End With
End Sub

Private Function IfMax(ByVal ifRng As Range, ByVal MaxRng As Range, ByVal iMin As Long, ByVal iMax As Long)
  Dim i As Long, Nmax As Long
  For i = 1 To ifRng.Rows.Count
    If ifRng(i, 1) >= iMin And ifRng(i, 1) <= iMax Then
      If Nmax < MaxRng(i, 1) Then Nmax = MaxRng(i, 1)
    End If
  Next i
  IfMax = Nmax
End Function
 
Upvote 0
chạy code Test
Mã:
Sub Test()
  Dim Nmax As Long, Lrow As Long, iMin As Long, iMax As Long
  iMin = 2
  iMax = 3
  With Sheets("TH-K95")
    Lrow = .Range("A" & Rows.Count).End(xlUp).Row
    Nmax = IfMax(.Range("A3:A" & Lrow), .Range("E3:E" & Lrow), iMin, iMax)
    MsgBox ("Max là: " & Nmax)
  End With
End Sub

Private Function IfMax(ByVal ifRng As Range, ByVal MaxRng As Range, ByVal iMin As Long, ByVal iMax As Long)
  Dim i As Long, Nmax As Long
  For i = 1 To ifRng.Rows.Count
    If ifRng(i, 1) >= iMin And ifRng(i, 1) <= iMax Then
      If Nmax < MaxRng(i, 1) Then Nmax = MaxRng(i, 1)
    End If
  Next i
  IfMax = Nmax
End Function
Code chạy ổn rồi ạ! em cảm ơn anh nhiều.. Chúc anh 1 ngày vui vẻ
 
Upvote 0
Dòng 0: Giới thiệu với bạn đây là macro sự kiện;
D1: Nếu (bạn vừa) đụng vào [E3] thì các dòng lệnh trước D13 được thi hành;
D2: Xác định 2 biến đối tượng sẽ được xài;
D3: Nếu chiều dài (chuỗi ) dữ liệu chứa trong [e3] hơn 8 thì gán Sheet2 vô biến đối tượng; bằng ngược lại thì (gán) sheet3
D4: Tuyên cáo làm việc với biến đối tượng (vừa được gán)
D5: Áp dụng fương thức Find (tìm kiếm) đến vùng có dữ liệu của cột [B:b] trong biến đội tượng để tìm trị trong ô [E4];
Cách tưức tìm là tìm dữ liệu (không fải tìm trong công tưức) & tìm theo nguyên thể (. . .);
D6: Nếu tìm không thấy thì thực hiện các lệnh trước D9;
D7: Gán trị 0 cho ô [E10];
D8: Tới nhãn có tên (. .)
D9 Ket thúc điều kiện xử lý (Xem lại D6)
D10: Không "chơi" nữa;
D11: (Muốn hiểu dòng lệnh này fải xem trong [E6] đang chứa gì mới được; Nhưng cách viết vầy hơi lạ!)
D12: Dứt tuyên cáo (D4)
D13: Kết thúc sự kiện
D14: Trả lại thiết lập ban đầu (của hệ thống)

Những mong giúp được bạn điều gì đó, nhỏ nhoi!
anh ơi có thể cho em trao đổi riêng hỏi thêm chút không anh? em k pm hồ sơ anh đc ạ
 
Upvote 0
Bạn nên nêu câu hỏi trên diễn đàn;
Có vậy bạn sẽ nhận được câu trả lời chính xác hơn từ cộng đồng.
 
Upvote 0
Bạn nên nêu câu hỏi trên diễn đàn;
Có vậy bạn sẽ nhận được câu trả lời chính xác hơn từ cộng đồng.
dạ vâng anh! nhiều khi ý diên
anh ơi có thể cho em trao đổi riêng hỏi thêm chút không anh? em k pm hồ sơ anh đc ạ
Dạ vâng! em xin cảm ơn a đã góp ý.. em sẽ còn học hỏi và rút kinh nghiệm nhiều nữa.. cảm ơn anh và gpe rất nhiều!
 
Upvote 0
không biết lỗi chỗ nào ?
Sub loc_du_lieu()
Dim cb As Range
Dim maxd As Range
For Each cb In Sheet3.Range("a1:a33") ' khai báo điều kiện lọc 1 ở đây
For Each maxd In Sheet3.Range("b1:b15") ' khai báo điều kiện lọc 2 ở đây
With Sheet2.Range("a1:eek:735") 'khai báo vùng lọc ở đây
.Parent.AutoFilterMode = False
.AutoFilter
.AutoFilter Field:=5, Criteria1:=cb
.AutoFilter Field:=14, Criteria1:=maxd
.Parent.AutoFilter.Range.Copy

Sheets.Add after:=Sheets(Sheets.Count)
Sheets(Sheets.Count).Name = cb & "-" & maxd
Sheets(Sheets.Count).Range("a1").PasteSpecial.xlPasteValues
End With
Next

1. tình hình là mình muốn viết 1 macro nhằm tách các sheet và đặt tên cho nó. Mình đã làm đúng như hướng dãn song chỉ chay được 01 sheet đầu tiên.
Còn sau đó thì nó báo lỗi run-time error '424"
2. Nếu như mình muốn khai báo điều kiện lọc, vùng lọc khi chạy macro thì phải làm như thế nào ạ
nếu chọn 1 hoặc 2 điều kiện thì macro sẽ chạy tương ứng với kiểu lọc

Thật sự thì mình gà về VBA. Mong các bạn chỉ giáo.https://drive.google.com/open?id=0B_i2RtK5k81fVzlRU1BuaWpVSkE
sao không có ai giúp vậy nè huhu
 
Upvote 0
chạy code Test
Mã:
Sub Test()
  Dim Nmax As Long, Lrow As Long, iMin As Long, iMax As Long
  iMin = 2
  iMax = 3
  With Sheets("TH-K95")
    Lrow = .Range("A" & Rows.Count).End(xlUp).Row
    Nmax = IfMax(.Range("A3:A" & Lrow), .Range("E3:E" & Lrow), iMin, iMax)
    MsgBox ("Max là: " & Nmax)
  End With
End Sub

Private Function IfMax(ByVal ifRng As Range, ByVal MaxRng As Range, ByVal iMin As Long, ByVal iMax As Long)
  Dim i As Long, Nmax As Long
  For i = 1 To ifRng.Rows.Count
    If ifRng(i, 1) >= iMin And ifRng(i, 1) <= iMax Then
      If Nmax < MaxRng(i, 1) Then Nmax = MaxRng(i, 1)
    End If
  Next i
  IfMax = Nmax
End Function
anh ơi! có thể ghép hẳn thành 1 function được không ạ..
Để em cho vào Nmax vào vòng for code của em giúp em với
 
Upvote 0
Bạn nên nêu câu hỏi trên diễn đàn;
Có vậy bạn sẽ nhận được câu trả lời chính xác hơn từ cộng đồng.
Anh ơi anh cho em hỏi khi viết liền code như sau:
"Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$E$3" Then
Dim sht As Worksheet, rng As Range
If Len([e3]) > 8 Then Set sht = Sheet2 Else Set sht = Sheet3
With sht
Set rng = .Range(.[B7], .Cells(.Rows.Count, "B").End(3)).Find([E4], , xlValues, xlWhole, , , True)
Application.EnableEvents = False
If rng Is Nothing Then
[e10] = 0
GoTo thoat
End If
[e10].Value = rng(, [e6] + 2).Value

End With
End If
thoat:
Application.EnableEvents = True
End Sub"
với là tách ra viết 2 đoạn khác nhau như sau:
- trong sheet viết:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$K$4" Then GPE Target.Value
End Sub
- trong module viết:
"
Sub GPE(Gt)
On Error Resume Next
Dim i As Long, k As Long
Dim Arr, dArr, sArr
Arr = Range(Sheet3.[B10], Sheet3.[B65000].End(3)).Resize(, 12)
ReDim dArr(1 To UBound(Arr, 1), 1 To 1)
ReDim sArr(1 To UBound(Arr, 1), 1 To 1)
k = 0
For i = 1 To UBound(Arr, 1)
If Year(Arr(i, 12)) = Gt Then
k = k + 1
dArr(k, 1) = Arr(i, 1)
sArr(k, 1) = Arr(i, 12)
End If
Next i
Sheet5.Range("B6:B20").ClearContents
Sheet5.Range("B6").Resize(k) = dArr
Sheet5.Range("G6:G20").ClearContents
Sheet5.Range("G6").Resize(k) = sArr
End Sub" nó sẽ khác nhau thế nào ạ???
 
Upvote 0
Hai macro trên làm 2 công việc với 2 cách hoàn toàn khác nhau; Vậy sẽ khó trả lời đầy đủ cho iêu cầu của bạn rồi.

Tạm thời là vầy:

Macro GPE() được cung cấp bỡi 1 tham biến Gt; Nó là tham biến chỉ ra con số của 1 năm nào đó
Trong macro này nó sẽ so sánh tham biến được cung cấp với từng dòng của mảng; Nếu trùng với trị trong cột 12 của dòng biến mảng đang khảo sát thì làm thứ gì đó;
Thứ gì đó ở đây là ghi số liệu cột nào đó của dòng đang khảo sát vô các mảng đã khai báo cho bạn.

Thường người ta tách ra thành 1 chương trình con để:
Dễ bảo trì, sửa chữa
Làm việc linh hoạt hơn với tham biến tương ứng được cung cấp khác nhau

Lấy ví dụ macro được cung cấp 2 tham biến,
1 vẫn là Gt, & thêm tham biến thứ 2 là trị mang/ứng với số cột ( trong macro trên là cột 12 giả dụ là ngày vô; còn cột 13 là ngày ra. . .)
Thì bạn sẽ thấy rằng, macro GPE sẽ làm việc khác nhau khi nhận các tham biến khác nhau tương ứng.

Tạm thời chỉ vậy, nếu bạn cần ví dụ cụ thể hơn thì chờ đi vậy!
 
Upvote 0
Bỏ đoạn này đi là đc bạn
Sheet3.

Bạn nên gửi cả file lên như vậy tương tác trực tiếp sẽ dễ hơn!
nếu bỏ sheet3. thì nó lấy điều kiện ở đâu bạn ơi
ok, lần sau rút kinh nghiệm vụ gởi cả files trực tiếp. không gởi link.
cảm ơn bạn
 

File đính kèm

  • Copy of sau cấp kdc210.xls
    369 KB · Đọc: 3
Upvote 0
nếu bỏ sheet3. thì nó lấy điều kiện ở đâu bạn ơi
ok, lần sau rút kinh nghiệm vụ gởi cả files trực tiếp. không gởi link.
cảm ơn bạn
Code yêu cầu bên trên gửi file lại là loại khác thì làm sao mà dc bạn?
Bạn phải đưa code vào mục code [.QUOTE] code [./QUOTE]
 
Upvote 0
Mọi người cho hỏi. Excel có cách nào tự giãn dòng khi đánh văn bản như word k. Word tự động căn chỉnh nên các dòng thẳng hàng lề bên phải. Excel lượn lề bên phải như rắn
 
Upvote 0
Status
Không mở trả lời sau này.
Web KT
Back
Top Bottom