Hỏi đáp VBA trong chủ đề "Chập chững đến VBA"

Liên hệ QC

luongchihien

Thành viên mới
Tham gia
26/8/11
Bài viết
7
Được thích
1
Em xem đề tài và học hỏi được một tí, với yêu cầu như vậy! Trong file excel có sheet "Form" và sheet "Thong Tin KH" bây giờ em muốn nhập vào form (từ ô D4: D32, như trong file) rồi enter thì dữ liệu được nhập vào sheet "Thong Tin KH". Mong mọi người giúp đỡ
Em mò mẫn mãi mà ko ra ( em làm được cái gì là đính kèm hết trong file đó. gồm file excel và word chứa code)
Cảm ơn trước, cho những ai giúp đỡ!
 

File đính kèm

  • aa.xlsx
    35.8 KB · Đọc: 57
  • Code nhập vào Module.doc
    31.5 KB · Đọc: 70
Nó chỉ cho kết quảtại D1&D2 thôi! tại sao nhỉ, bạn giải thích giúp mình?
Cảm ơn các bạn!

Lưu ý chổ này:
Mã:
sArray = Range("A1:A" & [COLOR=#ff0000][B]Chỉ số dòng của cell cuối cùng ở cột A[/B][/COLOR])...
Có nghĩa là cái ta cần tìm là chỉ số dòng của [A65536].End(3) chứ không phải giá trị của nó
Mà chỉ số dòng của [A65536].End(3) chính là [A65536].End(3).ROW
Trong dữ liệu của bạn, do tình cờ nên giá trị tại [A65536].End(3) = 10000, cũng chính bằng chỉ số dòng của nó nên may mắn khiến cho code chạy đúng ---> Nếu sửa thành số 2 thì.. code sai. Thậm chí nếu sửa thành text nào đó (ví dụ là chữ a) thì code.. tèo luôn
Vậy code chính xác phải là:
Mã:
sArray = Range("A1:A" & [COLOR=#ff0000][B][A65536].End(3).ROW[/B][/COLOR])...
Không biết bạn có hiểu không nhỉ?
 
Lần chỉnh sửa cuối:
Upvote 0
Lưu ý chổ này:
Mã:
sArray = Range("A1:A" & [COLOR=#ff0000][B]Chỉ số dòng của cell cuối cùng ở cột A[/B][/COLOR])...
Có nghĩa là cái ta cần tìm là chỉ số dòng của [A65536].End(3) chứ không phải giá trị của nó
Mà chỉ số dòng của [A65536].End(3) chính là [A65536].End(3).ROW
Trong dữ liệu của bạn, do tình cờ nên giá trị tại [A65536].End(3) = 10000, cũng chính bằng chỉ số dòng của nó nên may mắn khiến cho code chạy đúng ---> Nếu sửa thành số 2 thì.. code sai. Thậm chí nếu sửa thành text nào đó (ví dụ là chữ a) thì code.. tèo luôn
Vậy code chính xác phải là:
Mã:
sArray = Range("A1:A" & [COLOR=#ff0000][B][A65536].End(3).ROW[/B][/COLOR])...
Không biết bạn có hiểu không nhỉ?
Cái trên là do mình bắc chước của bạn Quang hai ( bài 169) là như bên dưới
Mã:
Sub CongThuc2()
Mã:
[COLOR=#0000BB][FONT=monospace]Dim Cls [/FONT][/COLOR][COLOR=#007700][FONT=monospace]As [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]Range[/FONT][/COLOR][COLOR=#007700][FONT=monospace], [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]kq[/FONT][/COLOR][COLOR=#007700][FONT=monospace](), [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]i
 Dim StartTime [/FONT][/COLOR][COLOR=#007700][FONT=monospace]As [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]Double
StartTime [/FONT][/COLOR][COLOR=#007700][FONT=monospace]= [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]Timer
 kq [/FONT][/COLOR][COLOR=#007700][FONT=monospace]= [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]Range[/FONT][/COLOR][COLOR=#007700][FONT=monospace]([/FONT][/COLOR][COLOR=#DD0000][FONT=monospace]"A1:A" [/FONT][/COLOR][COLOR=#007700][FONT=monospace]& [[/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]A65536[/FONT][/COLOR][COLOR=#007700][FONT=monospace]].[/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]End[/FONT][/COLOR][COLOR=#007700][FONT=monospace]([/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]3[/FONT][/COLOR][COLOR=#007700][FONT=monospace])).[/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]Resize[/FONT][/COLOR][COLOR=#007700][FONT=monospace](, [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]3[/FONT][/COLOR][COLOR=#007700][FONT=monospace]).[/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]Value
   [/FONT][/COLOR][COLOR=#007700][FONT=monospace]For [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]i [/FONT][/COLOR][COLOR=#007700][FONT=monospace]= [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]1 To UBound[/FONT][/COLOR][COLOR=#007700][FONT=monospace]([/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]kq[/FONT][/COLOR][COLOR=#007700][FONT=monospace])
      If [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]kq[/FONT][/COLOR][COLOR=#007700][FONT=monospace]([/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]i[/FONT][/COLOR][COLOR=#007700][FONT=monospace], [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]1[/FONT][/COLOR][COLOR=#007700][FONT=monospace]) > [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]0 [/FONT][/COLOR][COLOR=#007700][FONT=monospace]And [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]kq[/FONT][/COLOR][COLOR=#007700][FONT=monospace]([/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]i[/FONT][/COLOR][COLOR=#007700][FONT=monospace], [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]2[/FONT][/COLOR][COLOR=#007700][FONT=monospace]) > [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]0 Then
         kq[/FONT][/COLOR][COLOR=#007700][FONT=monospace]([/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]i[/FONT][/COLOR][COLOR=#007700][FONT=monospace], [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]3[/FONT][/COLOR][COLOR=#007700][FONT=monospace]) = [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]kq[/FONT][/COLOR][COLOR=#007700][FONT=monospace]([/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]i[/FONT][/COLOR][COLOR=#007700][FONT=monospace], [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]1[/FONT][/COLOR][COLOR=#007700][FONT=monospace]) + [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]kq[/FONT][/COLOR][COLOR=#007700][FONT=monospace]([/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]i[/FONT][/COLOR][COLOR=#007700][FONT=monospace], [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]2[/FONT][/COLOR][COLOR=#007700][FONT=monospace])
      [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]End [/FONT][/COLOR][COLOR=#007700][FONT=monospace]If
   [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]Next
[/FONT][/COLOR][COLOR=#007700][FONT=monospace][[/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]A1[/FONT][/COLOR][COLOR=#007700][FONT=monospace]].[/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]Resize[/FONT][/COLOR][COLOR=#007700][FONT=monospace]([/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]i [/FONT][/COLOR][COLOR=#007700][FONT=monospace]- [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]1[/FONT][/COLOR][COLOR=#007700][FONT=monospace], [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]3[/FONT][/COLOR][COLOR=#007700][FONT=monospace]) = [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]kq
 MsgBox Format[/FONT][/COLOR][COLOR=#007700][FONT=monospace]([/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]Timer [/FONT][/COLOR][COLOR=#007700][FONT=monospace]- [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]StartTime[/FONT][/COLOR][COLOR=#007700][FONT=monospace], [/FONT][/COLOR][COLOR=#DD0000][FONT=monospace]"00.00"[/FONT][/COLOR][COLOR=#007700][FONT=monospace]) & [/FONT][/COLOR][COLOR=#DD0000][FONT=monospace]" giây."
[/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]End Sub[/FONT][/COLOR]

B
ây giờ code trên chạy theo điều kiện mới thì nó cũng tèo luôn!
Cảm ơn các bạn rất nhiều
------------
Góp ý với bạn Quanghai 1 tý, Số liệu cột A & B đã có sao lại tiếp tục gán lại 1 lần nữa nhỉ?
Đó là câu lệnh
PHP:
[A1].Resize(i - 1, 3) = kq
 
Upvote 0
Bạn giải thích thêm chỗ này
Mã:
sArray = Range("A1:B" & [A65536].End(3).Row[COLOR=#ff0000][B]s[/B][/COLOR]).Value
Mã:
sArray = Range("A1:A" & [A65536].End(3).Row).Resize(, 2).Value
1/Về cơ bản là 2 câu lệnh trên là như nhau?

2/ Cơ bản sự khác nhau của Row và Rows?
Mình cũng thấy người ta viết
Mã:
.Rows.count
Cái trên là trả về số hàng của một khối ô nào đó
Không biết có ai viết
Mã:
.Row.count
không?
Với 4 câu lệnh trên thì sử dụng ở trường hợp nào?
Nhờ các bạn giải thích? mình còn mơ hồ mấy cái Row này?
Cảm ơn các bạn
 
Upvote 0
Bạn giải thích thêm chỗ này
Mã:
sArray = Range("A1:B" & [A65536].End(3).Row[COLOR=#ff0000][B]s[/B][/COLOR]).Value
Mã:
sArray = Range("A1:A" & [A65536].End(3).Row).Resize(, 2).Value
1/Về cơ bản là 2 câu lệnh trên là như nhau?

2/ Cơ bản sự khác nhau của Row và Rows?
Mình cũng thấy người ta viết
Mã:
.Rows.count
Cái trên là trả về số hàng của một khối ô nào đó
Không biết có ai viết
Mã:
.Row.count
không?
Với 4 câu lệnh trên thì sử dụng ở trường hợp nào?
Nhờ các bạn giải thích? mình còn mơ hồ mấy cái Row này?
Cảm ơn các bạn
Trong bài của bạn thì ROW mới đúng
ROW là ý nói đến chỉ số dòng tại cell đang xét
ROWS (thường kèm với .COUNT) là ý nói đến tổng số dòng của 1 vùng đang xét
 
Upvote 0
Trong bài của bạn thì ROW mới đúng
ROW là ý nói đến chỉ số dòng tại cell đang xét
ROWS (thường kèm với .COUNT) là ý nói đến tổng số dòng của 1 vùng đang xét
Nếu vậy, câu lệnh này đã dư chữ s
Mã:
[COLOR=#000000][I]sArray = Range("A1:B" & [A65536].End(3).Row[/I][/COLOR][COLOR=#ff0000][I][B]s[/B][/I][/COLOR][COLOR=#000000][I]).Value[/I][/COLOR]
Và mình đã test, câu lệnh đúng là
Mã:
[COLOR=#000000][I]sArray = Range("A1:B" & [A65536].End(3).Row[/I][/COLOR][COLOR=#000000][I]).Value[/I][/COLOR]

Ph
ải không các bạn
Xin cảm ơn tất cả
 
Upvote 0
Nếu vậy, câu lệnh này đã dư chữ s
Mã:
[COLOR=#000000][I]sArray = Range("A1:B" & [A65536].End(3).Row[/I][/COLOR][COLOR=#ff0000][I][B]s[/B][/I][/COLOR][COLOR=#000000][I]).Value[/I][/COLOR]
Và mình đã test, câu lệnh đúng là
Mã:
[COLOR=#000000][I]sArray = Range("A1:B" & [A65536].End(3).Row[/I][/COLOR][COLOR=#000000][I]).Value[/I][/COLOR]

Ph
ải không các bạn
Xin cảm ơn tất cả

Xem lại thì chính tôi cũng sai ở bài 179 rồi
(đã nói bị ảnh hưởng bời TẬN THẾ rồi)
Ẹc... Ẹc
 
Upvote 0
Thật sự bái phục bác Bill. Hôm nay ảnh hưởng tận thế hay sao mà viết code thế này. Vậy mà kết quả ra đúng 100 % mới ghê chứ. Thêm 1 cái ghê nữa là tốc độ lại nhanh hơn khi viết đúng nữa. Má ơi!
Sao lại trùng hợp cái dòng dữ liệu cuối có giá trị 10 000 mới ác chứ.
 
Lần chỉnh sửa cuối:
Upvote 0
Cái trên là do mình bắc chước của bạn Quang hai ( bài 169) là như bên dưới

Góp ý với bạn Quanghai 1 tý, Số liệu cột A & B đã có sao lại tiếp tục gán lại 1 lần nữa nhỉ?
Đó là câu lệnh
PHP:
[A1].Resize(i - 1, 3) = kq

Hic từ xưa đến giờ luôn viết :

kq = Range([A1], [A65536].End(3)).Resize(, 3).Value

Hỏng biết sao nay mắc chứng gì bày đặt thay đổi kiểu cho dính chưởng. híc.

Còn việc tại sao phải gán giá trị lại tại cột A và B hả? Không nói bạn biết đâu.

Bạn thấy thích thì làm giống, hỏng thích thì làm theo cách của bạn nhé.
Rồi sẽ có 1 ngày bạn hiểu tại sao thôi

 
Upvote 0
Hic từ xưa đến giờ luôn viết :

kq = Range([A1], [A65536].End(3)).Resize(, 3).Value

Hỏng biết sao nay mắc chứng gì bày đặt thay đổi kiểu cho dính chưởng. híc.

Còn việc tại sao phải gán giá trị lại tại cột A và B hả? Không nói bạn biết đâu.

Bạn thấy thích thì làm giống, hỏng thích thì làm theo cách của bạn nhé.
Rồi sẽ có 1 ngày bạn hiểu tại sao thôi

Hi, mình chỉ hỏi thế thôi mà, sao bạn tự ái thế!
Mình thấy vậy nên "théc méc" 1 tý. Chứ còn fải học ở các anh chị nhiều
Bây giờ bạn chỉ mình cách lấy dữ liệu cho riêng cột C nha!
Xin cảm ơn các bạn
-------------
Nếu có câu gì làm bạn buồn, thì mình thành thật xin lỗi.
 
Upvote 0
Hi, mình chỉ hỏi thế thôi mà, sao bạn tự ái thế!
Mình thấy vậy nên "théc méc" 1 tý. Chứ còn fải học ở các anh chị nhiều
Bây giờ bạn chỉ mình cách lấy dữ liệu cho riêng cột C nha!
Xin cảm ơn các bạn
-------------
Nếu có câu gì làm bạn buồn, thì mình thành thật xin lỗi.

Làm gì mà tự ái chứ. Hôm nay viết code đụng chỗ nào cũng sai tí xíu.
 
Upvote 0
Upvote 0
Nhờ các bạn sửa code xóa dữ liệu
Tôi có viết code xóa dữ liệu ở các cột như sau:
Bắt đầu từ các cell A9, C9, J9, O9, Q9, R9, S9 trở xuống
Mã:
Sub XoaVung()
Dim Vung As Range
[COLOR=#ff0000]Vung = Range("A9:A10000").Value[/COLOR]
With Vung
Union(Vung, Vung.Offset(, 2), Vung.Offset(, 9), Vung.Offset(, 14), Vung.Offset(, 15).Resize(, 3)).ClearContents
End With
End Sub
Code báo sai ở đọan màu đỏ
Xin cảm ơn!
 
Upvote 0
Nhờ các bạn sửa code xóa dữ liệu
Tôi có viết code xóa dữ liệu ở các cột như sau:
Bắt đầu từ các cell A9, C9, J9, O9, Q9, R9, S9 trở xuống
Mã:
Sub XoaVung()
Dim Vung As Range
[COLOR=#ff0000]Vung = Range("A9:A10000").Value[/COLOR]
With Vung
Union(Vung, Vung.Offset(, 2), Vung.Offset(, 9), Vung.Offset(, 14), Vung.Offset(, 15).Resize(, 3)).ClearContents
End With
End Sub
Code báo sai ở đọan màu đỏ
Xin cảm ơn!

Bạn không thể làm vậy được. Bạn không thể gán giá trị cho biến Range. kyo nghĩ sửa lại thế này hợp lý hơn:

Mã:
Sub XoaVung()
Dim Vung As Range
[B]Set Vung = Range("A9:A10000")[/B]
Union(Vung, Vung.Offset(, 2), Vung.Offset(, 9), Vung.Offset(, 14), Vung.Offset(, 15).Resize(, 3)).ClearContents
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Nhờ các bạn sửa code xóa dữ liệu
Tôi có viết code xóa dữ liệu ở các cột như sau:
Bắt đầu từ các cell A9, C9, J9, O9, Q9, R9, S9 trở xuống
Mã:
Sub XoaVung()
Dim Vung As Range
[COLOR=#ff0000]Vung = Range("A9:A10000").Value[/COLOR]
With Vung
Union(Vung, Vung.Offset(, 2), Vung.Offset(, 9), Vung.Offset(, 14), Vung.Offset(, 15).Resize(, 3)).ClearContents
End With
End Sub
Code báo sai ở đọan màu đỏ
Xin cảm ơn!

Dim Vung As Range
Set Vung = Range("A9:A10000")

sao bạn khai báo nó là range mà lại đi .value?
 
Upvote 0
Các thầy cô & anh chị cho em hỏi như sau
Em sắp làm hàm Max SumProduct trên code, nhưng tra cứu trên thư viện thì không có hỗ trợ hàm Max chỉ thấy hỗ trợ hàm DMax

Mã:
Function DMax(Arg1 As Range, Arg2, Arg3) As Double
Như vậy hàm DMax sử dụng giống như hàm Max của Excel không?
Và hàm SumProduct trong thư viện là
Mã:
Function SumProduct(Arg1, [Arg2], [Arg3], [Arg4], [Arg5], [Arg6], [Arg7], [Arg8], [Arg9], [Arg10], [Arg11], [Arg12], [Arg13], [Arg14], [Arg15], [Arg16], [Arg17], [Arg18], [Arg19], [Arg20], [Arg21], [Arg22], [Arg23], [Arg24], [Arg25], [Arg26], [Arg27], [Arg28], [Arg29], [Arg30]) As Double
hàm SumProduct sử dụng giống như hàm Sumproduct của Excel không?
Em cảm ơn
----------
Em chưa thử nghiệm, nhưng hỏi trước để không mất quá nhiều thời gian tìm tòi!
 
Upvote 0
Các thầy cô & anh chị cho em hỏi như sau
Em sắp làm hàm Max SumProduct trên code, nhưng tra cứu trên thư viện thì không có hỗ trợ hàm Max chỉ thấy hỗ trợ hàm DMax

Mã:
Function DMax(Arg1 As Range, Arg2, Arg3) As Double
Như vậy hàm DMax sử dụng giống như hàm Max của Excel không?
Và hàm SumProduct trong thư viện là
Mã:
Function SumProduct(Arg1, [Arg2], [Arg3], [Arg4], [Arg5], [Arg6], [Arg7], [Arg8], [Arg9], [Arg10], [Arg11], [Arg12], [Arg13], [Arg14], [Arg15], [Arg16], [Arg17], [Arg18], [Arg19], [Arg20], [Arg21], [Arg22], [Arg23], [Arg24], [Arg25], [Arg26], [Arg27], [Arg28], [Arg29], [Arg30]) As Double
hàm SumProduct sử dụng giống như hàm Sumproduct của Excel không?
Em cảm ơn
----------
Em chưa thử nghiệm, nhưng hỏi trước để không mất quá nhiều thời gian tìm tòi!
Bạn tự mình viết lấy 1 hàm MAX tự tạo cũng được vậy
Riêng về phần SUMPRODUCT tôi thường viết theo kiểu vầy:
Mã:
Sub Test()
  Dim rng1 As Range, rng2 As Range, rng3 As Range
  Dim Crit1, Crit2
  Set rng1 = Range("A1:A10")
  Set rng2 = Range("B1:B10")
  Set rng3 = Range("C1:C10")
  Crit1 = Range("F2").Value
  Crit2 = Range("G1").Value
  Range("G2").Value = Evaluate("SUMPRODUCT((" & rng1.Address & "=""" & Crit1 & """)*(" & _
                                                rng2.Address & "=""" & Crit2 & """)*(" & _
                                                rng3.Address & "))")

End Sub


Capture.JPG
























Dùng Evaluate, bên trong là 1 chuổi chứa biêu thức tính toán
Xét cho cùng thì SUMPRODUCT cũng là 1 dạng bài toán lọc và tính tổng, vậy ta có thể dùng mảng để xử lý sẽ nhanh hơn
 
Lần chỉnh sửa cuối:
Upvote 0
Chào các bạn!
Mình có cột H, bắt đầu từ ô H6 đến H20000, trong các ô này có ô là dữ liệu kiểu số hoặc dữ liệu kiểu Text (VD : ô H6 là 123, ô H7 là "TA123" ,...) Bây giờ mình muốn các bạn hướng dẫn sử dụng code nào để xóa các ô có dữ liệu kiểu số nhưng vẫn giữ kiểu Text lại!
Xin cảm ơn!
 
Upvote 0
Chào các bạn!
Mình có cột H, bắt đầu từ ô H6 đến H20000, trong các ô này có ô là dữ liệu kiểu số hoặc dữ liệu kiểu Text (VD : ô H6 là 123, ô H7 là "TA123" ,...) Bây giờ mình muốn các bạn hướng dẫn sử dụng code nào để xóa các ô có dữ liệu kiểu số nhưng vẫn giữ kiểu Text lại!
Xin cảm ơn!
Thử thế này
PHP:
Sub xoa()
Dim data(), i, Res(1 To 20000, 1 To 1), k
data = [H6:H20000].Value
For i = 1 To UBound(data)
   If IsNumeric(data(i, 1)) Then
      k = k + 1
      Res(k, 1) = data(i, 1)
   End If
Next
[I2].Resize(k) = Res
End Sub
Hay là thế này, nếu cái trên chưa đúng ý
PHP:
Sub xoa2()
Dim data(), i
data = [H6:H20000].Value
For i = 1 To UBound(data)
   If Not IsNumeric(data(i, 1)) Then
      data(i, 1) = Empty
   End If
Next
[I2].Resize(i - 1) = data
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT
Back
Top Bottom