Chuyên đề giải đáp những thắc mắc về code VBA (4 người xem)

Liên hệ QC

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

maytinhvp01

Thành viên thường trực
Tham gia
27/7/13
Bài viết
390
Được thích
179
Mình muốn nhờ giải thich câu lệnh " If Ran.Cells(d, c) > max Then max = Ran.Cells(d, c) "
trong ví du:
Public Function LonNhat(Ran As Range)
Dim max As Double, v As Integer, d As Integer, c As Integer
max = Ran.Cells(1, 1)
For d = 1 To Ran.Rows.Count
For c = 1 To Ran.Columns.Count
If Ran.Cells(d, c) > max Then max = Ran.Cells(d, c)
Next c
Next d
v = Tim(max, Ran)
LonNhat = max
End Function
-------------------------------------------------------
[INFO1]Thông báo:
Vì topic này:
http://www.giaiphapexcel.com/forum/...ải-thích-các-code-đề-nghị-các-bạn-gửi-vào-đây
đã quá dài nên BQT đóng lại.
Nay tôi mở topic mới với cùng chủ đề: GIẢI THÍCH NHỮNG THẮC MẮC VỀ CODE
Các bạn nếu có nhu cầu giải thích code, vui lòng post tại đây nhé
NDU96081631

[/INFO1]
 
Chỉnh sửa lần cuối bởi điều hành viên:
Cảm ơn mọi người OT đã xử lý được rồi ạ, mặc dù nó hơi dài ạ:

Dùng câu lệnh "INSERT INTO..." nó còn liên quan đến kiểu dữ liệu được qui định của từng cột trong Table nữa nhé. Ví dụ: kiểu Text phải để trong dấu ngoặc đơn, kiểu số không cần, kiểu Date thì dấu #..# (cho table Access)... Chú ý vụ này.
 
Upvote 0
PHP:
Option Explicit

Sub Test()
    Const prefix = "INSERT INTO TABLE_NAME  ("
    Dim sh As Worksheet, arr As Variant, s As String
    Dim i As Long, ub As Long
    Set sh = ThisWorkbook.Worksheets("DL")
    Dim dong1 As String, res As Variant
    
    arr = sh.Range("D1").Resize(6, 5).Value2
    'dong 1
    dong1 = join_by_row(arr, 1) & ") VALUES "
    ub = UBound(arr, 1)
    ReDim res(2 To ub)
    'khuc duoi
    For i = 2 To UBound(arr, 1)
        res(i) = "(" & join_by_row(arr, i) & ")"
    Next i
    s = prefix & dong1 & Join(res, ",")
    MsgBox s
End Sub

Private Function join_by_row(ByVal data_ As Variant, ByVal irow_ As Long, _
                             Optional ByVal sdeli As String = ",")
    'noi cac phan tu cua data_ trong dong irow_, boi dau phay
    'data_: mang du lieu
    'irow_: dong can xet
    Dim ub As Long, i As Long, res As Variant
    ub = UBound(data_, 2)
    ReDim res(1 To ub)
    For i = 1 To ub
        res(i) = data_(irow_, i)
    Next i
    join_by_row = Join(res, sdeli)
    Erase res
End Function
 
Upvote 0
Dùng câu lệnh "INSERT INTO..." nó còn liên quan đến kiểu dữ liệu được qui định của từng cột trong Table nữa nhé. Ví dụ: kiểu Text phải để trong dấu ngoặc đơn, kiểu số không cần, kiểu Date thì dấu #..# (cho table Access)... Chú ý vụ này.
Xin chào anh ongke0711,
Cảm ơn Anh đã chỉ dẫn ạ ,
OT đã hiểu thêm được một chút về CSDL nghĩa là trước khi ghi dữ liệu vào thì cần phải kiểm tra data_type của từng trường sau đó sẽ gán giá trị tùy thuộc và từng kiểu trường đó ạ.

PHP:
Option Explicit

Sub Test()
    Const prefix = "INSERT INTO TABLE_NAME  ("
    Dim sh As Worksheet, arr As Variant, s As String
    Dim i As Long, ub As Long
    Set sh = ThisWorkbook.Worksheets("DL")
    Dim dong1 As String, res As Variant
   
    arr = sh.Range("D1").Resize(6, 5).Value2
    'dong 1
    dong1 = join_by_row(arr, 1) & ") VALUES "
    ub = UBound(arr, 1)
    ReDim res(2 To ub)
    'khuc duoi
    For i = 2 To UBound(arr, 1)
        res(i) = "(" & join_by_row(arr, i) & ")"
    Next i
    s = prefix & dong1 & Join(res, ",")
    MsgBox s
End Sub

Private Function join_by_row(ByVal data_ As Variant, ByVal irow_ As Long, _
                             Optional ByVal sdeli As String = ",")
    'noi cac phan tu cua data_ trong dong irow_, boi dau phay
    'data_: mang du lieu
    'irow_: dong can xet
    Dim ub As Long, i As Long, res As Variant
    ub = UBound(data_, 2)
    ReDim res(1 To ub)
    For i = 1 To ub
        res(i) = data_(irow_, i)
    Next i
    join_by_row = Join(res, sdeli)
    Erase res
End Function

Xin chào befaint,
Cảm ơn Bạn rất nhiều.
-------
Chúc mọi người vui khỏe.
OT
Bài đã được tự động gộp:

Dùng câu lệnh "INSERT INTO..." nó còn liên quan đến kiểu dữ liệu được qui định của từng cột trong Table nữa nhé. Ví dụ: kiểu Text phải để trong dấu ngoặc đơn, kiểu số không cần, kiểu Date thì dấu #..# (cho table Access)... Chú ý vụ này.

Xin chào Anh ongke0711,
Nhờ anh chỉ dâ thêm có phải SQL chỉ cho phép "INSERT INTO ..." 1000 dòng 1 lúc được thôi phải không phải không ạ?
OT thử thì vượt quá hệ thống không cho phép báo lỗi, và xóa <=1000 thì OK ạ.
Cảm ơn Anh ạ.
 
Lần chỉnh sửa cuối:
Upvote 0
Nhờ anh chỉ dâ thêm có phải SQL chỉ cho phép "INSERT INTO ..." 1000 dòng 1 lúc được thôi phải không phải không ạ?
OT thử thì vượt quá hệ thống không cho phép báo lỗi, và xóa <=1000 thì OK ạ.

Theo code trên thì em đang dùng kiểu Insert mới có từ SQL Sv 2008 trở lên: dùng Table Value và cách này bị giới hạn 1.000 dòng là đúng rồi.
Anh chưa dùng cách này nhưng em biến tấu nó chút:

Mã:
INSERT INTO TABLE_NAME (Col1,Col2,Col3,Col4,Col5)
SELECT Col1_data1,Col2_data1,Col3_data1,Col4_data1,Col5_data1
UNION ALL SELECT Col1_data2,Col2_data2,Col3_data2,Col4_data2,Col5_data2
UNION ALL SELECT Col1_data3,Col2_data3,Col3_data3,Col4_data3,Col5_data3
...

Hoặc:

Mã:
INSERT INTO TABLE_NAME (Col1,Col2,Col3,Col4,Col5)
SELECT * FROM (VALUES
(Col1_data1,Col2_data1,Col3_data1,Col4_data1,Col5_data1),
(Col1_data2,Col2_data2,Col3_data2,Col4_data2,Col5_data2),
(Col1_data3,Col2_data3,Col3_data3,Col4_data3,Col5_data3),
(..),
...
) AS TEMP (Col1,Col2,Col3,Col4,Col5);
 
Upvote 0
Em mới vào nghề đang học cơ bản về VBA
Có đoạn video dạy trên mạng. Em gõ code theo để chạy thử.
Nhưng code báo lỗi khi khai báo function.
Nhờ mọi người chỉ dạy hộ em, code bị sai chỗ nào
 

File đính kèm

Upvote 0
Em mới vào nghề đang học cơ bản về VBA
Có đoạn video dạy trên mạng. Em gõ code theo để chạy thử.
Nhưng code báo lỗi khi khai báo function.
Nhờ mọi người chỉ dạy hộ em, code bị sai chỗ nào
Theo mình thấy code bạn bị sai cú pháp, bạn chỉnh thử ở đoạn này
Mã:
demchuoiso = "co " & k & " so va co " & l & " chuoi "
 

File đính kèm

Upvote 0
Mình mới học VBA. Các bạn giải thích giúp mình đoạn Code sau sai ở đâu ?
Mã:
Public sh As String
Sub bieuTK1()
ThisWorkbook.Worksheets.Add after:=Sheets(Sheets.Count)
 Sheets(Sheets.Count).Name = "B1"
 'ThisWorkbook.VBProject.VBComponents(ThisWorkbook.Worksheets("B1").CodeName).Name = "TK1"
Set sh1 = Sheets("B1").CodeName
sh1.Range("A2").Select
End Sub

Toàn báo lỗi ở đoạn này Set sh1 = Sheets("B1").CodeName mà mình khhông hiểu tại sao ?
 
Upvote 0
Mình mới học VBA. Các bạn giải thích giúp mình đoạn Code sau sai ở đâu ?
Mã:
Public sh As String
Sub bieuTK1()
ThisWorkbook.Worksheets.Add after:=Sheets(Sheets.Count)
Sheets(Sheets.Count).Name = "B1"
'ThisWorkbook.VBProject.VBComponents(ThisWorkbook.Worksheets("B1").CodeName).Name = "TK1"
Set sh1 = Sheets("B1").CodeName
sh1.Range("A2").Select
End Sub
Toàn báo lỗi ở đoạn này Set sh1 = Sheets("B1").CodeName mà mình khhông hiểu tại sao ?
Sh1 là tham biến & tệ là bạn chưa khai báo kiểu dữ liệu cho nó; Nhưng bạn buộc máy phải hiểu đó là biến đối tượng.
Vậy bạn xem vế thứ 2 của biểu thức 'gán' đó có kiểu dữ liệu là gì chưa?
 
