Chuyên mục xử lý, gỡ rối code VBA (3 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

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,957
Mã:
Public Sub XepLich()
Dim sArr(), dArr(), I As Long, J As Long, K As Long, s As Long
sArr = Range("D5:AH10").Value
ReDim dArr(1 To 5, 1 To 31)
For J = 1 To 31
    If sArr(1, J) = 1 Then
        For I = 1 To 5
            dArr(I, J) = "Off"
        Next I
    Else
        s = s + 1
        If sArr(1, J) > 1 Then
            If K = 5 Then K = 1 Else K = K + 1
            If s Mod 2 = 1 Then dArr(K, J) = "Sang" Else dArr(K, J) = "Chieu"
        End If
    End If
Next J
[D6:AH10] = dArr
End Sub

Tài thật!!! Code của bạn dễ hiểu dễ vận dụng vào trường hợp khác. Cảm ơn rất nhiều!
 
Lần chỉnh sửa cuối:
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
 
Upvote 0
Thưa thầy em muốn tìm số lớn nhất
DK: 2-:- 3 của cột A tìm số lớn nhất vùng cột E thì phải làm như nào, em cảm ơn thầy!
----------------------------
Dim arr, Rng As Range, Nmax As Long
Set Rng = .Range("E3", .Range("E65535").End(xlUp))
Nmax = Application.Max(Rng)
For i = 1 To Nmax
----> Nmax tìm dc lớn nhất là 11)
Untitled.png
 
Lần chỉnh sửa cuối:
Upvote 0
Chuyện đầu tiên, mình khẳng định không là thầy ai cả.

Chuyện kế tiếp: Cần fải hiểu sao cho đúng câu này của bạn:
DK: 2-:- 3 của cột A tìm số lớn nhất vùng cột E thì phải làm như nào

(1) Tìm số lớn nhất tại cột [E:e], khi cột [A:a] có trị là 2 hay 3

(2) Tìm các giá trị lớn nhất (ở cột [E:E] khi trị tại cột [A:A] thay đổi

(3) . . . . . . .
 
Upvote 0
Chuyện đầu tiên, mình khẳng định không là thầy ai cả.

Chuyện kế tiếp: Cần fải hiểu sao cho đúng câu này của bạn:


(1) Tìm số lớn nhất tại cột [E:e], khi cột [A:a] có trị là 2 hay 3

(2) Tìm các giá trị lớn nhất (ở cột [E:E] khi trị tại cột [A:A] thay đổi

(3) . . . . . . .
Dạ vâng!
(1) Tìm số lớn nhất tại cột [E:e], khi cột [A:a] có trị từ >= 2 đến <= 3 (VD như hình: điều kiện cần tìm trong vùng Cột A từ 2 đến 6 tìm giá trị lớn nhất tại cột E sẽ tìm được là 8)
Untitled.png )
 
Upvote 0
(1) Tìm số lớn nhất tại cột [E:e], khi cột [A:a] có trị từ >= 2 đến <= 3 (VD như hình: điều kiện cần tìm trong vùng Cột A từ 2 đến 6 tìm giá trị lớn nhất tại cột E sẽ tìm được là 8)
Mã:
=AGGREGATE(14,6,(vungdk>=canduoi)*(vungdk<=cantren)*vungcanlay_kq,1)
 
Upvote 0
Upvote 0
Có phải giống như thay vì .End(3) ta viết thành .End(xlUp) thì nhìn sẽ trực Quan hơn phải ko anh?
Đạ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
 
Upvote 0

File đính kèm

Upvote 0
Đạ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

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
Status
Không mở trả lời sau này.
Web KT

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

Back
Top Bottom