Nhờ các pro vba excel giúp em Cách tim kiếm sheet dạng namthang (yyyymm) (2 người xem)

Liên hệ QC

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

cuongtokyo0240

Thành viên mới
Tham gia
21/5/18
Bài viết
37
Được thích
4
Chào anh chị em trong diễn đàn .
em muốn coppy dữ liệu các sheet từ 1 file trong 1 folder mà chứa chính file excel đó .
hiện tại thì dữ liệu đã được lấy ra nhưng gặp phải vấn đề là cái vòng lặp tìm kiếm tên sheet .
trong 1 file cần copy có các sheet tên dạng yyyymm ví dụ 201801 ,201802..... 201901.....
1-Trường hop 1 là trong 1 năm 2018 từ 201801 đến 201812 thì vòng lặp coppy đó không vấn đề gì
2-Trường hợp 2 sheet cần lấy từ 201805 đến 201905 thì vòng lặp nó là 100 lần -> không đúng.
Vậy Anh chị nào giúp em được vấn đề này không thì chỉ em với . em cảm ơn ạ.

em đăng 2 file 1 file là file copy
1 file là file nguồn
 

File đính kèm

Chào anh chị em trong diễn đàn .
em muốn coppy dữ liệu các sheet từ 1 file trong 1 folder mà chứa chính file excel đó .
hiện tại thì dữ liệu đã được lấy ra nhưng gặp phải vấn đề là cái vòng lặp tìm kiếm tên sheet .
trong 1 file cần copy có các sheet tên dạng yyyymm ví dụ 201801 ,201802..... 201901.....
1-Trường hop 1 là trong 1 năm 2018 từ 201801 đến 201812 thì vòng lặp coppy đó không vấn đề gì
2-Trường hợp 2 sheet cần lấy từ 201805 đến 201905 thì vòng lặp nó là 100 lần -> không đúng.
Vậy Anh chị nào giúp em được vấn đề này không thì chỉ em với . em cảm ơn ạ.

em đăng 2 file 1 file là file copy
1 file là file nguồn
Nếu bạn muốn tìm kiếm tên sheet thì có thể dùng code
Mã:
For Each sh In wk.Sheets
    if sh.name like "2018*" then
        ...
    end if
next sh
 
Nếu bạn muốn tìm kiếm tên sheet thì có thể dùng code
Mã:
For Each sh In wk.Sheets
    if sh.name like "2018*" then
        ...
    end if
next sh
Em cảm ơn anh đã quan tâm trả lời câu hỏi của em .
công thức anh gợi ý cho e đó em cũng đã thử rồi anh à.
ý em muốn hỏi là trong 1 book mà có các ten sheet là 201801,201802........201802.....201901.....201912
ví dụ em muốn lấy dữ liệu các sheet 201805 cho đến 201905 đó ạ
 
Chào anh chị em trong diễn đàn .
em muốn coppy dữ liệu các sheet từ 1 file trong 1 folder mà chứa chính file excel đó .
hiện tại thì dữ liệu đã được lấy ra nhưng gặp phải vấn đề là cái vòng lặp tìm kiếm tên sheet .
trong 1 file cần copy có các sheet tên dạng yyyymm ví dụ 201801 ,201802..... 201901.....
1-Trường hop 1 là trong 1 năm 2018 từ 201801 đến 201812 thì vòng lặp coppy đó không vấn đề gì
2-Trường hợp 2 sheet cần lấy từ 201805 đến 201905 thì vòng lặp nó là 100 lần -> không đúng.
Vậy Anh chị nào giúp em được vấn đề này không thì chỉ em với . em cảm ơn ạ.

em đăng 2 file 1 file là file copy
1 file là file nguồn
Bạn nên giải thích rỏ:
Nhấn nút chọn ổ dĩa, chọn Folder, chọn File lấy tất cả các sheet của File đang chọn vào File Excel đang sử dụng, mỗi sheet của File kia tương ứng với mỗi sheet của File này?
 
Lần chỉnh sửa cuối:
Bạn nên giải thích rỏ:
Nhấn nút chọn ổ dĩa, chọn Folder, chọn File lấy tất cả các sheet vào File đang chọn vào File Excel đang sử dụng, mỗi sheet của File kia tương ứng với mỗi sheet của File này?
Cảm ơn anh đã quan tâm đến câu hỏi của em.
file nguồn là A
file kết quả là B
Cái file 2 file excel đó em lưu ở đâu thì nó tự động tìm đến đúng folder chứ A và B , bấm nút là nó tự động copy file A a ạ.
chỉ là bây giờ em muốn thêm cái điều kiện lấy dữ liệu coppy từ sheet 201805 đến sheet 201905 thôi a (cái ten sheet đó tượng trưng cho năm-tháng)
 