Upvote 0
Sheets("B1").CodeName là 1 giá trị chuỗi (code name của 1 sheet). Set dùng để gán giá trị đối tượng cho 1 biến. Thế là lỗi Type MisMatch
 
Upvote 0
Mình phải sửa như nào, Sheet(“B1”).CodeName mình vẫn phải khai biến sao. Biến sh1 mình đã khai báo là Public as string không đúng sao bạn. Mình phải sửa thế nào mong các anh chị thầy cô diễn đàn sửa giúp
 
Upvote 0
Khai báo As String là kiểu chuỗi, không gán đối tượng worksheet được.
Khai báo worksheet thì được, nhưng không gán chuỗi vào được
Với code bài 1 thì chỉ cần bỏ .CodeName ra:

Mã:
Set sh1 = Sheets("B1")
 
Upvote 0
Set là lệnh gán địa chỉ của đối tượng cho một biến đối tượng.
(nếu bạn không hiểu câu trên thì nên chịu khó bỏ thời giờ học về biến, kiểu biến, đối tượng và lệnh let/set)

Trong code của bạn, cần sửa:
Set sh1 = Sheets("B1").CodeName
sh1.Range("A2").Select
thành:
sh1 = Sheets("B1").CodeName ' sh1 bây giờ là kiểu chuỗi chứ không phải kiểu đối tượng
For Each sh In Sheets
If sh.CodeName = sh1 Then sh.Range("A2").Select ' sh1 là khoá để lọc ra cái sheet có tên CodeName
Next Sh

Chú:
VBA có hai hạng biến (ở đây nói hạng chứ không phải loại): hạng đơn giản và hạng phức tạp.
Lệnh gán trong VBA chia ra thành Let cho hạng đơn giản và Set cho hạng phức tạp.
Về sau này, VBA tự đơn giản bằng cách hiểu ngầm "Let". Vì vậy, lệnh gán hạng đơn giản khogn cần phải có từ khoá Let
Let A = B bây giờ viết là A = B (giá trị của B được cóp qua A)
Tuy nhiên, lệnh gán hạng phức tạp vẫn không được đơn giản hoá. Vẫn phải dùng Set.
Lênh Set có nghĩa là cóp địa chỉ của đối tượng, không phải trị của đối tượng.
Set A = B có nghĩa là A và B sẽ cùng chỉ vào chung một đối tượng.
 
Lần chỉnh sửa cuối:
Upvote 0
Anh/chị có thể viết cho em 1 module insert thêm dòng từ sheet dữ liệu ban đầu sau khi chạy thì ra kết quả như sheet kết quả mong muốn của em không ạ. Em cảm ơn rất nhiều.
 

File đính kèm

Upvote 0
Mình có file code VBA như file đính kèm.
Mục đích file này, giúp công nhân giảm thiểu thời gian gõ bàn phím (ví dụ : trong file đã thiết lập nút bấm KEYSET, để công nhân nhập 53.8 vào excel, thay vì phải gõ 53.8, chỉ cần gõ 7 là tự động nhập 53.8 vào cell).

Tuy nhiên, mình đang mới học cơ bản về VBA. Mình vẫn chưa hiểu được thuật toán trong code. Nhờ các bác chỉ dạy giúp em các điểm dưới đây :
1. Sub TIMDEY() có tác dụng gì
2. Userform Macro1 (nút bấm START). Trong code UserForm1.Show, theo em hiểu khi ấn START, thì nó sẽ hiện userform1 lên thôi. Tại sao, ấn nút START này, nó lại liên kết chạy được cả code Sub WR(). Từ đó dẫn đến mình có thể thao tác gõ phím tắt thông qua Keyset
3. Code Sheet2.Cells(J, I).Value = KEYDAT(KEYINDX)
Em tìm trên mạng, hay thư viện đều không tìm thấy hướng dẫn về KEYDAT. Các bác chỉ em cách dùng KEYDAT, hoặc link có nói về nó. Trong code của file, cũng không thấy có code nào liên kết với keyset. Tại sao KEYSET lại hoạt động được.

Sorry bài viết em có gì khó hiểu mong các bác phản hồi.

Thanks
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
1. Tìm hiểu về DoEvents => chủ yếu của cái sub đó.
2. Khi UserForm1.Show thì nó gọi tiếp KEYDAT(I) => bấm chuột phải lên form =>view code
3. KEYDAT (I) => người ta định nghĩa ngay đầu module đấy, tìm trên mạng sa ra được.
 
Upvote 0

File đính kèm

Upvote 0
Các bạn cho hỏi code dưới có thể rút gọn được không?
PHP:
Sub ThayThe()
    Selection.Replace What:="x", Replacement:="a", LookAt:=xlWhole, _
        SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
        ReplaceFormat:=False
    Selection.Replace What:="x.1", Replacement:="a", LookAt:=xlWhole, _
        SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
        ReplaceFormat:=False
    Selection.Replace What:="n", Replacement:="a", LookAt:=xlWhole, _
        SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
        ReplaceFormat:=False
End Sub
xin cảm ơn!
 
Upvote 0
Mã:
Sub ThayThe()
For Each s In Array("x", "x.1", "n")   
    Selection.Replace What:=s, Replacement:="a", LookAt:=xlWhole, _
        SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
        ReplaceFormat:=False
Next
End Sub
 
Upvote 0
Code này chạy bình thường, do record nên muốn biết cách rút gọn thôi
Tôi hỏi là vì ở trường hợp này cách rút gọn không quan trọng bằng cách triển khai. Học code theo tôn chỉ "rút gọn, chạy nhanh" là học sai đường.

Rút gọn: xem rõ cách rút ở bài #2588, chỉ rút ngắn được vài dòng. Nếu chỉ dùng 1 vài lần thì không xứng đáng bỏ công sửa code.
(nếu xét vấn đề chạy nhanh thì code "gọn hơn" có thể chạy chậm hơn vài phần tỷ giây; vì nó phải sử lý vòng lặp và dùng biến thay vì hằng)

Nhưng tôi không hề chê code ở bài #2588, chính vì lý do tôi đặt nặng "cách triển khai":

Triển khai: (lưu ý lại từ "chỉ dùng 1 vài lần" ở trên) bạn triển khai là vì bạn muốn dùng nhiều lần, và dùng cho nhu cầu tổng quát hơn một chút. Và code "rút gọn" ở bài #2588 không chỉ bớt số dòng code cho bạn. Nó tạo cơ hội cho code có thể triển khai để Find/Replace nhiều hơn. Nếu bạn vẫn còn chưa hiểu tôi nói gì thì bạn hỏi tác giả bài ấy chỉ dẫn thêm cho bạn cách đặt tham số cho hàm.
 
Upvote 0
Chào các bạn!
Hiện nay mình muốn code xã Filter cho 1 số sheet được chọn bất kỳ (các sheet này có thể có filter hoặc toàn bộ không có filter)
Code xã filter cho 1 sheet hoặc cho toàn bộ các sheet trong 1 file thì mình làm được nhưng code xã filter cho 1 số sheet được chọn bất kỳ thì mình chưa làm được
Mong các bạn hướng dẫn. Xin cảm ơn các bạn!
 
Upvote 0
Chào các bạn!
Hiện nay mình muốn code xã Filter cho 1 số sheet được chọn bất kỳ (các sheet này có thể có filter hoặc toàn bộ không có filter)
Code xã filter cho 1 sheet hoặc cho toàn bộ các sheet trong 1 file thì mình làm được nhưng code xã filter cho 1 số sheet được chọn bất kỳ thì mình chưa làm được
Mong các bạn hướng dẫn. Xin cảm ơn các bạn!
Bạn dùng code sau để duyệt các sheet được chọn.
Mã:
For Each Sh In ActiveWindow.SelectedSheets
    '...
Next
 
Upvote 0
Bạn dùng code sau để duyệt các sheet được chọn.
Mã:
For Each Sh In ActiveWindow.SelectedSheets
    '...
Next
Cảm ơn bạn, bài toán xã filter tôi đã làm được
Từ bài trên tôi muốn Unhide các cột của các sheet đã chọn, Unhide các cột từ cột I đến đến cột T (có thể 1 hay toàn bộ các sheet đã chọn có unhide cột hoặc không unhide cột, lưu ý không unhide các cột khác)
Tuy nhiên code dưới của tôi nó chỉ unhide 1 sheet (sheet chọn đầu tiên)
Mong các bạn chỉnh sửa giúp. Xin cảm ơn!
PHP:
Sub ShowUnhide()    ' Unhide cac sheet da chon
    Dim wks As Worksheet
    For Each wks In ActiveWindow.SelectedSheets
        Columns("I:T").Select
        Selection.EntireColumn.Hidden = False
        [I4].Select
    Next
End Sub
 
Upvote 0
Code trong vòng lặp For chỉ cần vầy
Mã:
wks.Columns("I:T").Hidden = False
 
Upvote 0
Các bạn cho tôi hỏi, tôi có code
Mã:
Sheets("Báo cáo").Select
        Range("C1").Select
sau đó tôi sửa thành

Mã:
Sheets("Báo cáo").Range("C1").Select
Thì bị báo lỗi, cho hỏi lý do. Xin cảm ơn!
 
Upvote 0
Lý do: Không được chọn (.Select) range trên sheet không phải sheet hiện hành. Viết vầy thì được.
Mã:
Application.Goto Sheets("Báo cáo").Range("C1")
 
Upvote 0
Em có hai thủ tục sử dụng chung một đoạn code giống hệt nhau, ở thủ tục thứ 2 em sử dụng lệnh Call để gọi thủ tục 1 cho đỡ phải viết lại, nhưng không biết tại sao lệnh Call không hoạt động, VBA báo lỗi. Ai giải thích giúp và em phải sửa thế nào ?. Đoạn code như sau:
Mã:
Private Sub lstTenbieu_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
    Select Case uf_Nhaplieu.lstTenbieu.ListIndex
    Case 0
        MultiPage1.Value = 1
    Case 1
        MultiPage1.Value = 2
    End Select
