Chuyên đề giải đáp những thắc mắc về code VBA

hpkhuong

######
Tham gia ngày
20 Tháng năm 2011
Bài viết
4,616
Được thích
4,054
Điểm
560
Nơi ở
Quận 2 - TP.HCM
HIHI! Bác GIÚP GIÙM NHÉ.
CÁM ƠN BÁC!

Thế bạn muốn "Hiếp Tôi" cái gì đây?
1. Copy cả bảng hay chỉ copy mỗi dòng cuối cùng sang sheet kia?
2. Rồi copy dán qua sheet kia là dán đè lên hay là dán nối tiếp...

Hỏi bài mà kiểu đem con bỏ chợ "thế lày" thì biết đến bao giờ???
 

appl

Thành viên chính thức
Tham gia ngày
22 Tháng sáu 2011
Bài viết
57
Được thích
22
Điểm
370
Tuổi
21
Bạn nào có nhu cầu về việc truyền tham số thì có thể tham khảo file này
Tặng các bạn file chuẩn hóa dữ liệu từ sheet báo cáo bằng phương pháp truyền tham số ,Trong sheet Bao Cao có các cột A, B là cố đinh,Từ cột C đến Cột M có thể thêm bớt số của hàng, kết thúc các cột cửa hàng luôn luôn tới cột Grand Total. Tôi sẽ dựa vào cột Grand Total để tìm cột cửa hàng cuối cùng nhất mà lấy dữ liệu
Các cột còn lại là các cột Set chi tiết có thể thêm hoặc bớt nhiều cột Chi tiết set
Yêu cầu: Nếu dòng nào của các cột Set chi tiết có dữ liệu thì lấy qua database như mẫu
ở đây tôi viết 1 sub DataBase_01 có chứa tham số, và một sub main

sub DataBase_01 dung để dò dữ liệu trên từng cột Set chi tiết , sub main là để duyệt qua tất cả các cột Set chi tiết.
P/S nếu bạn nào quan tâm tới truyền tham số trong sub thì có thể xem, còn không thì thôi
 

File đính kèm

HYen17

Thành viên cằn cỗi.
Tham gia ngày
27 Tháng năm 2007
Bài viết
4,481
Được thích
6,172
Điểm
100
Tuổi
19
HIHI! Bác GIÚP GIÙM NHÉ. CÁM ƠN BÁC!
PHP:
Option Explicit
Public Sub CopyProfile()
Dim Dong As Long, Cot As Byte
Dim Cls As Range
Sheet8.Select
Cot = [b1].CurrentRegion.Columns.Count
Dong = Range("E65000").End(xlUp).Row
For Each Cls In [E2].Resize(Dong)
    If Cls.Value <> "" Then
        Cells(Cls.Row, "B").Resize(, Cot).Copy Destination:=Sheet13.[B65500].End(xlUp).Offset(1)
    End If
Next Cls
MsgBox "XUAT XONG", , "GPE.COM"
End Sub
 

hpkhuong

######
Tham gia ngày
20 Tháng năm 2011
Bài viết
4,616
Được thích
4,054
Điểm
560
Nơi ở
Quận 2 - TP.HCM
Bạn nào có nhu cầu về việc truyền tham số thì có thể tham khảo file này
Tặng các bạn file chuẩn hóa dữ liệu từ sheet báo cáo bằng phương pháp truyền tham số ,Trong sheet Bao Cao có các cột A, B là cố đinh,Từ cột C đến Cột M có thể thêm bớt số của hàng, kết thúc các cột cửa hàng luôn luôn tới cột Grand Total. Tôi sẽ dựa vào cột Grand Total để tìm cột cửa hàng cuối cùng nhất mà lấy dữ liệu
Các cột còn lại là các cột Set chi tiết có thể thêm hoặc bớt nhiều cột Chi tiết set
Yêu cầu: Nếu dòng nào của các cột Set chi tiết có dữ liệu thì lấy qua database như mẫu
ở đây tôi viết 1 sub DataBase_01 có chứa tham số, và một sub main

sub DataBase_01 dung để dò dữ liệu trên từng cột Set chi tiết , sub main là để duyệt qua tất cả các cột Set chi tiết.
P/S nếu bạn nào quan tâm tới truyền tham số trong sub thì có thể xem, còn không thì thôi
Bạn cho hỏi là sao phải truyền tham số vậy bạn, và phải tách ra 2 sub ? Điều này có tác dụng gì???

Và tại sao không dùng trong 1 sub luôn cho gon...& không cần truyền tham số nhưng vẫn xác định được dòng cột nào muốn tách, muốn ghi dữ liệu...