1 vòng lặp chưa được thì xài 2;
Cái ngoài ba động theo đơn vị năm;
Cái còn lại theo tháng
Tạo chuỗi trung gian để loại những trang tính chưa cần số liệu của chúng.
 
1 vòng lặp chưa được thì xài 2;
Cái ngoài ba động theo đơn vị năm;
Cái còn lại theo tháng
Tạo chuỗi trung gian để loại những trang tính chưa cần số liệu của chúng.
tại ô cells(3,L12) thi em gán = giá trị sheet bắt đầu lấy trong file nguồn
Ô cell (3,,L13) = giá trị sheet cuối cùng lấy trong file nguồn
shet đó là tên năm tháng dạng yyyymm .
nhưng khi số yyyy tăng nên 1 năm thì vòng lặp tăng lên 100 lần ạ.
hiện tại em cũng đã nghĩ ra phương án thay khác

Ô cells(3,L12) thi em gán = giá trị sheet bắt đầu lấy trong file nguồn dạng 2018year05month
Ô cell (3,,L13) = giá trị sheet cuối cùng lấy trong file nguồn dạng 2019year05month
--->giá trị ô Cells(3,L14) = datedif(cells(3,L12),cell (3,,L13),"m") ->> khoảng cách giữ các tháng -> cách này chính là số vòng lặp .

For i = 1 to [khoảng cách giữ các tháng]
đặt 1 biến X = Cells(3,L12)
sau đó em tiếp tục đổi X đang ở dạng Date sang dạng Number = công thức format()
if sh.name = Cells(3,L12) then
---->>>>copy
đến đây em fai tiếp tục công tăng số tháng lên
bằng cát biến X = DateADD("m",1,d) ->>