End Sub
------------------------------------------------------------------------------------------------
Private Sub lstDS_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
    Call lstTenbieu_DblClick
End Sub
Mong thầy cô, anh chị trong diễn đàn giúp đỡ
 
Upvote 0
Em có hai thủ tục sử dụng chung một đoạn code giống hệt nhau, ở thủ tục thứ 2 em sử dụng lệnh Call để gọi thủ tục 1 cho đỡ phải viết lại, nhưng không biết tại sao lệnh Call không hoạt động, VBA báo lỗi. Ai giải thích giúp và em phải sửa thế nào ?. Đoạn code như sau:
Mã:
Private Sub lstTenbieu_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
    Select Case uf_Nhaplieu.lstTenbieu.ListIndex
    Case 0
        MultiPage1.Value = 1
    Case 1
        MultiPage1.Value = 2
    End Select
End Sub
------------------------------------------------------------------------------------------------
Private Sub lstDS_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
    Call lstTenbieu_DblClick
End Sub
Mong thầy cô, anh chị trong diễn đàn giúp đỡ
Tôi không biết bạn muốn làm thế để làm gì. Nhưng nếu muốn gọi lstTenbieu_DblClick thì hãy để ý là nó có 1 tham số kiểu Boolean.
Vậy cách gọi vd.
Mã:
Dim a As MSForms.ReturnBoolean
    lstTenbieu_DblClick a
 
Lần chỉnh sửa cuối:
Upvote 0
Em có hai thủ tục sử dụng chung một đoạn code giống hệt nhau, ở thủ tục thứ 2 em sử dụng lệnh Call để gọi thủ tục 1 cho đỡ phải viết lại, nhưng không biết tại sao lệnh Call không hoạt động, VBA báo lỗi. Ai giải thích giúp và em phải sửa thế nào ?. Đoạn code như sau:
Mã:
Private Sub lstTenbieu_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
    Select Case uf_Nhaplieu.lstTenbieu.ListIndex
    Case 0
        MultiPage1.Value = 1
    Case 1
        MultiPage1.Value = 2
    End Select
End Sub
------------------------------------------------------------------------------------------------
Private Sub lstDS_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
    Call lstTenbieu_DblClick
End Sub
Mong thầy cô, anh chị trong diễn đàn giúp đỡ
Có hỏi về "lỗi" trong code thì nên diễn tả nguyên văn cái lỗi ấy.
Hàm lstTenbieu_DblClick được khai báo là cần một tham số. Gọi nó mà không cho nó tham số thì nó dẫy nẩy lên.
 
Upvote 0
Em có hai thủ tục sử dụng chung một đoạn code giống hệt nhau, ở thủ tục thứ 2 em sử dụng lệnh Call để gọi thủ tục 1 cho đỡ phải viết lại, nhưng không biết tại sao lệnh Call không hoạt động, VBA báo lỗi. Ai giải thích giúp và em phải sửa thế nào ?. Đoạn code như sau:
Mã:
Private Sub lstTenbieu_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
    Select Case uf_Nhaplieu.lstTenbieu.ListIndex
    Case 0
        MultiPage1.Value = 1
    Case 1
        MultiPage1.Value = 2
    End Select
End Sub
------------------------------------------------------------------------------------------------
Private Sub lstDS_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
    Call lstTenbieu_DblClick
End Sub
Mong thầy cô, anh chị trong diễn đàn giúp đỡ

Bạn khai báo Public cho cái Sub đó rồi gọi thử xem.
 
Upvote 0
Học vba vất vả quá, như học tiếng anh vậy. Thầy cô có thể cho em biết nguyên tắc để sử dụng lệnh Call được không ạ.
 
Upvote 0
Dùng dây buộc lại xem nó còn có sức dẫy lẩy lên không bác nhỉ.
Bài đã được tự động gộp:

sub Ahihi()

Select Case uf_Nhaplieu.lstTenbieu.ListIndex
Case 0
MultiPage1.Value = 1
Case 1
MultiPage1.Value = 2
End Select

end sub

Có thể nhét phần code chung vào một sub , rồi "call" nó từ hai thủ tục sự kiện còn lại.
 
Upvote 0
Học vba vất vả quá, như học tiếng anh vậy. Thầy cô có thể cho em biết nguyên tắc để sử dụng lệnh Call được không ạ.
Nếu cứ muốn dùng, hoặc nếu ai dí súng vào đầu bắt dùng Call thì
Mã:
Dim a As MSForms.ReturnBoolean
    Call TextBox1_DblClick(a)
So sánh 2 cách gọi của tôi và chịu khó tư duy thì thấy chỗ khác nhau thôi.
 
Upvote 0
Nhiều khi lười mà hay bỏ qua cái call, tức là dùng cách 1, bác "Rơi" cho cháu hỏi có sự khác biệt hay cần lưu ý gì về hai cách viết này không?
Từ khóa Call không bắt buộc. Tức có thể bỏ Call, nhưng lúc đó sẽ có chút khác biệt về cú pháp:
1. Nếu hichic có tham số thì khi dùng Call phải cho các tham số vào trong cặp ngoặc (). Khi không dùng Call thì không được phép dùng cặp ngoặc.
2. Giả sử ta có hàm hichic trả về kết quả:
2.1. Nếu ta không quan tâm tới kết quả thì Call hichic(...) hay hichic ... đều được.
2.2. Nếu ta cần kết quả mà hichic trả về thì phải là a = hichic(...). Không có kiểu a = Call hichic(...) hay Call a = hichic(...).
Tóm lại nếu cần giá trị trả về bởi hàm, vd. hàm người dùng, thì không thể dùng Call được.

Người hỏi kêu khó. Mấu chốt là VBA có quyển help hơi bị to nhưng nhiều người không chịu đọc rồi cứ kêu là học khó.
 
Upvote 0
Bạn khai báo Public cho cái Sub đó rồi gọi thử xem.
Em đã thử nhưng ko được
Bài đã được tự động gộp:

Từ khóa Call không bắt buộc. Tức có thể bỏ Call, nhưng lúc đó sẽ có chút khác biệt về cú pháp:
1. Nếu hichic có tham số thì khi dùng Call phải cho các tham số vào trong cặp ngoặc (). Khi không dùng Call thì không được phép dùng cặp ngoặc.
2. Giả sử ta có hàm hichic trả về kết quả:
2.1. Nếu ta không quan tâm tới kết quả thì Call hichic(...) hay hichic ... đều được.
2.2. Nếu ta cần kết quả mà hichic trả về thì phải là a = hichic(...). Không có kiểu a = Call hichic(...) hay Call a = hichic(...).
Tóm lại nếu cần giá trị trả về bởi hàm, vd. hàm người dùng, thì không thể dùng Call được.

Người hỏi kêu khó. Mấu chốt là VBA có quyển help hơi bị to nhưng nhiều người không chịu đọc rồi cứ kêu là học khó.
Dạ help toàn tiếng anh, em chỉ thạo tiếng việt thôi ạ. Tiếng anh em có nhìn rõ, nghe rõ nhưng ko hiểu hichic
 
Upvote 0
Tiếng Anh tôi đọc được. Tiếng Việt tôi đọc được. Chỉ tiếng Việt viết tắt là làm tôi bối rối.

Lập trình và chát chít là hai cơ sở khác nhau. Hấu hết người chuyên lập trình rất kỵ đọc ngôn ngữ chát chít.
 
Upvote 0
Tiếng Anh tôi đọc được. Tiếng Việt tôi đọc được. Chỉ tiếng Việt viết tắt là làm tôi bối rối.

Lập trình và chát chít là hai cơ sở khác nhau. Hấu hết người chuyên lập trình rất kỵ đọc ngôn ngữ chát chít.
Không so sánh được. Tiếng Việt viết tắt mà bác, tức con người, còn không hiểu thì máy, tức gú gồ, làm sao hiểu được. Nhưng tiếng Anh không hiểu thì có gú gồ. Chỉ cần gú gồ dịch được 50%, còn lại là đoán dựa vào ngữ cảnh. Một bên là bó tay toàn tập, còn bên kia là lười. So sánh làm sao được. Trình độ tiếng Anh của tôi ở mức "luôn cầm từ điển trong tay" nhưng tôi không bao giờ kêu ca là không hiểu.
 
Upvote 0
Không so sánh được. Tiếng Việt viết tắt mà bác, tức con người, còn không hiểu thì máy, tức gú gồ, làm sao hiểu được. Nhưng tiếng Anh không hiểu thì có gú gồ. Chỉ cần gú gồ dịch được 50%, còn lại là đoán dựa vào ngữ cảnh. Một bên là bó tay toàn tập, còn bên kia là lười. So sánh làm sao được. Trình độ tiếng Anh của tôi ở mức "luôn cầm từ điển trong tay" nhưng tôi không bao giờ kêu ca là không hiểu.
Nhiều người Việt tự có cách viết tắt cho tiếng Anh luôn cả bác ơi.
Điển hình: rum, com, down, up,...
 
Upvote 0
Nhiều người Việt tự có cách viết tắt cho tiếng Anh luôn cả bác ơi.
Điển hình: rum, com, down, up,...
Ý tôi khác. Bác đọc bài mà người ta viết tắt thì dĩ nhiên là bác không hiểu. Tôi có thể cảm thông cho bác. Vì lúc đó thì gú gồ hay cha của gú gồ cũng bó tay. Nhưng ai kêu là help toàn tiếng Anh nên không hiểu thì tôi không thông cảm được. Vì trong help người ta không viết tắt. Vậy thì cứ gú gồ thôi.
 
Upvote 0
Thầy cô cho em hỏi cách viết code đường dẫn đầy đủ cho một workbook mà dùng codename là thế nào ? Ví dụ em làm việc với nhiều workbook em muốn userform chỉ truyền dữ liệu tới workbook chứa code thì phải viết code làm sao? Em đã thử như sau: sheet chứa dữ liệu có tên DL1(TK1) trong đó DL1 là codename, em viết thisworkbook.sheets(“TK1”).range(“...”) thì code chạy; nhưng nếu viết thisworkbook.DL1.range(“...”) thì code báo lỗi ? Mong thầy cô giúp đỡ.
 
