Xuất dữ liệu ra biểu mẫu có sẵn

Liên hệ QC

MANHTS

Thành viên chính thức
Tham gia
16/11/20
Bài viết
63
Được thích
4
Xin chào các bác
Em có 1 vấn đề như sau cần các bác trợ giúp.
Em mới làm quen với VBA mà chủ yếu tự học trên mạng những code đơn giản để áp dụng vào công việc tuy nhiên nó vẫn chưa được như ý muốn
Chả là khi em xuất 1 dữ liệu ra 1 biểu mẫu có sẵn thì có lúc dữ liệu nhiều ít khác nhau em có chọn đến dòng cố định ví dụ để trống 100 dòng nhưng khi xuất 1 file nào đó chỉ có 30 dòng thì 70 dòng còn lại muốn ẩn đi thì em dùng fiter để loại bỏ. Vấn đề ở đây là có cách nào để khi xuất dữ liệu bất kỳ mà nó tự cắt cho mình được k. em có đính kèm theo file
rất mong nhận được sự trợ giúp từ các bác
Trân trọng cảm ơn!
 

File đính kèm

  • FILE ĐÁNH GIÁ HỢP QUY CHUẨN NĂM 2021.xlsm
    1,009 KB · Đọc: 20
Xin chào các bác
Em có 1 vấn đề như sau cần các bác trợ giúp.
Em mới làm quen với VBA mà chủ yếu tự học trên mạng những code đơn giản để áp dụng vào công việc tuy nhiên nó vẫn chưa được như ý muốn
Chả là khi em xuất 1 dữ liệu ra 1 biểu mẫu có sẵn thì có lúc dữ liệu nhiều ít khác nhau em có chọn đến dòng cố định ví dụ để trống 100 dòng nhưng khi xuất 1 file nào đó chỉ có 30 dòng thì 70 dòng còn lại muốn ẩn đi thì em dùng fiter để loại bỏ. Vấn đề ở đây là có cách nào để khi xuất dữ liệu bất kỳ mà nó tự cắt cho mình được k. em có đính kèm theo file
rất mong nhận được sự trợ giúp từ các bác
Trân trọng cảm ơn!
Mới xem qua và theo mình hiểu thì bạn nên làm thế này:
1/ Tạo sheet form báo cáo (độ dài tới dòng cuối đủ để chứa dữ liệu dài nhất của bạn)
2/ Khi cần nhập giá trị vào báo cáo, code copy sheet form đó ra sheet mới (đổi tên theo ý), dữ liệu nguồn cần copy vào phải tính toán được độ dài (dòng cuối-dòng đầu) là bao nhiêu
3/ Khi copy vào form rồi, lúc đó sẽ tính được khoảng dư ra là bao nhiêu (vì form là cố định và đủ lớn, do đó mấy dòng ghi chú cuối của form luôn ở dòng cố định, bạn sẽ tính được khoảng dư ra là bao nhiêu dòng)
4/ Sau khi tính toán dư ra thì xóa nó đi
Lưu ý bắt đầu chạy code phải dò nếu trong file đã có sheet báo cáo cần làm (chẳng hạn form1) thì không tạo tiếp nữa, nếu không mỗi lần bấm là mỗi lần tạo sheet mới sẽ bất cập
 
Upvote 0
Mới xem qua và theo mình hiểu thì bạn nên làm thế này:
1/ Tạo sheet form báo cáo (độ dài tới dòng cuối đủ để chứa dữ liệu dài nhất của bạn)
2/ Khi cần nhập giá trị vào báo cáo, code copy sheet form đó ra sheet mới (đổi tên theo ý), dữ liệu nguồn cần copy vào phải tính toán được độ dài (dòng cuối-dòng đầu) là bao nhiêu
3/ Khi copy vào form rồi, lúc đó sẽ tính được khoảng dư ra là bao nhiêu (vì form là cố định và đủ lớn, do đó mấy dòng ghi chú cuối của form luôn ở dòng cố định, bạn sẽ tính được khoảng dư ra là bao nhiêu dòng)
4/ Sau khi tính toán dư ra thì xóa nó đi
Lưu ý bắt đầu chạy code phải dò nếu trong file đã có sheet báo cáo cần làm (chẳng hạn form1) thì không tạo tiếp nữa, nếu không mỗi lần bấm là mỗi lần tạo sheet mới sẽ bất cập
Hi bác cảm ơn bác góp ý nhưng nếu mà copy ra 1 file khác là rất mất thời gian thay vì ở đây em chỉ cần fiter lọc là xong thì em đã loại bỏ phần dữ liệu trống không cần thiết
1 lý do nữa là thực tế dữ liệu báo cáo sẽ dài ngắn khác nhau có cái chỉ vài dòng có cái vài trăm dòng nên rất khó để copy sang file khác. Cái khó ở đây là cần loại bỏ dữ liệu trống
Em ví dụ khi em chọn trong code là lấy dữ liệu đến 100 dòng thì trong BIỂU MẪU của em để đến 100 dòng và dòng 101 trở đi em để cố định bây giờ chỉ cần làm sao code nó tính được trong biểu mẫu đó dữ liệu từ dòng thứ 100 trở lại tới 20 mà không có thì tự động ẩn dòng thôi ạ
 