->>thuật toán giải em nghĩ như vậy va vừa làm theo nhưng kết quá ko được đúng vì lý do CHUYÊN đỔi giữa DATE ngày sàng dạng NUMber (mục đích chuyển là để nó tìm đúng tên sheet trong file coppy.

ANH CHỊ EM NÀO PRO HƠN GIUP EM VỚI
 
Em cảm ơn anh đã quan tâm trả lời câu hỏi của em .
công thức anh gợi ý cho e đó em cũng đã thử rồi anh à.
ý em muốn hỏi là trong 1 book mà có các ten sheet là 201801,201802........201802.....201901.....201912
ví dụ em muốn lấy dữ liệu các sheet 201805 cho đến 201905 đó ạ
Mã:
  fSheet = "201805"
  eSheet = "201905"
  thang = CInt(Right(fSheet, 2))
  nam = CInt(Left(fSheet, 4))
  i = 0
  Do Until fSheet = eSheet
    fSheet = nam + ((thang + i - 1) \ 12) & Format(((thang + i - 1) Mod 12) + 1, "00")
    i = i + 1
    'Xu ly sheets(fSheet)
  Loop
 
...

ANH CHỊ EM NÀO PRO HƠN GIUP EM VỚI
Học tiéng Việt cho chuẩn rồi hãy lo tây bồi. Viết lủng củng bỏ bố.

Giải pháp còn tuỳ thuộc vào muốn làm việc theo thứ tự tên sheet hay thứ tự của sheet trong workbook.

Thứ tự tên sheet:
sheetBD = 201801
sheetKT = 201912
For i = sheetBD To sheetKT
Set sheetLamViec = Sheets(CStr(i)) ' code giản dị, bỏ qua phần thử sự hiện hữu của sheet
... ' làm việc ở đây
If (i Mod 100) >= 12 Then i = i + 88 ' nhảy qua năm kế
Next i

Thứ tự sheet trong workbook:
sheetBD = "201801"
sheetKT = "201912"
For each sheetLamViec in Worksheets
If IsNumeric(sheetLamViec.Name) Then
If sheetLamViec.Name >= sheetBD And sheetLamViec.Name <= sheetKT Then
... ' làm việc ở đây
End If
End If
Next sheetLamViec
 
Học tiéng Việt cho chuẩn rồi hãy lo tây bồi. Viết lủng củng bỏ bố.

Giải pháp còn tuỳ thuộc vào muốn làm việc theo thứ tự tên sheet hay thứ tự của sheet trong workbook.

Thứ tự tên sheet:
sheetBD = 201801
sheetKT = 201912
For i = sheetBD To sheetKT
Set sheetLamViec = Sheets(CStr(i)) ' code giản dị, bỏ qua phần thử sự hiện hữu của sheet
... ' làm việc ở đây
If (i Mod 100) >= 12 Then i = i + 88 ' nhảy qua năm kế
Next i

Thứ tự sheet trong workbook:
sheetBD = "201801"
sheetKT = "201912"
For each sheetLamViec in Worksheets
If IsNumeric(sheetLamViec.Name) Then
If sheetLamViec.Name >= sheetBD And sheetLamViec.Name <= sheetKT Then
... ' làm việc ở đây
End If
End If
Next sheetLamViec
Em cảm ơn đã cho lời góp ý và trả lời câu hỏi của em.
Có lẽ cách diễn đạt của em ở topic nó hơi khó hiểu .
em định viết rõ tường minh cách làm ngay từ đầu nhưng sợ dài quá nên e mới viết tóm tắt ngắn như vậy
Hiện tại em đã áp dụng cách thứ 2 của anh và đã thành công . Em cảm ơn anh nhiều. chúc anh sức khỏe và gặp nhiều may mắn
[
Thứ tự sheet trong workbook:
sheetBD = "201801"
sheetKT = "201912"
For each sheetLamViec in Worksheets
If IsNumeric(sheetLamViec.Name) Then
If sheetLamViec.Name >= sheetBD And sheetLamViec.Name <= sheetKT Then
... ' làm việc ở đây
End If
End If
 
Mã:
  fSheet = "201805"
  eSheet = "201905"
  thang = CInt(Right(fSheet, 2))
  nam = CInt(Left(fSheet, 4))
  i = 0
  Do Until fSheet = eSheet
    fSheet = nam + ((thang + i - 1) \ 12) & Format(((thang + i - 1) Mod 12) + 1, "00")
    i = i + 1
    'Xu ly sheets(fSheet)
  Loop
Em cảm ơn anh đã quan tâm và trả lời câu hỏi của em.
Em cũng đã thử áp dụng cách này của anh nhưng hình như nó bị lỗi anh ạ .
Anh thử tham khảo cách làm của anh #VietMini bên trên xem .
Em vừa tets thử và đã chạy rồi ạ
cách này nek
Thứ tự sheet trong workbook:
sheetBD = "201801"
sheetKT = "201912"
For each sheetLamViec in Worksheets
If IsNumeric(sheetLamViec.Name) Then
If sheetLamViec.Name >= sheetBD And sheetLamViec.Name <= sheetKT Then
... ' làm việc ở đây
End If
End If
 
Em cảm ơn anh đã quan tâm và trả lời câu hỏi của em.
Em cũng đã thử áp dụng cách này của anh nhưng hình như nó bị lỗi anh ạ .
Anh thử tham khảo cách làm của anh #VietMini bên trên xem .
Em vừa tets thử và đã chạy rồi ạ
cách này nek
Thứ tự sheet trong workbook:
sheetBD = "201801"
sheetKT = "201912"
For each sheetLamViec in Worksheets
If IsNumeric(sheetLamViec.Name) Then
If sheetLamViec.Name >= sheetBD And sheetLamViec.Name <= sheetKT Then
... ' làm việc ở đây
End If
End If
Bị lổi là do sheet không tồn tại, phần xử lý sheet cần có lệnh kiểm tra sự tồn tại của sheet
Code trên lấy sheet hiện hành nên không cần kiểm tra
 
Bị lổi là do sheet không tồn tại, phần xử lý sheet cần có lệnh kiểm tra sự tồn tại của sheet
Code trên lấy sheet hiện hành nên không cần kiểm tra
Đọc cái cách làm bài #1 là biết ngay thớt sẽ bị lỗi không tìm thấy sheet.
Cho nên ở bài #9 tôi cố ý nhắc nhưng không diễn giải code. Để cho thớt tự tìm, nói theo tây bồi là "find out the hard way"
Code 2 của bài #9 cũng còn 1 bug nhỏ. Nhưng thây kệ để đó.
 
Đọc cái cách làm bài #1 là biết ngay thớt sẽ bị lỗi không tìm thấy sheet.
Cho nên ở bài #9 tôi cố ý nhắc nhưng không diễn giải code. Để cho thớt tự tìm, nói theo tây bồi là "find out the hard way"
Code 2 của bài #9 cũng còn 1 bug nhỏ. Nhưng thây kệ để đó.
Tiêng Tây vs Tiếng Ta khác cái gì đâu mà Bác làm gì mà căng thế . Em không biết thì mới hỏi thôi , đâu phải lúc nào cứ găp cái gì đơn giản là biết và phức tạp là ko biết đâu. Có những lúc cái khó lại làm được và cái dễ lại ko làm được. Có thể dễ đối với bác nhưng khó với mọi người. Chính vì vậy mới cần fai giao lưu học hỏi lẫn nhau .
Em thì cũng chỉ nhận làm cái báo cáo bằng VBA thôi chứ công việc của em làm về Web nên cũng không am hiểu gì nhiều về VBA nói riêng.
Một bài toán đặt ra có nhiều thuật toán giải khác nhau do từng người suy nghĩ và chọn lựa.
Dù sao em cũng cảm ơn những lời góp ý của bác
 
Web KT

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

Back
Top Bottom