Upvote 0
Thầy cô cho em hỏi cách viết code đường dẫn đầy đủ cho một workbook mà dùng codename là thế nào ? Ví dụ em làm việc với nhiều workbook em muốn userform chỉ truyền dữ liệu tới workbook chứa code thì phải viết code làm sao? Em đã thử như sau: sheet chứa dữ liệu có tên DL1(TK1) trong đó DL1 là codename, em viết thisworkbook.sheets(“TK1”).range(“...”) thì code chạy; nhưng nếu viết thisworkbook.DL1.range(“...”) thì code báo lỗi ? Mong thầy cô giúp đỡ.
Khi khai báo DL1, bạn đã phải khai đường dẫn tới sheet rồi, VD: Set DL1 = ThisWorkbook.Sheets("XYZ") hoặc Workbooks("ABC").Sheets("XYZ"). Giờ chồng thêm 1 lần thisworkbook nữa thì bị lỗi là phải rồi.
 
Upvote 0
Nhờ thầy cô trong diễn đàn chuyển giúp đoạn code sau thành hàm (Function) để có thể sử dụng cho nhiều textbox. TxtNgayQD là TextBox nằm trong UserForm có tên uf_Nhaplieu.
Mã:
Me.txtNgayQD.Text = Replace(Me.txtNgayQD.Text, ".", "/")
If Len(Me.txtNgayQD.Text) = 8 Then
    Me.txtNgayQD.Text = Left(Me.txtNgayQD.Text, 2) & "/" & Mid(Me.txtNgayQD.Text, 3, 2) & "/" & Right(Me.txtNgayQD.Text, 4)
ElseIf Len(Me.txtNgayQD.Text) = 7 Then
    Me.txtNgayQD.Text = Left(Me.txtNgayQD.Text, 2) & "/" & Mid(Me.txtNgayQD.Text, 3, 1) & "/" & Right(Me.txtNgayQD.Text, 4)
ElseIf Len(Me.txtNgayQD.Text) = 6 Then
    Me.txtNgayQD.Text = Left(Me.txtNgayQD.Text, 1) & "/" & Mid(Me.txtNgayQD.Text, 2, 1) & "/" & Right(Me.txtNgayQD.Text, 4)
End If
Me.txtNgayQD.Text = Replace(Me.txtNgayQD.Text, "//", "/")
Em cảm ơn nhiều. Em đã thử theo cách này nhưng Code báo lỗi Type Mismatch
Mã:
Function DinhDangTime (DNgay as TextBox)
With uf_Nhaplieu
DNgay.Text = Replace(DNgay.Text, ".", "/")

If Len(DNgay.Text) = 8 Then

    DNgay.Text = Left(DNgay.Text, 2) & "/" & Mid(DNgay.Text, 3, 2) & "/" & Right(DNgay.Text, 4)

ElseIf Len(DNgay.Text) = 7 Then

    DNgay.Text = Left(DNgay.Text, 2) & "/" & Mid(DNgay.Text, 3, 1) & "/" & Right(DNgay.Text, 4)

ElseIf Len(DNgay.Text) = 6 Then

    DNgay.Text = Left(DNgay.Text, 1) & "/" & Mid(DNgay.Text, 2, 1) & "/" & Right(DNgay.Text, 4)

End If

DNgay.Text = Replace(DNgay.Text, "//", "/")
End With
End Function
 
Upvote 0
Nhờ thầy cô trong diễn đàn chuyển giúp đoạn code sau thành hàm (Function) để có thể sử dụng cho nhiều textbox. TxtNgayQD là TextBox nằm trong UserForm có tên uf_Nhaplieu.
Mã:
Me.txtNgayQD.Text = Replace(Me.txtNgayQD.Text, ".", "/")
If Len(Me.txtNgayQD.Text) = 8 Then
    Me.txtNgayQD.Text = Left(Me.txtNgayQD.Text, 2) & "/" & Mid(Me.txtNgayQD.Text, 3, 2) & "/" & Right(Me.txtNgayQD.Text, 4)
ElseIf Len(Me.txtNgayQD.Text) = 7 Then
    Me.txtNgayQD.Text = Left(Me.txtNgayQD.Text, 2) & "/" & Mid(Me.txtNgayQD.Text, 3, 1) & "/" & Right(Me.txtNgayQD.Text, 4)
ElseIf Len(Me.txtNgayQD.Text) = 6 Then
    Me.txtNgayQD.Text = Left(Me.txtNgayQD.Text, 1) & "/" & Mid(Me.txtNgayQD.Text, 2, 1) & "/" & Right(Me.txtNgayQD.Text, 4)
End If
Me.txtNgayQD.Text = Replace(Me.txtNgayQD.Text, "//", "/")
Em cảm ơn nhiều. Em đã thử theo cách này nhưng Code báo lỗi Type Mismatch
Mã:
Function DinhDangTime (DNgay as TextBox)
With uf_Nhaplieu
DNgay.Text = Replace(DNgay.Text, ".", "/")

If Len(DNgay.Text) = 8 Then

    DNgay.Text = Left(DNgay.Text, 2) & "/" & Mid(DNgay.Text, 3, 2) & "/" & Right(DNgay.Text, 4)

ElseIf Len(DNgay.Text) = 7 Then

    DNgay.Text = Left(DNgay.Text, 2) & "/" & Mid(DNgay.Text, 3, 1) & "/" & Right(DNgay.Text, 4)

ElseIf Len(DNgay.Text) = 6 Then

    DNgay.Text = Left(DNgay.Text, 1) & "/" & Mid(DNgay.Text, 2, 1) & "/" & Right(DNgay.Text, 4)

End If

DNgay.Text = Replace(DNgay.Text, "//", "/")
End With
End Function
Ai giúp em với
 
Upvote 0
Nếu chỉ nói về cái bạn hỏi thì sửa thành
Mã:
Function DinhDangTime(ByVal DNgay As MSForms.TextBox)

hoặc

Function DinhDangTime(DNgay As MSForms.TextBox)
Em cảm ơn thầy. Thầy cho em hỏi thêm câu nữa, trong form em có nhiều optionbutton và checkbox, có phương pháp nào để có thể dùng vòng lặp duyệt cho từng opt và chk và điền dữ liệu vào từng cell không ?
 
Upvote 0
Capture.JPG
Các bạn, anh chỉ hộ mình chỗ này với.
Mình muốn viết 1 function TT với công thức tính toán như hình
TT(A1:A3) sẽ thực hiện phép tính "SQRT((A1^3+A2^3+A3^3)/(A1+A2+A3))"
TT(A4:A6) sẽ thực hiện phép tính "SQRT((A4^3+A5^3+A6^3)/(A4+A5+A6))"
TT(A7:A8) sẽ thực hiện phép tính "SQRT((A7^3+A8^3)/(A7+A8))"
Mày mò mãi chưa xử được. Mình xin cảm ơn trước nhé...
 
Upvote 0
Em cảm ơn thầy. Thầy cho em hỏi thêm câu nữa, trong form em có nhiều optionbutton và checkbox, có phương pháp nào để có thể dùng vòng lặp duyệt cho từng opt và chk và điền dữ liệu vào từng cell không ?
Muốn người khác giúp thì phải mô tả cụ thể, câu hỏi cụ thể, đính kèm tập tin (vấn đề của mình thì bỏ công soạn tập tin). Muốn dùng vòng lặp thì cho các tên hoặc vd. thuộc tính TAG có số thứ tự liên tiếp.
Vd. có CheckBox1, ..., CheckBox20. Lúc đó vd. trong code của UserForm:
Mã:
Dim k As Long
    For k = 1 To 20
        If Me.Controls("CheckBox" & k).Value Then MsgBox "CheckBox" & k & " duoc chon"
    Next kFor i = 1
 
Upvote 0
View attachment 240894
Các bạn, anh chỉ hộ mình chỗ này với.
Mình muốn viết 1 function TT với công thức tính toán như hình
TT(A1:A3) sẽ thực hiện phép tính "SQRT((A1^3+A2^3+A3^3)/(A1+A2+A3))"
TT(A4:A6) sẽ thực hiện phép tính "SQRT((A4^3+A5^3+A6^3)/(A4+A5+A6))"
TT(A7:A8) sẽ thực hiện phép tính "SQRT((A7^3+A8^3)/(A7+A8))"
Mày mò mãi chưa xử được. Mình xin cảm ơn trước nhé...
Thử hàm này xem
Mã:
Function test(dl As Range) As Double
Dim mang
Dim spt
Dim i, j, k
mang = dl
spt = UBound(mang)
For i = 1 To spt
    j = j + mang(i, 1)
    k = k + mang(i, 1) ^ 3
Next i
test = (k / j) ^ (1 / 2)
End Function
 
Upvote 0
Mời bạn thử: (Chậm chân rồi!)
PHP:
Function TT(Rng As Range) As Double
Dim Cls As Range
Dim J As Long, Tng1 As Double, Tng2 As Double

For J = 1 To Rng.Rows.Count
    Tng1 = Tng1 + (Rng(J).Value) ^ 3
    Tng2 = Tng2 + (Rng(J).Value)
Next J
TT = (Tng1 / Tng2) ^ (1 / 2)
End Function
 
Upvote 0
Thử hàm này xem
Mã:
Function test(dl As Range) As Double
Dim mang
Dim spt
Dim i, j, k
mang = dl
spt = UBound(mang)
For i = 1 To spt
    j = j + mang(i, 1)
    k = k + mang(i, 1) ^ 3
Next i
test = (k / j) ^ (1 / 2)
End Function
Cảm ơn anh, ok rồi anh ạ....
Bài đã được tự động gộp:

Mời bạn thử: (Chậm chân rồi!)
PHP:
Function TT(Rng As Range) As Double
Dim Cls As Range
Dim J As Long, Tng1 As Double, Tng2 As Double