=> Gôm vào 1 sub & không cần truyền tham số như bạn thì tốc độ sẽ cải thiện & tức thời hơn rất nhiều (nhanh hơn).

=========================
Giờ nâng độ khó lên tí:

Cũng với dữ liệu trên, chỉ cần 1 Mảng nguồn & 1 mảng đích, không hạn chế vòng lặp (nhưng làm sao cho nó ít nhất) & code để ra kết quả như trên sheet Database của bạn... & tất nhiên là viết trong 1 sub thôi!

Cùng tham gia nhé!

P/s: Vì thấy bài này cho cái dữ liệu thấy hay hay...@$@!^%@$@!^%@$@!^%
===========================================

Mã:
Public Sub GPE()
Dim Arr, dArr, I As Long, J As Long, K As Long, Col As Long, Z As Long
With Sheet2
    Arr = .UsedRange.Value
End With
Application.ScreenUpdating = False
For J = 1 To UBound(Arr, 2)
    If Arr(2, J) = "Grand Total" Then Col = J: Exit For
Next J
ReDim dArr(1 To UBound(Arr) * (UBound(Arr, 2) - Col), 1 To 5)
For I = 3 To UBound(Arr)
    For Z = Col + 1 To UBound(Arr, 2)
        If Arr(I, Z) <> Empty Then
            For J = 3 To Col - 1
            If Arr(I, J) <> Empty Then
                K = K + 1
                dArr(K, 1) = Arr(I, 1)
                dArr(K, 2) = Arr(I, 2)
                dArr(K, 3) = Arr(2, J)
                dArr(K, 4) = Arr(I, Z)
                dArr(K, 5) = Arr(I, J)
            End If
            Next J
        End If
    Next Z
Next I
With Sheet4
    .Range("A5").CurrentRegion.Offset(1).ClearContents
    If K Then
        .Range("A6").Resize(K, 4).NumberFormat = "@"
        .Range("A6").Resize(K, 5).Value = dArr
    End If
End With
Application.ScreenUpdating = True
End Sub
 
Lần chỉnh sửa cuối:

phihndhsp

Thành viên gạo cội
Tham gia ngày
26 Tháng mười hai 2009
Bài viết
3,305
Được thích
2,392
Điểm
860
Bạn cho hỏi là sao phải truyền tham số vậy bạn, và phải tách ra 2 sub ? Điều này có tác dụng gì???

Và tại sao không dùng trong 1 sub luôn cho gon...& không cần truyền tham số nhưng vẫn xác định được dòng cột nào muốn tách, muốn ghi dữ liệu...

=> Gôm vào 1 sub & không cần truyền tham số như bạn thì tốc độ sẽ cải thiện & tức thời hơn rất nhiều (nhanh hơn).

=========================
Giờ nâng độ khó lên tí:

Cũng với dữ liệu trên, chỉ cần 1 Mảng nguồn & 1 mảng đích, không hạn chế vòng lặp (nhưng làm sao cho nó ít nhất) & code để ra kết quả như trên sheet Database của bạn...

Cùng tham gia nhé!

P/s: Vì thấy bài này cho cái dữ liệu thấy hay hay...@$@!^%@$@!^%@$@!^%
Trong lập trình nếu muốn tối ưu cách viết và quản lý thì phải biết chia nhỏ các vấn đề ra để giải quyết, đó là cách tốt nhất. bạn có thể tham khảo trên các diễn đàn để biết. và chia nhỏ các vấn đề để trị có thể được gọi là đỉnh cao trong công việc lập trình

ví dụ như bạn muốn làm 10 cái bông hồng giống nhau nhưng khác nhau về màu sắc thì bạn làm như thế nào?
cách 1 cố làm ra 10 bông giống nhau từng cái riêng rẻ
cách 2 là tạo ra 1 cái khuôn, muốn màu nào thì đổ màu đó ra

nhận xét
cách 1 là cách dễ sai sót nhất. bạn có dám chắc là 10 cái bông đó giống y chang không? và có chắc là đã kiểm soát được không?
cách 2 nếu bị sai thì sẽ sai hàng loạt vì vậy dễ phát hiện và chắc chắn kiểm soát được 100%

cách 1. có cùng 1 công việc mà lập đi lập lại nhiều lần tạo ra nhiều bông
cách 2. chỉ cần đổ nguyên liệu vào khuôn thì ok ngay
nếu tạo 1 bông thì có thể cách 1 nhanh hơn
nếu càng nhiều bông thì cách 1 chuối hơn cách 2 nhiều
 

appl

