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
Nhờ mọi người xem giúp đoạn codec sau lỗi ở chỗ nào mà không chạy được:
Function xm(ByVal quy As Long, ByVal nam As Long)
Dim sArray
sArray = ThisWorkbook.Sheets("Data").Range("B3:F5").Value
xm = sArray(nam, quy)
End Function
 
Upvote 0
Vậy bạn có dịch sang tiếng Việt nội dung của hàm không?

& quan trọng là không fải nó chạy khơi khơi, mà cung cấp cho ,hàm những tham biến gì để nó chạy
 
Upvote 0
Nhờ mọi người xem giúp đoạn codec sau lỗi ở chỗ nào mà không chạy được:
Function xm(ByVal quy As Long, ByVal nam As Long)
Dim sArray
sArray = ThisWorkbook.Sheets("Data").Range("B3:F5").Value
xm = sArray(nam, quy)
End Function

Lần đầu thấy có người viết cái hàm độc kiểu này, với cái hàm này thì dùng hàm index trong excel cho nhanh, Gửi file lên sẽ có nhiều thông tin hơn.
 
Upvote 0
lỗi ở chỗ nào mà không chạy được
Lỗi như nào?
PHP:
Function TenHamLamGiDo(Byval Rng as range, ByVal quy As Long, ByVal nam As Long)
if Rng.Count=1 then exit Function
TenHamLamGiDo=Rng.Value(nam,quy)
End Function
Áp dụng bảng tính:
Mã:
=TenHamLamGiDo(vùng dữ liệu, nam, quy)
 
Upvote 0
Đâu có cần file cơ chứ!
Theo mình hiểu thì hàm cần cung cấp 2 tham biến là số nguyên dương; Trong đó 1 tham biến fải chỉ là từ 1 đến 3 Còn tham biến kia là từ 1 đến 5

Nếu cung ứng các tham biến sai fạm vi nó sẽ nói là "Đi chõ khác chơi đi bạn!"

PHP:
       (Cột B) (Cột C) (Cột D) (Cột E) {Cột F)
                Q I     QII     QIII    Q IV
(Hàng 3) 2016    100     415     451     487
(Hàng 4) 2017     45     200     355     510
(Hàng 5) 2018     32     322     612     902
 
Lần chỉnh sửa cuối:
Upvote 0
Các sư phụ giải thích giúp em đoạn code này với ạ
Option Explicit

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)
If rng Is Nothing Then
[e10] = 0
GoTo thoat
End If
Application.EnableEvents = False
[e10].Value = rng(, [e6] + 2).Value

End With
End If
thoat:
Application.EnableEvents = True
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

End Sub
 
Upvote 0
Các sư phụ giải thích giúp em đoạn code này với ạ
[ph]Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
1 If Target.Address = "$E$3" Then
Dim sht As Worksheet, rng As Range
3 If Len([e3]) > 8 Then Set sht = Sheet2 Else Set sht = Sheet3
With sht
5 Set rng = .Range(.[B7], .Cells(.Rows.Count, "B").End(3)).Find([E4], , xlValues, xlWhole, , , True)
If rng Is Nothing Then
7 [e10] = 0
GoTo thoat
9 End If
Application.EnableEvents = False
11 [e10].Value = rng(, [e6] + 2).Value
End With
13 End If
thoat: Application.EnableEvents = True
End Sub[/php]
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!
 
Upvote 0
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
Status
Không mở trả lời sau này.
Web KT
Back
Top Bottom