For J = 1 To Rng.Rows.Count
    Tng1 = Tng1 + (Rng(J).Value) ^ 3
    Tng2 = Tng2 + (Rng(J).Value)
Next J
TT = (Tng1 / Tng2) ^ (1 / 2)
End Function
Cảm ơn anh nhé, ok rồi anh ạ
 
Upvote 0
Cảm ơn anh, tối em test ạ
Bài đã được tự động gộp:


Cảm ơn anh nhé, để em test luôn
Test luôn nè:
Mã:
Function TT(rg As Range) As Double
Dim cl As Range
Dim LT As Double, Tg As Double
For Each cl In rg
    LT = LT + cl ^ 3
    Tg = Tg + cl
Next
    TT = Sqr(LT / Tg)
End Function
 
Lần chỉnh sửa cuối:
Upvote 0
Em muốn sử dụng hàm Trim để loại bỏ những khoảng trắng mà sao em viết như thế này code không chạy, cũng không báo lỗi.
Mã:
Private Sub txtHoten_AfterUpdate()
    Application.WorksheetFunction.Trim (txtHoten.Text)
End Sub
Em phải viết như nào cho đúng ?
 
Upvote 0
Em muốn sử dụng hàm Trim để loại bỏ những khoảng trắng mà sao em viết như thế này code không chạy, cũng không báo lỗi.
Mã:
Private Sub txtHoten_AfterUpdate()
    Application.WorksheetFunction.Trim (txtHoten.Text)
End Sub
Em phải viết như nào cho đúng ?
À mình làm được rồi, phải viết như này
Mã:
Function XoaKT(ByVal txt As MSForms.TextBox)
    With Application.WorksheetFunction
        txt = .Trim(.Proper(txt))
    End With
End Function
 
Upvote 0
À mình làm được rồi, phải viết như này
Mã:
Function XoaKT(ByVal txt As MSForms.TextBox)
    With Application.WorksheetFunction
        txt = .Trim(.Proper(txt))
    End With
End Function
Nên về học kỹ lại lý thuyết về controls và đối tượng trước khi nghĩ đến những chuyện màu mè thế này.
Cũng nên tìm hiểu thêm về khác biệt giữa Sub và Function.
 
Upvote 0
Mã:
Private Sub chkList_Change()
    If uf_Nhaplieu.MultiPage1.Value = 0 And uf_Nhaplieu.chkList.Value = True Then
        Me.lstTenbieu.ListIndex = -1
        Me.lstDS.RowSource = ""
    Elseif uf_Nhaplieu.MultiPage1.Value = 0 And uf_Nhaplieu.lstTenbieu.ListIndex >= 0 then
        uf_Nhaplieu.chkList.Value = False
    End If
End Sub
Giúp em với, sub trên em viết sai chỗ nào mà chỉ chạy được điều kiện If đến phần Elseif thì sub không chạy; em phải sửa lại như thế nào ?
 
Upvote 0
Mã:
Private Sub chkList_Change()
    If uf_Nhaplieu.MultiPage1.Value = 0 And uf_Nhaplieu.chkList.Value = True Then
        Me.lstTenbieu.ListIndex = -1
        Me.lstDS.RowSource = ""
    Elseif uf_Nhaplieu.MultiPage1.Value = 0 And uf_Nhaplieu.lstTenbieu.ListIndex >= 0 then
        uf_Nhaplieu.chkList.Value = False
    End If
End Sub
Giúp em với, sub trên em viết sai chỗ nào mà chỉ chạy được điều kiện If đến phần Elseif thì sub không chạy; em phải sửa lại như thế nào ?
Tách 2 If độc lập với nhau
 
Upvote 0
Chào các bạn trong diễn đàn, mình muốn chuyển đoạn Code sau thành Hàm để sử dụng chung, nhưng chưa biết cách khai báo biến với đối tượng là Combobox, CheckBox và OptionButtun. Mong các cạn chỉ mình cách khai báo biến với nhé.
Mã:
Function TimtenCQ(cbo As MSForms.ComboBox)
Dim i As Integer, j As Integer
Dim k As String
 
    With uf_Nhaplieu.cbo
        .DropDown
        i = Application.WorksheetFunction.CountA(ThisWorkbook.Sheets("CQ").Range("I:I"))
        k = "*" & UCase(.Text) & "*"
        .List = ThisWorkbook.Sheets("CQ").Range("I1:I" & i).Value
         
            For j = .ListCount - 1 To 1 Step -1
            If Not UCase(.List(j)) Like k Then
                .RemoveItem (j)
            End If
            Next j
         
    End With
End Function
Khi mình gọi tên hàm trên thì code báo lỗi "Method of data member not found" (ở dòng này With uf_Nhaplieu.cbo)
Với những đối tượng là Combobox, CheckBox và OptionButtun mình phải khai báo biến như thế nào nhỉ ?
 
Lần chỉnh sửa cuối:
Upvote 0
Chào các bạn trong diễn đàn, mình muốn chuyển đoạn Code sau thành Hàm để sử dụng chung, nhưng chưa biết cách khai báo biến với đối tượng là Combobox, CheckBox và OptionButtun. Mong các cạn chỉ mình cách khai báo biến với nhé.
Mã:
Function TimtenCQ(cbo As MSForms.ComboBox)
Dim i As Integer, j As Integer
Dim k As String

    With uf_Nhaplieu.cbo
        .DropDown
        i = Application.WorksheetFunction.CountA(ThisWorkbook.Sheets("CQ").Range("I:I"))
        k = "*" & UCase(.Text) & "*"
        .List = ThisWorkbook.Sheets("CQ").Range("I1:I" & i).Value
        
            For j = .ListCount - 1 To 1 Step -1
            If Not UCase(.List(j)) Like k Then
                .RemoveItem (j)
            End If
            Next j
        
    End With
End Function
Khi mình gọi tên hàm trên thì code báo lỗi "Method of data member not found" (ở dòng này With uf_Nhaplieu.cbo)
Với những đối tượng là Combobox, CheckBox và OptionButtun mình phải khai báo biến như thế nào nhỉ ?
Với control mình nghĩ bạn phải tạo trước khi sử dụng (mà thứ nào chắc cũng cùng nguyên tắc nhỉ!? )
Từ khóa google: Programmatically add ComboBox in VBA (Excel)

-----------
 
Upvote 0
Chào các bạn trong diễn đàn, mình muốn chuyển đoạn Code sau thành Hàm để sử dụng chung, nhưng chưa biết cách khai báo biến với đối tượng là Combobox, CheckBox và OptionButtun. Mong các cạn chỉ mình cách khai báo biến với nhé.
Mã:
Function TimtenCQ(cbo As MSForms.ComboBox)
Dim i As Integer, j As Integer
Dim k As String

    With uf_Nhaplieu.cbo
        .DropDown
        i = Application.WorksheetFunction.CountA(ThisWorkbook.Sheets("CQ").Range("I:I"))
        k = "*" & UCase(.Text) & "*"
        .List = ThisWorkbook.Sheets("CQ").Range("I1:I" & i).Value
        
            For j = .ListCount - 1 To 1 Step -1
            If Not UCase(.List(j)) Like k Then
                .RemoveItem (j)
            End If
            Next j
        
    End With
End Function
Khi mình gọi tên hàm trên thì code báo lỗi "Method of data member not found" (ở dòng này With uf_Nhaplieu.cbo)
Với những đối tượng là Combobox, CheckBox và OptionButtun mình phải khai báo biến như thế nào nhỉ ?
Muốn vẫn để gì thì cứ nêu mục đích cần đạt được sau đó có file mẫu. Còn hàm thì vẫn truyền tham số Combobox bình thường, trong code bạn viết không có chổ nào thể hiện hàm cả ngoại trừ Function và End Function.
 
Upvote 0
Những câu hỏi của bạn thực ra liên quan đến VBA rất ít. Chúng thực ra là hỏi cách sử dụng Form và Controls. Nên đem qua thớt ấy mà hỏi.
 
Upvote 0
Chào anh chị! làm thế nào để khi kết thúc 1 đoạn code con chỏ di chuyển đến dòng cuối cùng có dữ liệu ở excel
sub GPE ()
code.......

select dòng cuối cùng
end sub
 
Upvote 0
Những câu hỏi của bạn thực ra liên quan đến VBA rất ít. Chúng thực ra là hỏi cách sử dụng Form và Controls. Nên đem qua thớt ấy mà hỏi.
Cảm ơn ae trong diễn đàn, mình mới khởi đầu về VBA nên mong các bạn thông cảm. Đoạn code trên chỉ đơn giản là mình có nhiều cái ComboBox sử dụng chung một đoạn code, chỉ khác nhau về địa chỉ là ComboBox 1, ComboBox 2,... để đỡ phải viết lại đoạn code đã viết ở ComboBox 1 thì sang ComboBox 2 mình muốn gọi nó ra. Ví dụ:
Mã:
Sub TimtenCQ ()
Dim i As Integer, j As Integer
Dim k As String

    With uf_Nhaplieu.cboTenCQ1 '(chỉ khác mỗi cái tên này)
        .DropDown
        i = Application.WorksheetFunction.CountA(ThisWorkbook.Sheets("CQ").Range("I:I"))
        k = "*" & UCase(.Text) & "*"
        .List = ThisWorkbook.Sheets("CQ").Range("I1:I" & i).Value
        
            For j = .ListCount - 1 To 1 Step -1
            If Not UCase(.List(j)) Like k Then
                .RemoveItem (j)
            End If
            Next j
        
    End With
End Sub
Ở ComboBox 2 mình phải gọi Sub trên như thế nào để không phải viết lại Code mà nó có thể thay thế cboTenCQ1 thành cboTenCQ2.
 
Upvote 0
Rows(dòng cuối).Select

Code tìm dòng cuối ở đây nhiều hơn quân Nguyên, không cần nhắc lại.
---------------
Sub Dongcuoi ()
Dim Lr as Long
Lr = Range("A65000").End(xlUp).Row
Rows(Lr + 1).Select
end sub