Thành viên chính thức
Tham gia ngày
22 Tháng sáu 2011
Bài viết
57
Được thích
22
Điểm
370
Tuổi
21
Bạn nào có nhu cầu về việc truyền tham số thì có thể tham khảo file này nữa, lấy duy nhất Consultant từ các tháng
 

File đính kèm

Lần chỉnh sửa cuối:

toangiaphat

Thành viên hoạt động
Tham gia ngày
6 Tháng năm 2009
Bài viết
136
Được thích
3
Điểm
670
Tuổi
35
PHP:
option explicit
public sub copyprofile()
dim dong as long, cot as byte
dim cls as range
sheet8.select
cot = [b1].currentregion.columns.count
dong = range("e65000").end(xlup).row
for each cls in [e2].resize(dong)
    if cls.value <> "" then
        cells(cls.row, "b").resize(, cot).copy destination:=sheet13.[b65500].end(xlup).offset(1)
    end if
next cls
msgbox "xuat xong", , "gpe.com"
end sub
sao nó ko copy value mà nó copy cả công thức vậy bạn? Cách chạy thì đúng rồi
 

kyoshiro123

Thành viên mới
Tham gia ngày
9 Tháng năm 2016
Bài viết
1
Được thích
0
Điểm
0
Tuổi
29
Các anh chị cho em hỏi:

Bây giờ em có 1 file excel, 1 sheet bao gồm dữ liệu gồm danh sách các mã hàng..., bây giờ em lọc một phần dữ liệu rồi em muốn khi gửi cho 1 người thì người đấy không thể sử dụng lọc để show dữ liệu khác ra được, nhưng vẫn có thể nhập được dữ liệu ( có nghĩa là khóa chức năng lọc lại, không cho sử dụng lọc).

Có cách nào hay phải dùng code, mong các anh chị giúp đỡ!
 

keke355992

Thành viên thường trực
Tham gia ngày
19 Tháng một 2008
Bài viết
310
Được thích
20
Điểm
685
Tuổi
32
Nơi ở
Hoà Bình
Các bác cho e hỏi chút ạ: E thấy m.n hay khai báo:
Dim i as Long
Dim j as Long
Dim g as Long
...
Vậy bây giờ khai báo thành Dim i,j,g as Long có ảnh hưởng gì ko ạ
 

khuongvietphong

Be all you can be !
Tham gia ngày
6 Tháng bảy 2014
Bài viết
2,076
Được thích
1,428
Điểm
560
Tuổi
25
Nơi ở
Hà Nội
Các bác cho e hỏi chút ạ: E thấy m.n hay khai báo:
Dim i as Long
Dim j as Long
Dim g as Long
...
Vậy bây giờ khai báo thành Dim i,j,g as Long có ảnh hưởng gì ko ạ
Ví dụ khi ta chỉ khai báo là Dim a ( khai báo kiểu mập mờ ) thì VBA sẽ mặc định kiểu dữ liệu của biến a là Variant

Suy ra:

Nếu bạn khai báo như ở trên thì chỉ có g được khai báo với kiểu dữ liệu là Long thôi còn i, j mặc định sẽ là Variant
 

keke355992

Thành viên thường trực
Tham gia ngày
19 Tháng một 2008
Bài viết
310
Được thích
20
Điểm
685
Tuổi
32
Nơi ở
Hoà Bình
Ví dụ khi ta chỉ khai báo là Dim a ( khai báo kiểu mập mờ ) thì VBA sẽ mặc định kiểu dữ liệu của biến a là Variant

Suy ra:

Nếu bạn khai báo như ở trên thì chỉ có g được khai báo với kiểu dữ liệu là Long thôi còn i, j mặc định sẽ là Variant
E hiểu roài ạ, thank bác --=0
 

keke355992

Thành viên thường trực
Tham gia ngày
19 Tháng một 2008
Bài viết
310
Được thích
20
Điểm
685
Tuổi
32
Nơi ở
Hoà Bình
Các bác cho em hỏi chút ạ, E có yêu cầu như trong File về phương thức Find. E cảm ơn ạ
 

File đính kèm

SA_DQ