Upvote 0
Xin chào các bác
Em có 1 vấn đề như sau cần các bác trợ giúp.
Em mới làm quen với VBA mà chủ yếu tự học trên mạng những code đơn giản để áp dụng vào công việc tuy nhiên nó vẫn chưa được như ý muốn
Chả là khi em xuất 1 dữ liệu ra 1 biểu mẫu có sẵn thì có lúc dữ liệu nhiều ít khác nhau em có chọn đến dòng cố định ví dụ để trống 100 dòng nhưng khi xuất 1 file nào đó chỉ có 30 dòng thì 70 dòng còn lại muốn ẩn đi thì em dùng fiter để loại bỏ. Vấn đề ở đây là có cách nào để khi xuất dữ liệu bất kỳ mà nó tự cắt cho mình được k. em có đính kèm theo file
rất mong nhận được sự trợ giúp từ các bác
Trân trọng cảm ơn!
Bạn thử File này, nút <GPE> của sheet PHIEUBM25
Lấy File số 2.
 

File đính kèm

  • File so 2.rar
    247.7 KB · Đọc: 32
Lần chỉnh sửa cuối:
Upvote 0
Tuyệt ! Cảm ơn Thầy Ba tê - Nhanh - Gọn - Chính xác
- Lại học lỏm được một chiêu code trộn dòng nữa
 
Upvote 0
Bạn thử File này, nút <GPE> của sheet PHIEUBM25
Lấy File số 2.
Em cảm ơn thầy nhé quá tuyệt vời ông mặt trời hý hý code này hữu ích nhất em từng biết
Bài đã được tự động gộp:

Tuyệt ! Cảm ơn Thầy Ba tê - Nhanh - Gọn - Chính xác
- Lại học lỏm được một chiêu code trộn dòng nữa
tuyệt bác à code hay quá
 
Upvote 0
Bạn thử File này, nút <GPE> của sheet PHIEUBM25
Lấy File số 2.
Option Explicit

Public Sub s_PhieuBM25()
Application.ScreenUpdating = False
Dim sArr(), dArr(1 To 1430, 1 To 7), I As Long, K As Long, R As Long, x As Long
Dim SoQD As String, TenMau As String, KL As String, MoTa As String
sArr = Sheets("DU LIEU NHAP").Range("A4", Sheets("DU LIEU NHAP").Range("A4").End(xlDown)).Resize(, 40).Value
R = UBound(sArr)

(theo em hiểu thì ở đây là khai báo các biến trong đó có biến i nhưng biến K, R, X , KL thì em k hiểu )

With Sheets("PHIEUBM25")
SoQD = .Range("M4").Value
For I = 1 To R
If sArr(I, 1) = SoQD Then
K = K + 1
If sArr(I, 10) <> TenMau Then
dArr(K, 1) = sArr(I, 10)
dArr(K, 3) = sArr(I, 11)
dArr(K, 4) = sArr(I, 13)
dArr(K, 5) = sArr(I, 14)
dArr(K, 6) = sArr(I, 15)
TenMau = sArr(I, 10)
Else
dArr(K, 5) = sArr(I, 14)
End If
End If
Next I
.Rows("16:150").Hidden = False
.Range("A16").Resize(130, 6).UnMerge
.Range("A16").Resize(130, 8).Borders.LineStyle = 0
.Range("C16").Resize(K, 6) = dArr
.Range("A16").Resize(K, 8).Borders.LineStyle = 1
For I = K To 1 Step -1
If dArr(I, 1) = Empty Then
x = x + 1
(theo em hiểu thì từ ô 16:150 ẩn nếu k có dữ liệu, nhưng 3 dòng
.Range("A16").Resize(130, 6).UnMerge
.Range("A16").Resize(130, 8).Borders.LineStyle = 0
.Range("C16").Resize(K, 6) = dArr thì em không hiểu được) mong thầy giải thích giúp em