File khác được rồi, nhưng file này lại không chuyển màn hình đến chỉ mỗi con chỏ là sao anh nhỉ
 

File đính kèm

Upvote 0
Chào các bạn trong diễn đàn, mình muốn chuyển đoạn Code sau thành Hàm để sử dụng chung, nhưng chưa biết cách khai báo biến với đối tượng là Combobox, CheckBox và OptionButtun. Mong các cạn chỉ mình cách khai báo biến với nhé.

Tại sao phải thành hàm? Sub dùng chung không được à?
 
Upvote 0
Chào các bạn trong diễn đàn, mình muốn chuyển đoạn Code sau thành Hàm để sử dụng chung, nhưng chưa biết cách khai báo biến với đối tượng là Combobox, CheckBox và OptionButtun. Mong các cạn chỉ mình cách khai báo biến với nhé.
Mã:
Function TimtenCQ(cbo As MSForms.ComboBox)
Dim i As Integer, j As Integer
Dim k As String

    With uf_Nhaplieu.cbo
        .DropDown
        i = Application.WorksheetFunction.CountA(ThisWorkbook.Sheets("CQ").Range("I:I"))
        k = "*" & UCase(.Text) & "*"
        .List = ThisWorkbook.Sheets("CQ").Range("I1:I" & i).Value
       
            For j = .ListCount - 1 To 1 Step -1
            If Not UCase(.List(j)) Like k Then
                .RemoveItem (j)
            End If
            Next j
       
    End With
End Function
Khi mình gọi tên hàm trên thì code báo lỗi "Method of data member not found" (ở dòng này With uf_Nhaplieu.cbo)
Với những đối tượng là Combobox, CheckBox và OptionButtun mình phải khai báo biến như thế nào nhỉ ?
Tôi sẽ giúp nếu có file, còn nhìn code không có dữ liệu để test nên thôi vậy.
 
Upvote 0
Cảm ơn ae trong diễn đàn, mình mới khởi đầu về VBA nên mong các bạn thông cảm. Đoạn code trên chỉ đơn giản là mình có nhiều cái ComboBox sử dụng chung một đoạn code, chỉ khác nhau về địa chỉ là ComboBox 1, ComboBox 2,... để đỡ phải viết lại đoạn code đã viết ở ComboBox 1 thì sang ComboBox 2 mình muốn gọi nó ra. Ví dụ:
Mã:
Sub TimtenCQ ()
Dim i As Integer, j As Integer
Dim k As String

    With uf_Nhaplieu.cboTenCQ1 '(chỉ khác mỗi cái tên này)
        .DropDown
        i = Application.WorksheetFunction.CountA(ThisWorkbook.Sheets("CQ").Range("I:I"))
        k = "*" & UCase(.Text) & "*"
        .List = ThisWorkbook.Sheets("CQ").Range("I1:I" & i).Value
      
            For j = .ListCount - 1 To 1 Step -1
            If Not UCase(.List(j)) Like k Then
                .RemoveItem (j)
            End If
            Next j
      
    End With
End Sub
Ở ComboBox 2 mình phải gọi Sub trên như thế nào để không phải viết lại Code mà nó có thể thay thế cboTenCQ1 thành cboTenCQ2.

Đại loại nó thế này:

Mã:
Public function CreateCbo() as ComboBox
End function

Public sub WorkWithCbo(combox as ComboBox)
End sub

'Working:
Sub dosomthing()
Dim cbox as ComboBox= CreateCbo()
call WorkWithCbo(cbox)

end sub
 
Upvote 0
Cho em hỏi! Function không hoạt động được ở sheet ạ mà phải cho sang modules mới chạy được..
Mã:
Function MacBeTong(str As String) As Long
    Dim Tmp, J As Long, i As Long, DK As Boolean, LenTex As Long, Num As Long
    DK = False
    Tmp = Split(str, " ")
    For J = 0 To UBound(Tmp)
        LenText = Len(Tmp(J))
        If LenText > 0 Then
            For i = 1 To LenText
                If IsNumeric(Mid(Tmp(J), i, 1)) Then
                    DK = True
                    Num = Num & Mid(Tmp(J), i, 1)
                End If
            Next i
            If DK = True Then
                MacBeTong = Num
                Exit Function
            End If
        End If
    Next J
    End Function
 
Upvote 0
Bạn biết cách làm chỉ mình với


Mã:
Public Sub TimtenCQ(frm As MSForms.Userform, cboName As String)
Dim i As Integer, j As Integer
Dim k As String

    With frm.Controls(cboName)
        .DropDown
        ......

Gọi Sub trong Userform:

Mã:
Private Sub ComboBox1_Change()
Call TimTenCQ(Me, Me.ComboBox1.Name)

Hoặc:

Call TimTenCQ(Me, "ComboBox1")

End Sub
 
Upvote 0
Đại loại nó thế này:

Mã:
Public function CreateCbo() as ComboBox
End function

Public sub WorkWithCbo(combox as ComboBox)
End sub

'Working:
Sub dosomthing()
Dim cbox as ComboBox= CreateCbo()
call WorkWithCbo(cbox)

end sub
Mã:
Public Sub TimtenCQ(frm As MSForms.Userform, cboName As String)
Dim i As Integer, j As Integer
Dim k As String

    With frm.Controls(cboName)
        .DropDown
        ......

Gọi Sub trong Userform:

Mã:
Private Sub ComboBox1_Change()
Call TimTenCQ(Me, Me.ComboBox1.Name)

Hoặc:

Call TimTenCQ(Me, "ComboBox1")

End Sub
cảm ơn bạn, thật tuyệt, mình làm được rồi. Với đối tượng là Checkbox hoặc OptionButtun thì phải khai như thế nào vậy bạn. Chỉ giúp mình luôn được không.
 
Upvote 0
cảm ơn bạn, thật tuyệt, mình làm được rồi. Với đối tượng là Checkbox hoặc OptionButtun thì phải khai như thế nào vậy bạn. Chỉ giúp mình luôn được không.

Thì cứ thay tên control bất kỳ nào cũng được miễn là cái Sub/ Function thực hiện các phương thức thuộc tính phù hợp với control đó thôi.
Vd: Call TimTenCQ (Me, “txtTen”)
 
Upvote 0
Thì cứ thay tên control bất kỳ nào cũng được miễn là cái Sub/ Function thực hiện các phương thức thuộc tính phù hợp với control đó thôi.
Vd: Call TimTenCQ (Me, “txtTen”)
Tìm thì phỉ trả về chứ. Đó là tại sao "hàm" mà không phải là "sub"

...
'Working:
Sub dosomthing()
deploy (sử dụng), không phải "working"

Cho em hỏi! Function không hoạt động được ở sheet ạ mà phải cho sang modules mới chạy được..
...
Bao giờ quý vị mới chịu học cách đặt câu hỏi cho rõ ràng nhỉ?

"không hoạt động được ở sheet" có nghĩa là gì? code của sheet không gọi được nó? nó là code của sheet? code nào gọi nó?

Mỗi module là một không gian ký danh (namespace) riêng. Code nằm trong module thường thì được mặc định không gian, trừ phi chúng trùng tên nhau. Code nằm trong sheet thì không được mặc định. Muốn gọi sub/function nằm trong sheet nào thì phải gọi đúng tên với tiền tố là ký danh không gian của nó. Ví dụ function abc nằm trong sheet1 thì ngoài sheet1 muón gọi nó phải gọi sheet1.abc
 
Upvote 0
Tìm thì phỉ trả về chứ. Đó là tại sao "hàm" mà không phải là "sub"


deploy (sử dụng), không phải "working"


Bao giờ quý vị mới chịu học cách đặt câu hỏi cho rõ ràng nhỉ?

"không hoạt động được ở sheet" có nghĩa là gì? code của sheet không gọi được nó? nó là code của sheet? code nào gọi nó?

Mỗi module là một không gian ký danh (namespace) riêng. Code nằm trong module thường thì được mặc định không gian, trừ phi chúng trùng tên nhau. Code nằm trong sheet thì không được mặc định. Muốn gọi sub/function nằm trong sheet nào thì phải gọi đúng tên với tiền tố là ký danh không gian của nó. Ví dụ function abc nằm trong sheet1 thì ngoài sheet1 muón gọi nó phải gọi sheet1.abc
function nằm ở sheet riêng, em chưa biết cách làm, anh vào xem dùm em với ạ
 

File đính kèm

  • Book2.xlsm
    Book2.xlsm
    80.4 KB · Đọc: 10
  • Untitled.png
    Untitled.png
    12.8 KB · Đọc: 11
Upvote 0
function nằm ở sheet riêng, em chưa biết cách làm, anh vào xem dùm em với ạ

- Thiết lập mặc định trong VBE, có thêm Option Explicit đi.
- Code xong chạy Debug xem nó có lỗi không.
- Chưa biết code chạy ổn không thì thêm ISERROR() thì làm sao biết nó lỗi gì.

Tóm lại: Sai khai báo biến LenText vs LenTex
 
Upvote 0
Chưa học đi đã lo chạy là vậy đó.
Nên tìm tài liệu học về tầm vực của biến, của các hàm và phương thức. Căn bản về modules.
 
Upvote 0
Chào các bạn. Mong các bạn giúp tôi vấn đề về lọc dữ liệu (Filter):
Trong file đính kèm tôi có bảng dữ liệu và 3 nút bấm có tên là AutoFilter 1, AutoFilter 2, AutoFilter 3. Tôi muốn khi bấm vào nút AutoFilter 1 thì ở cột B (tháng 1) toàn bộ nhân viên được xếp loại A sẽ được lọc; tương tự, nút AutoFilter 2, cột C (tháng 2) nhân viên xếp loại B được lọc; nút AutoFilter 3, cột D (tháng 3) nhân viên xếp loại C được lọc.
Tôi đã thử với đoạn code sau nhưng báo lỗi AutoFilter method of Range class failed khi bấm chuyển đổi giữa các nút (bấm nút AutoFilter1 lần 1 => code chạy; Bấm nút AutoFilter1 lần 2 => code báo lỗi; hoặc bấm AutoFilter2 => code báo lỗi).
Mong các bạn trong diễn đàn có cách nào để có thể bấm chuyển đổi qua lại giữa các nút AutoFilter mà thực hiện được tính năng Filter của excel.
Mã:
Private Sub CommandButton1_Click()
With Sheet1
    .Range("B2").AutoFilter
    .Range("B2:B17").AutoFilter Field:=2, Criteria1:="A"