/(hông là gì!
Thành viên danh dự
Tham gia ngày
8 Tháng sáu 2006
Bài viết
6,481
Được thích
10,643
Điểm
1,860
Các bác cho em hỏi chút ạ, E có yêu cầu như trong File về phương thức Find. E cảm ơn ạ
Fương thức này không thể áp dụng để tìm 1 tháng cụ thể nào trong cột dữ liệu chứa ngày tháng kiểu DD/mm/yyyy hay MM/dd/yyyy

Hơn nữa, bạn cần lưu í 1 điều rằng khi cần tìm dữ liệu kiểu ngày tháng, ta cần định dạng toàn bộ vùng cần tìn về dạng 'MM/DD/YYYY'; Xài các dạng khác như Dd/MM/yyyy hay MM/DD/yy đều tiềm ẩn nguy cơ sai lệnh khôn lường.
 

keke355992

Thành viên thường trực
Tham gia ngày
19 Tháng một 2008
Bài viết
310
Được thích
20
Điểm
685
Tuổi
32
Nơi ở
Hoà Bình
Fương thức này không thể áp dụng để tìm 1 tháng cụ thể nào trong cột dữ liệu chứa ngày tháng kiểu DD/mm/yyyy hay MM/dd/yyyy

Hơn nữa, bạn cần lưu í 1 điều rằng khi cần tìm dữ liệu kiểu ngày tháng, ta cần định dạng toàn bộ vùng cần tìn về dạng 'MM/DD/YYYY'; Xài các dạng khác như Dd/MM/yyyy hay MM/DD/yy đều tiềm ẩn nguy cơ sai lệnh khôn lường.
Vậy chỉ có giải pháp thêm 1 cột phụ bên cạnh, và dùng hàm Month của Excel thôi à a ơi :(
 

khongnhienttt

Thành viên hoạt động
Tham gia ngày
15 Tháng bảy 2015
Bài viết
121
Được thích
33
Điểm
170
Tuổi
30
Code này tạo 1 dãy 4, hoặc 5 số và chuỗi ngẫu nhiên, nhưng mình chưa hiểu cách hoạt động của nó như thế nào, xin các bác chỉ giáo
Mã:
Function GetRandName() As String
  GetRandName = Mid(CreateObject("Scripting.FileSystemObject").GetTempName, 4, 5)
End Function
 

ChanhTQ@

0901452không62
Tham gia ngày
5 Tháng chín 2008
Bài viết
4,261
Được thích
4,933
Điểm
100
Vậy chỉ có giải pháp thêm 1 cột phụ bên cạnh, và dùng hàm Month của Excel thôi à a ơi :(
Nếu vẫn muốn xài fương thức FOND() thì chịu khó tạo vòng lặp duyệt tìm tấn tần tật các ngày trong tháng đó có trong CSDL; Như kiểu:

Set Rng = Range("B2: B999")
Rng.NumFormat="MM/DD/yyyy"
For J= 1 To 31
Dat = Format(DateSerial(Nam, Thang,J),"MM/DD/yyyy")
Set sRng=Rng.Find(Dat,,XlValues,Xlwhole)

Next J
 

Hau151978

Thành viên tích cực
Tham gia ngày
19 Tháng mười 2011
Bài viết
1,274
Được thích
1,115
Điểm
560
Code này tạo 1 dãy 4, hoặc 5 số và chuỗi ngẫu nhiên, nhưng mình chưa hiểu cách hoạt động của nó như thế nào, xin các bác chỉ giáo
Mã:
Function GetRandName() As String
  GetRandName = Mid(CreateObject("Scripting.FileSystemObject").GetTempName, 4, 5)
End Function
GetTempName dùng để tạo chuỗi ký tự để đặt tên cho file tạm.
Bạn vào tools-reference đánh dấu vào Microsoft Scripting Runtime. Copy code vào module:
Mã:
Sub a()
Set f = New FileSystemObject
Do
tmp = f.GetTempName
Loop
End Sub
Bấm F8 nhiều lần, quan sát biến tmp trong cửa sổ Local. Bạn sẽ thấy tmp có dạng rad?????.tmp, trong đó ????? là 5 ký tự ngẫu nhiên. Hàm mid(tmp,4,5) lấy ra 5 ký tự ngẫu nhiên đó.
 

khongnhienttt

Thành viên hoạt động
Tham gia ngày
15 Tháng bảy 2015
Bài viết
121
Được thích
33
Điểm
170
Tuổi
30
GetTempName dùng để tạo chuỗi ký tự để đặt tên cho file tạm.
Bạn vào tools-reference đánh dấu vào Microsoft Scripting Runtime. Copy code vào module:
Mã:
Sub a()
Set f = New FileSystemObject
Do
tmp = f.GetTempName
Loop
End Sub
Bấm F8 nhiều lần, quan sát biến tmp trong cửa sổ Local. Bạn sẽ thấy tmp có dạng rad?????.tmp, trong đó ????? là 5 ký tự ngẫu nhiên. Hàm mid(tmp,4,5) lấy ra 5 ký tự ngẫu nhiên đó.
Cám ơn bạn, giờ mình đã hiểu
 
Top Bottom