Else
.Range("A" & I + 15).Resize(x + 1).Merge
.Range("C" & I + 15).Resize(x + 1, 2).Merge
.Range("B" & I + 15).Resize(x + 1).Merge
.Range("E" & I + 15).Resize(x + 1).Merge
.Range("F" & I + 15).Resize(x + 1).Merge
x = 0
End If
Next I
.Rows(K + 15 & ":150").Hidden = True
End With
End Sub


Cho em chào thầy bate thầy có thể giải thích giúp em đoạn code em bôi đậm được không ạ để em có thể hiểu và sử dụng cho những lần sau
em cảm ơn thầy
 
Upvote 0
Option Explicit

Public Sub s_PhieuBM25()
Application.ScreenUpdating = False
Dim sArr(), dArr(1 To 1430, 1 To 7), I As Long, K As Long, R As Long, x As Long
Dim SoQD As String, TenMau As String, KL As String, MoTa As String
sArr = Sheets("DU LIEU NHAP").Range("A4", Sheets("DU LIEU NHAP").Range("A4").End(xlDown)).Resize(, 40).Value
R = UBound(sArr)

(theo em hiểu thì ở đây là khai báo các biến trong đó có biến i nhưng biến K, R, X , KL thì em k hiểu )

With Sheets("PHIEUBM25")
SoQD = .Range("M4").Value
For I = 1 To R
If sArr(I, 1) = SoQD Then
K = K + 1
If sArr(I, 10) <> TenMau Then
dArr(K, 1) = sArr(I, 10)
dArr(K, 3) = sArr(I, 11)
dArr(K, 4) = sArr(I, 13)
dArr(K, 5) = sArr(I, 14)
dArr(K, 6) = sArr(I, 15)
TenMau = sArr(I, 10)
Else
dArr(K, 5) = sArr(I, 14)
End If
End If
Next I
.Rows("16:150").Hidden = False
.Range("A16").Resize(130, 6).UnMerge
.Range("A16").Resize(130, 8).Borders.LineStyle = 0
.Range("C16").Resize(K, 6) = dArr
.Range("A16").Resize(K, 8).Borders.LineStyle = 1
For I = K To 1 Step -1
If dArr(I, 1) = Empty Then
x = x + 1
(theo em hiểu thì từ ô 16:150 ẩn nếu k có dữ liệu, nhưng 3 dòng
.Range("A16").Resize(130, 6).UnMerge
.Range("A16").Resize(130, 8).Borders.LineStyle = 0
.Range("C16").Resize(K, 6) = dArr thì em không hiểu được) mong thầy giải thích giúp em


Else
.Range("A" & I + 15).Resize(x + 1).Merge
.Range("C" & I + 15).Resize(x + 1, 2).Merge
.Range("B" & I + 15).Resize(x + 1).Merge
.Range("E" & I + 15).Resize(x + 1).Merge
.Range("F" & I + 15).Resize(x + 1).Merge
x = 0
End If
Next I
.Rows(K + 15 & ":150").Hidden = True
End With
End Sub


Cho em chào thầy bate thầy có thể giải thích giúp em đoạn code em bôi đậm được không ạ để em có thể hiểu và sử dụng cho những lần sau
em cảm ơn thầy
Bạn hỏi nhiều thế sao giải thích được, giải thích dài dòng lắm. Mình nói đại loại nhé:
Dim sArr(), dArr(1 To 1430, 1 To 7), I As Long, K As Long, R As Long, x As Long
Dim SoQD As String, TenMau As String, KL As String, MoTa As String

==>
2 dòng trên là khai báo biến: sarr và darr là array (mảng), tưởng tưởng trong đầu nó như vùng nhớ dữ liệu vậy đó, I K R x đó là biến long (số nguyên như -2,-1,1,2,3..., tên biến thì thích đặt gì đặt trong khuôn khổ quy định của nó), string là chuỗi (kiểu như abc xyz...) - cái này google đầy, lên tìm hiểu