End With
End Sub
-------------------------------------------------------
Private Sub CommandButton2_Click()
With Sheet1
    .Range("D2").AutoFilter
    .Range("D2").Select
    .Range("D3:D17").AutoFilter Field:=4, Criteria1:="C"
End With
End Sub
--------------------------------------------------------
Private Sub CommandButton3_Click()
With Sheet1
    .Range("C2").AutoFilter
    .Range("C2:C17").AutoFilter Field:=3, Criteria1:="B"
End With
End Sub
 

File đính kèm

Upvote 0
Tại bất kỳ một cột nào, em bắt đầu chọn từ dòng thứ 4 xuống thì bây giờ làm sao để code sẽ chọn ô thứ 2 của cột đó
Em ví dụ: Em sẽ chọn từ F4 đến xuống 1 ô bất kỳ trong cột F thì làm sao để code nhảy đến ô F2
Hoặc Em sẽ chọn từ G4 đến xuống 1 ô bất kỳ trong cột G thì làm sao để code nhảy đến ô G2
Em cảm ơn!
 
Upvote 0
Tại bất kỳ một cột nào, em bắt đầu chọn từ dòng thứ 4 xuống thì bây giờ làm sao để code sẽ chọn ô thứ 2 của cột đó
Em ví dụ: Em sẽ chọn từ F4 đến xuống 1 ô bất kỳ trong cột F thì làm sao để code nhảy đến ô F2
Hoặc Em sẽ chọn từ G4 đến xuống 1 ô bất kỳ trong cột G thì làm sao để code nhảy đến ô G2
Em cảm ơn!
Bạn thử.
Mã:
Range("G4").Offset(-2).Value
 
Upvote 0
Cảm ơn các bạn mình đã sửa nó là
Mã:
Selection.End(3).Offset(1).Select
thì OK
 
Upvote 0
Làm sao khi bấm Ctrl+F thì trong khung Find what: luôn là giá trị của ô B2 sheet Tenhang
Em ví dụ:
Nếu ô B2 sheet Tenhang là 123 thì code là
PHP:
Cells.Find(What:="123", After:=ActiveCell, LookIn:=xlFormulas, LookAt:= _
        xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False _
        , SearchFormat:=False).Activate
Nhưng nếu ô B2 sheet Tenhang là 456 thì code là
PHP:
Cells.Find(What:="456", After:=ActiveCell, LookIn:=xlFormulas, LookAt:= _
        xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False _
        , SearchFormat:=False).Activate
Vì do em thường xuyên copy ô B2 sheet Tenhang sau đó bấm Ctrl+F rồi paste vào khung Find what để tìm kiếm
Em cảm ơn!
 
Upvote 0
Bạn thử.
Mã:
Cells.Find(What:=sheets("tenhang").range("B2").value, After:=ActiveCell, LookIn:=xlFormulas, LookAt:= _

        xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False _

        , SearchFormat:=False).Activate
 
Upvote 0
Em có 1 AddIns tên là Doiso, em lưu trữ nó trong ổ đĩa D:/AddIns và em đã làm Addins, trong Doiso đó có Sub Docchuthanhso()
Bây giờ em muối gọi code (Docchuthanhso) thì gọi bằng cách nào
Ví dụ:em làm như sau
Sub Tonghop()
Call Docchuthanhso
End Sub
thì không được
vậy muốn gọi 1 sub của 1 addins thì gọi bằng cách nào? (vì em muốn lồng nhiều sub khác nhau vào 1 sub) Em cảm ơn!
 
Upvote 0
Chào các anh chị, em có viết VBA cho báo cáo của mình, em sử dụng Countifs trong VBA thay cho hàm có sẵn, không biết còn cách viết nào tối ưu hơn không ạ. Em cảm ơn.
Mã:
Sub bcthang()
i = 13
While i < 27
    With Sheet1
    .Range("C" & i).Value = WorksheetFunction.CountIfs(Sheet5.Range("F:F"), .Range("B" & i), _
Sheet5.Range("G:G"), "A91.A", Sheet5.Range("H:H"), ">=" & CLng(.Range("A7").Value), Sheet5.Range("H:H"), _
"<=" & CLng(.Range("G7").Value))
    If .Range("C" & i).Value <> 0 Then
    .Range("D" & i).Value = WorksheetFunction.CountIfs(Sheet5.Range("F:F"), .Range("B" & i), _
Sheet5.Range("G:G"), "A91.A", Sheet5.Range("H:H"), ">=" & CLng(.Range("A7").Value), Sheet5.Range("H:H"), _
"<=" & CLng(.Range("G7").Value), Sheet5.Range("L:L"), "<=15")
    .Range("E" & i).Value = WorksheetFunction.CountIfs(Sheet5.Range("F:F"), .Range("B" & i), _
Sheet5.Range("G:G"), "A91.A", Sheet5.Range("H:H"), ">=" & CLng(.Range("N1").Value), Sheet5.Range("H:H"), _
"<=" & CLng(.Range("G7").Value))
Else
    .Range("D" & i).Value = 0
    .Range("E" & i).Value = WorksheetFunction.CountIfs(Sheet5.Range("F:F"), .Range("B" & i), _
Sheet5.Range("G:G"), "A91.A", Sheet5.Range("H:H"), ">=" & CLng(.Range("N1").Value), Sheet5.Range("H:H"), _
"<=" & CLng(.Range("G7").Value))
End If
  .Range("F" & i).Value = WorksheetFunction.CountIfs(Sheet5.Range("F:F"), .Range("B" & i), _
Sheet5.Range("G:G"), "A91.C", Sheet5.Range("H:H"), ">=" & CLng(.Range("A7").Value), Sheet5.Range("H:H"), _
"<=" & CLng(.Range("G7").Value))
    If .Range("F" & i).Value <> 0 Then
    .Range("G" & i).Value = WorksheetFunction.CountIfs(Sheet5.Range("F:F"), .Range("B" & i), _
Sheet5.Range("G:G"), "A91.C", Sheet5.Range("H:H"), ">=" & CLng(.Range("A7").Value), Sheet5.Range("H:H"), _
"<=" & CLng(.Range("G7").Value), Sheet5.Range("L:L"), "<=15")
    .Range("H" & i).Value = WorksheetFunction.CountIfs(Sheet5.Range("F:F"), .Range("B" & i), _
Sheet5.Range("G:G"), "A91.C", Sheet5.Range("H:H"), ">=" & CLng(.Range("N1").Value), Sheet5.Range("H:H"), _
"<=" & CLng(.Range("G7").Value))
Else
    .Range("G" & i).Value = 0
    .Range("H" & i).Value = WorksheetFunction.CountIfs(Sheet5.Range("F:F"), .Range("B" & i), _
Sheet5.Range("G:G"), "A91.C", Sheet5.Range("H:H"), ">=" & CLng(.Range("N1").Value), Sheet5.Range("H:H"), _
"<=" & CLng(.Range("G7").Value))
End If
.Range("K" & i).Value = WorksheetFunction.CountIfs(Sheet5.Range("F:F"), .Range("B" & i), _
Sheet5.Range("G:G"), "TV", Sheet5.Range("H:H"), ">=" & CLng(.Range("A7").Value), Sheet5.Range("H:H"), _
"<=" & CLng(.Range("G7").Value))
    If .Range("K" & i).Value <> 0 Then
    .Range("L" & i).Value = WorksheetFunction.CountIfs(Sheet5.Range("F:F"), .Range("B" & i), _
Sheet5.Range("G:G"), "TV", Sheet5.Range("H:H"), ">=" & CLng(.Range("A7").Value), Sheet5.Range("H:H"), _
"<=" & CLng(.Range("G7").Value), Sheet5.Range("L:L"), "<=15")
    .Range("M" & i).Value = WorksheetFunction.CountIfs(Sheet5.Range("F:F"), Sheet4.Range("B" & i), _
Sheet5.Range("G:G"), "TV", Sheet5.Range("H:H"), ">=" & CLng(.Range("N1").Value), Sheet5.Range("H:H"), _
"<=" & CLng(.Range("G7").Value))
Else
    .Range("L" & i).Value = 0
    .Range("M" & i).Value = WorksheetFunction.CountIfs(Sheet5.Range("F:F"), .Range("B" & i), _
Sheet5.Range("G:G"), "TV", Sheet5.Range("H:H"), ">=" & CLng(.Range("N1").Value), Sheet5.Range("H:H"), _
"<=" & CLng(.Range("G7").Value))
End If
i = i + 1
End With
Wend
End Sub
 
Upvote 0
Chào các anh chị, em có viết VBA cho báo cáo của mình, em sử dụng Countifs trong VBA thay cho hàm có sẵn, không biết còn cách viết nào tối ưu hơn không ạ. Em cảm ơn.
Mã:
Sub bcthang()
i = 13
While i < 27
    With Sheet1
    .Range("C" & i).Value = WorksheetFunction.CountIfs(Sheet5.Range("F:F"), .Range("B" & i), _
Sheet5.Range("G:G"), "A91.A", Sheet5.Range("H:H"), ">=" & CLng(.Range("A7").Value), Sheet5.Range("H:H"), _
"<=" & CLng(.Range("G7").Value))
    If .Range("C" & i).Value <> 0 Then
    .Range("D" & i).Value = WorksheetFunction.CountIfs(Sheet5.Range("F:F"), .Range("B" & i), _
Sheet5.Range("G:G"), "A91.A", Sheet5.Range("H:H"), ">=" & CLng(.Range("A7").Value), Sheet5.Range("H:H"), _
"<=" & CLng(.Range("G7").Value), Sheet5.Range("L:L"), "<=15")
    .Range("E" & i).Value = WorksheetFunction.CountIfs(Sheet5.Range("F:F"), .Range("B" & i), _
Sheet5.Range("G:G"), "A91.A", Sheet5.Range("H:H"), ">=" & CLng(.Range("N1").Value), Sheet5.Range("H:H"), _
"<=" & CLng(.Range("G7").Value))
Else
    .Range("D" & i).Value = 0
    .Range("E" & i).Value = WorksheetFunction.CountIfs(Sheet5.Range("F:F"), .Range("B" & i), _
Sheet5.Range("G:G"), "A91.A", Sheet5.Range("H:H"), ">=" & CLng(.Range("N1").Value), Sheet5.Range("H:H"), _
"<=" & CLng(.Range("G7").Value))
End If
  .Range("F" & i).Value = WorksheetFunction.CountIfs(Sheet5.Range("F:F"), .Range("B" & i), _
Sheet5.Range("G:G"), "A91.C", Sheet5.Range("H:H"), ">=" & CLng(.Range("A7").Value), Sheet5.Range("H:H"), _
"<=" & CLng(.Range("G7").Value))
    If .Range("F" & i).Value <> 0 Then
    .Range("G" & i).Value = WorksheetFunction.CountIfs(Sheet5.Range("F:F"), .Range("B" & i), _
Sheet5.Range("G:G"), "A91.C", Sheet5.Range("H:H"), ">=" & CLng(.Range("A7").Value), Sheet5.Range("H:H"), _
"<=" & CLng(.Range("G7").Value), Sheet5.Range("L:L"), "<=15")
    .Range("H" & i).Value = WorksheetFunction.CountIfs(Sheet5.Range("F:F"), .Range("B" & i), _
Sheet5.Range("G:G"), "A91.C", Sheet5.Range("H:H"), ">=" & CLng(.Range("N1").Value), Sheet5.Range("H:H"), _
"<=" & CLng(.Range("G7").Value))
Else
    .Range("G" & i).Value = 0
    .Range("H" & i).Value = WorksheetFunction.CountIfs(Sheet5.Range("F:F"), .Range("B" & i), _
Sheet5.Range("G:G"), "A91.C", Sheet5.Range("H:H"), ">=" & CLng(.Range("N1").Value), Sheet5.Range("H:H"), _
"<=" & CLng(.Range("G7").Value))
End If
.Range("K" & i).Value = WorksheetFunction.CountIfs(Sheet5.Range("F:F"), .Range("B" & i), _
Sheet5.Range("G:G"), "TV", Sheet5.Range("H:H"), ">=" & CLng(.Range("A7").Value), Sheet5.Range("H:H"), _
"<=" & CLng(.Range("G7").Value))
    If .Range("K" & i).Value <> 0 Then
    .Range("L" & i).Value = WorksheetFunction.CountIfs(Sheet5.Range("F:F"), .Range("B" & i), _
Sheet5.Range("G:G"), "TV", Sheet5.Range("H:H"), ">=" & CLng(.Range("A7").Value), Sheet5.Range("H:H"), _
"<=" & CLng(.Range("G7").Value), Sheet5.Range("L:L"), "<=15")
    .Range("M" & i).Value = WorksheetFunction.CountIfs(Sheet5.Range("F:F"), Sheet4.Range("B" & i), _
Sheet5.Range("G:G"), "TV", Sheet5.Range("H:H"), ">=" & CLng(.Range("N1").Value), Sheet5.Range("H:H"), _
"<=" & CLng(.Range("G7").Value))
Else
    .Range("L" & i).Value = 0
    .Range("M" & i).Value = WorksheetFunction.CountIfs(Sheet5.Range("F:F"), .Range("B" & i), _
Sheet5.Range("G:G"), "TV", Sheet5.Range("H:H"), ">=" & CLng(.Range("N1").Value), Sheet5.Range("H:H"), _
"<=" & CLng(.Range("G7").Value))
End If
i = i + 1
End With
Wend
End Sub
Có bạn gửi file với nói rõ điều kiện.
 
Upvote 0
Các anh chị có cách nào để codeCtrlF.png báo số lượng tìm được như hình không (phần khoanh tròn màu đỏ)
Em cảm ơn
 
Upvote 0
Có bạn gửi file với nói rõ điều kiện.
Dạ báo cáo của em như sau:
- Cột số mắc Nếu chẩn đoán là A91.A hoặc A91.C hoặc tử vong (mã ICD của sốt xuất huyết) và trong khoảng thời gian từ ngày đầu tháng đến ngày cuối tháng thì sẽ đếm tất cả các xã theo điều kiện để tính ca mắc trong tháng
- Cột <= 15 là tính các ca có tuổi nhỏ hơn <= 15 tuổi
- Cột cộng dồn là số ca mắc từ đầu năm đến hiện tại.
- Các cột khác tương tự. Thay đổi chổ chẩn đoán A91.A là SXHD thường và cảnh báo, A91.C là SXHD nặng, TV là số ca tử vong.
 

File đính kèm

Upvote 0
Dạ báo cáo của em như sau:
- Cột số mắc Nếu chẩn đoán là A91.A hoặc A91.C hoặc tử vong (mã ICD của sốt xuất huyết) và trong khoảng thời gian từ ngày đầu tháng đến ngày cuối tháng thì sẽ đếm tất cả các xã theo điều kiện để tính ca mắc trong tháng
- Cột <= 15 là tính các ca có tuổi nhỏ hơn <= 15 tuổi
- Cột cộng dồn là số ca mắc từ đầu năm đến hiện tại.
- Các cột khác tương tự. Thay đổi chổ chẩn đoán A91.A là SXHD thường và cảnh báo, A91.C là SXHD nặng, TV là số ca tử vong.
Bạn thử cái này nhé.Mình làm với 3 cột đầu.Bạn tìm hiểu mà hiểu được code thì chắc cũng nghĩ được làm các cột tiếp theo nhé.
Mã:
Sub baocaothang()
    Dim i As Long, lr As Long, arr, dic As Object, dk As String, ngaybd As Long, ngaykt As Long, kq() As Long, Data, T
    Set dic = CreateObject("scripting.dictionary")
    With Sheets("danh_sach")
         lr = .Range("B" & Rows.Count).End(xlUp).Row
         If lr < 2 Then Exit Sub
         arr = .Range("B2:K" & lr).Value
    End With
        For i = 1 To UBound(arr)
          If arr(i, 6) = "A91.A" Then
            dk = arr(i, 5)
            If Not dic.exists(dk) Then
               dic.Add dk, i
            Else
               dic.Item(dk) = dic.Item(dk) & "#" & i
            End If
          End If
        Next i
    With Sheets("SXHD_Thang")
         ngaybd = .Range("A7").Value2
         ngaykt = .Range("G7").Value2
         Data = .Range("B13:B26").Value
         ReDim kq(1 To UBound(Data), 1 To 11)
         For i = 1 To UBound(Data)
             dk = Data(i, 1)
             If dic.exists(dk) Then
                For Each T In Split(dic.Item(dk), "#")
                    If CLng(arr(T, 7)) >= ngaybd And CLng(arr(T, 7)) <= ngaykt Then
                       kq(i, 1) = kq(i, 1) + 1
                          If Year(Date) - Year(arr(T, 2)) <= 15 Then
                             kq(i, 2) = kq(i, 2) + 1
                          End If
                    End If
                    If Year(arr(T, 7)) = Year(Date) And CLng(arr(T, 7)) <= ngaykt Then
                       kq(i, 3) = kq(i, 3) + 1
                    End If
                Next
             End If
          Next i
         .Range("C13:M26").Value = kq
  End With
End Sub
 
Upvote 0
Bạn thử cái này nhé.Mình làm với 3 cột đầu.Bạn tìm hiểu mà hiểu được code thì chắc cũng nghĩ được làm các cột tiếp theo nhé.
Mã:
Sub baocaothang()
    Dim i As Long, lr As Long, arr, dic As Object, dk As String, ngaybd As Long, ngaykt As Long, kq() As Long, Data, T
    Set dic = CreateObject("scripting.dictionary")
    With Sheets("danh_sach")
         lr = .Range("B" & Rows.Count).End(xlUp).Row
         If lr < 2 Then Exit Sub
         arr = .Range("B2:K" & lr).Value
    End With
        For i = 1 To UBound(arr)
          If arr(i, 6) = "A91.A" Then
            dk = arr(i, 5)
            If Not dic.exists(dk) Then
               dic.Add dk, i
            Else
               dic.Item(dk) = dic.Item(dk) & "#" & i
            End If
          End If
        Next i
    With Sheets("SXHD_Thang")
         ngaybd = .Range("A7").Value2
         ngaykt = .Range("G7").Value2
         Data = .Range("B13:B26").Value
         ReDim kq(1 To UBound(Data), 1 To 11)
         For i = 1 To UBound(Data)
             dk = Data(i, 1)
             If dic.exists(dk) Then
                For Each T In Split(dic.Item(dk), "#")
                    If CLng(arr(T, 7)) >= ngaybd And CLng(arr(T, 7)) <= ngaykt Then
                       kq(i, 1) = kq(i, 1) + 1
                          If Year(Date) - Year(arr(T, 2)) <= 15 Then
                             kq(i, 2) = kq(i, 2) + 1
                          End If
                    End If
                    If Year(arr(T, 7)) = Year(Date) And CLng(arr(T, 7)) <= ngaykt Then
                       kq(i, 3) = kq(i, 3) + 1
                    End If
                Next
             End If
          Next i
         .Range("C13:M26").Value = kq
  End With
End Sub
Dạ cảm ơn bạn rất nhiều, mình chạy được code rồi, các cột khác mình tạo ra 2 Sub thay điều kiện chẩn đoán sau đó dùng Call để khởi chạy 3 sub cùng lúc.
 
Upvote 0
Upvote 0

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

Back
Top Bottom