sArr = Sheets("DU LIEU NHAP").Range("A4", Sheets("DU LIEU NHAP").Range("A4").End(xlDown)).Resize(, 40).Value ==> Gán mảng sArr bằng vùng thực tế trên sheet
R = UBound(sArr) ==> viết tắt của UBound(sArr,1), tức là dòng cuối của mảng sArr là bao nhiêu

(theo em hiểu thì ở đây là khai báo các biến trong đó có biến i nhưng biến K, R, X , KL thì em k hiểu )

------

.Rows("16:150").Hidden = False ==>
bỏ ẩn dòng từ 16:150
.Range("A16").Resize(130, 6).UnMerge ==> bỏ trộn dòng từ A16 mở rộng ra 130 dòng và 6 cột (tìm hiểu Resize nha)
.Range("A16").Resize(130, 8).Borders.LineStyle = 0 ==> bỏ kẻ viền từ..(tương tự trên)
.Range("C16").Resize(K, 6) = dArr ==> có khúc code ở giữa đã ghi giá trị vào dArr rồi, nên bây giờ gán mảng dArr xuống sheet
.Range("A16").Resize(K, 8).Borders.LineStyle = 1 ==> Kẻ viền
For I = K To 1 Step -1 => vòng lặp này chạy từ dưới bảng lên trên
If dArr(I, 1) = Empty Then ==> Nếu tại dòng i cột 1 rỗng thì x cộng thêm 1 để tí nữa đếm số dòng cần trộn
x = x + 1
Else

==> Đoạn phía dưới else là nếu dòng i cột 1 không rỗng, tức là tại cột đó sẽ cần trộn thì giả sử x=3, tức có 3 ô rỗng, vậy trộn lại sẽ là x+1 ô cần trộn
 
Upvote 0
Bạn hỏi nhiều thế sao giải thích được, giải thích dài dòng lắm. Mình nói đại loại nhé:
Dim sArr(), dArr(1 To 1430, 1 To 7), I As Long, K As Long, R As Long, x As Long
Dim SoQD As String, TenMau As String, KL As String, MoTa As String

==>
2 dòng trên là khai báo biến: sarr và darr là array (mảng), tưởng tưởng trong đầu nó như vùng nhớ dữ liệu vậy đó, I K R x đó là biến long (số nguyên như -2,-1,1,2,3..., tên biến thì thích đặt gì đặt trong khuôn khổ quy định của nó), string là chuỗi (kiểu như abc xyz...) - cái này google đầy, lên tìm hiểu

sArr = Sheets("DU LIEU NHAP").Range("A4", Sheets("DU LIEU NHAP").Range("A4").End(xlDown)).Resize(, 40).Value ==> Gán mảng sArr bằng vùng thực tế trên sheet
R = UBound(sArr) ==> viết tắt của UBound(sArr,1), tức là dòng cuối của mảng sArr là bao nhiêu

(theo em hiểu thì ở đây là khai báo các biến trong đó có biến i nhưng biến K, R, X , KL thì em k hiểu )

------

.Rows("16:150").Hidden = False ==>
bỏ ẩn dòng từ 16:150
.Range("A16").Resize(130, 6).UnMerge ==> bỏ trộn dòng từ A16 mở rộng ra 130 dòng và 6 cột (tìm hiểu Resize nha)
.Range("A16").Resize(130, 8).Borders.LineStyle = 0 ==> bỏ kẻ viền từ..(tương tự trên)
.Range("C16").Resize(K, 6) = dArr ==> có khúc code ở giữa đã ghi giá trị vào dArr rồi, nên bây giờ gán mảng dArr xuống sheet
.Range("A16").Resize(K, 8).Borders.LineStyle = 1 ==> Kẻ viền
For I = K To 1 Step -1 => vòng lặp này chạy từ dưới bảng lên trên
If dArr(I, 1) = Empty Then ==> Nếu tại dòng i cột 1 rỗng thì x cộng thêm 1 để tí nữa đếm số dòng cần trộn
x = x + 1
Else

==> Đoạn phía dưới else là nếu dòng i cột 1 không rỗng, tức là tại cột đó sẽ cần trộn thì giả sử x=3, tức có 3 ô rỗng, vậy trộn lại sẽ là x+1 ô cần trộn
Em cảm ơn thầy nhiều
 
Upvote 0
Web KT

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

Back
Top Bottom