Đặt tên file & open file...Xin giúp đỡ! (1 người xem)

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

alias1313

Thành viên hoạt động
Tham gia
7/4/17
Bài viết
163
Được thích
13
Em có file excel tên: Bao_cao_so_lieu_25_5_2017.xls, file này được lấy trên cơ sở dữ liệu mỗi ngày, vì vậy tên file sẽ thay đổi theo ngày, tháng lấy dữ liệu.
Mong Anh/Chị giúp em khai báo tên file để em có thể dùng macro mở file theo ngày tương ứng( ví dụ: ngày 30/06 thì mở file: Bao_cao_so_lieu_30_6_2017.xls

File_name = "Bao_cao_so_lieu_25_5_2017.xls"
Workbooks.Open Filename:=path_name & File_name.
 
PHP:
[A1]="Bao_cao_so_lieu_"&TEXT(TODAY(),"d\_m\_yyyy")&".xls"
PHP:
msgbox "Bao_cao_so_lieu_" & Format(Date, "d\_m\_yyyy") & ".xls"
 
PHP:
[A1]="Bao_cao_so_lieu_"&TEXT(TODAY(),"d\_m\_yyyy")&".xls"
PHP:
msgbox "Bao_cao_so_lieu_" & Format(Date, "d\_m\_yyyy") & ".xls"


Đoạn code của anh đúng cái em cần....nhưng em thử đủ cách mà không sao áp dụng được

filename= "Bao_cao_so_lieu_" & Text(TODAY(), "d\_m\_yyyy") & ".xls"
or
[A1]="Bao_cao_so_lieu_"&TEXT(TODAY(),"d\_m\_yyyy")&".xls"( tại A1 đã hiển thị: Bao_cao_so_lieu_25_5_2017.xls)
Filename = range("A1").value
2 cách này chạy báo lỗi: sub or function not defined ( debug...thì nó chỉ lỗi chỗ TODAY)

Anh có thể giúp em đưa đoạn code này vào để chạy không? Thanks anh !
 
Đoạn code của anh đúng cái em cần....nhưng em thử đủ cách mà không sao áp dụng được

filename= "Bao_cao_so_lieu_" & Text(TODAY(), "d\_m\_yyyy") & ".xls"
or
[A1]="Bao_cao_so_lieu_"&TEXT(TODAY(),"d\_m\_yyyy")&".xls"( tại A1 đã hiển thị: Bao_cao_so_lieu_25_5_2017.xls)
Filename = range("A1").value
2 cách này chạy báo lỗi: sub or function not defined ( debug...thì nó chỉ lỗi chỗ TODAY)

Anh có thể giúp em đưa đoạn code này vào để chạy không? Thanks anh !
debug...thì nó chỉ lỗi chỗ TODAY báo lỗi cho cả phần Filename = range("A1").value? Không đúng.
 
Không chạy đc thì nó phải báo lỗi ở đâu đó chứ. Bạn đưa code của bạn lên coi.


Em đã tìm ra chỗ sai...
[A1]="Bao_cao_so_lieu_"&TEXT(TODAY(),"d\_m\_yyyy")&".xls"
Filename = range("A1").value

Nó chỉ báo lỗi : sub or function not defined , con chuột chỉ ngay chỗ TODAY...
Vấn đề ở chỗ: Bao_cao_so_lieu_25_5__2017.xls tên file" __2017" có 2 cái gạch dưới không phải 1..
em sửa thành: [A1]="Bao_cao_so_lieu_"&TEXT(TODAY(),"d\_m\__yyyy")&".xls" nhưng vẫn không được, vì như thế nó lai ra : Bao_cao_so_lieu_25_5_ 2017.xls , 1 dấu gạch + space _ 2017, chứ không ra 2 gạch dưới __2017, hết sức đau đầu.
 
Em đã tìm ra chỗ sai...
[A1]="Bao_cao_so_lieu_"&TEXT(TODAY(),"d\_m\_yyyy")&".xls"
Filename = range("A1").value

Nó chỉ báo lỗi : sub or function not defined , con chuột chỉ ngay chỗ TODAY...
Vấn đề ở chỗ: Bao_cao_so_lieu_25_5__2017.xls tên file" __2017" có 2 cái gạch dưới không phải 1..
em sửa thành: [A1]="Bao_cao_so_lieu_"&TEXT(TODAY(),"d\_m\__yyyy")&".xls" nhưng vẫn không được, vì như thế nó lai ra : Bao_cao_so_lieu_25_5_ 2017.xls , 1 dấu gạch + space _ 2017, chứ không ra 2 gạch dưới __2017, hết sức đau đầu.
Nói chung nếu viết code VBA thì không viết kiểu đó được (VBA không có hàm TEXT, cũng không có hàm TODAY)
Viết vầy:
Mã:
filename = "Bao_cao_so_lieu_" & Format(Date, "d_m_yyyy") & ".xls"
Muốn 1 gạch dưới hay 2 gạch dưới, bạn cứ sửa thoải mái
 
Nói chung nếu viết code VBA thì không viết kiểu đó được (VBA không có hàm TEXT, cũng không có hàm TODAY)
Viết vầy:
Mã:
filename = "Bao_cao_so_lieu_" & Format(Date, "d_m_yyyy") & ".xls"
Muốn 1 gạch dưới hay 2 gạch dưới, bạn cứ sửa thoải mái

Một phát được luôn Thầy ơi...( em chưa gặp Thầy nhưng thấy nhiều người trong diễn đàn GPE rất kính trọng Thầy ..nên em cũng gọi Anh là Thầy...^_^...)...cảm ơn Thầy cùng các Anh rất nhiều!
 
@ndu96081631 Thầy có thể giúp em thêm 1 câu hỏi về filename:

Ví dụ:
em có 1 file tên: Bao_cao_so_lieu_25_5__2017.xls, thay vì phải khai báo đầy đủ mình có cách nào khai báo tắt không Thầy, như là: " * " & "2017.xls" or "Bao_cao" & " * " ( dấu * giống như trong tìm kiếm mình hay dùng * đề thay thế cho một phần tên file)
Em cám ơn Thầy!!!:p
 
@ndu96081631 Thầy có thể giúp em thêm 1 câu hỏi về filename:

Ví dụ:
em có 1 file tên: Bao_cao_so_lieu_25_5__2017.xls, thay vì phải khai báo đầy đủ mình có cách nào khai báo tắt không Thầy, như là: " * " & "2017.xls" or "Bao_cao" & " * " ( dấu * giống như trong tìm kiếm mình hay dùng * đề thay thế cho một phần tên file)
Em cám ơn Thầy!!!:p
Nếu bạn dùng ký tự đại diện "*", vậy khi code tìm được từ 2 files trở lên thì nó biết mở file nào?
 
Nếu bạn dùng ký tự đại diện "*", vậy khi code tìm được từ 2 files trở lên thì nó biết mở file nào?

Trong thư mục chứa file của em chỉ có 1 file dạng đó, vấn đề của em đã được giải quyết nhờ đoạn code của Thầy
em hỏi trường hợp này để hiểu thêm xem VBA có cho phép làm như vậy không, vì em đã thử nhưng không được

"vậy khi code tìm được từ 2 files trở lên thì nó biết mở file nào?" : Vấn đề này nếu có ít file có thể giải quyết( điều chình cho phần sau dấu "*" khác nhau), nhưng nhiều file tương tự thì em chịu!
 
Trong thư mục chứa file của em chỉ có 1 file dạng đó, vấn đề của em đã được giải quyết nhờ đoạn code của Thầy
em hỏi trường hợp này để hiểu thêm xem VBA có cho phép làm như vậy không, vì em đã thử nhưng không được

"vậy khi code tìm được từ 2 files trở lên thì nó biết mở file nào?" : Vấn đề này nếu có ít file có thể giải quyết( điều chình cho phần sau dấu "*" khác nhau), nhưng nhiều file tương tự thì em chịu!
Về phần tìm kiếm, code vba giải quyết được cái vụ "*" của bạn
Mã:
Function FilesFoldersList(ByVal RootFolder As String, ByVal ListType As Boolean, _
                          ByVal Search As String, ByVal InSub As Boolean)
  'ListType = True: Get Files list
  'ListType = False: Get Folders list
  Dim sComm As String, tmp As String, str As String, tmpFile, Arr
  On Error Resume Next
  If Right(RootFolder, 1) <> "\" Then RootFolder = RootFolder & "\"
  str = """" & RootFolder & Search & """"
 
  With CreateObject("Scripting.FileSystemObject")
    tmpFile = .GetTempName
    'sComm = "DIR " & str & " /ON /B /A" & IIf(ListType, "-", "") & "D-S" & IIf(InSub, "/S", " ") & " >" & tmpFile
    sComm = "DIR " & str & " /ON /B /A" & IIf(ListType, "-", "") & "D" & IIf(InSub, "/S", " ") & " >" & tmpFile
    CreateObject("Wscript.Shell").Run "cmd /u /c " & sComm, 0, True
    With .OpenTextFile(tmpFile, 1, , -2)
      tmp = Trim(.ReadAll)
      If Right(tmp, 2) = vbCrLf Then tmp = Left(tmp, Len(tmp) - 2)
      If Len(tmp) Then
        If InSub = False Then tmp = RootFolder & Replace(tmp, vbCrLf, vbCrLf & RootFolder)
        FilesFoldersList = Split(tmp, vbCrLf)
      End If
      .Close
    End With
  End With
  Kill tmpFile
End Function
Áp dụng code trên để tìm theo cú pháp:
Mã:
FilesFoldersList(RootFolder, ListType, Search, InSub)
Trong đó:
- RootFolder: Là nơi chứa file mà bạn cần tìm
- ListType: là kiểu danh sách trả về. ListType = True sẽ lấy danh sách files. ListType = False sẽ lấy danh sách folders
- Search: Chuỗi tìm kiếm, cho phép gõ ký tự đại diện. Chẳng hạn là "*2017.xls" như bạn đề cập ở trên
- InSub: xác định có tìm trong thư mục con hay không
Ví dụ minh họa:
Mã:
arr = FilesFoldersList("D:\Excel", True, "*2017.xls", False)
Có nghĩa là tìm trong thư mục D:\Excel những files có đuôi dạng 2017.xls và không tìm trong thư mục con
Kết quả bạn nhận được từ hàm trên là 1 mảng chứa 1 hoặc nhiều giá trị. Nếu muốn lấy giá trị đầu tiên, cứ truy xuất arr(0) là ra
 
Về phần tìm kiếm, code vba giải quyết được cái vụ "*" của bạn
Mã:
Function FilesFoldersList(ByVal RootFolder As String, ByVal ListType As Boolean, _
                          ByVal Search As String, ByVal InSub As Boolean)
  'ListType = True: Get Files list
  'ListType = False: Get Folders list
  Dim sComm As String, tmp As String, str As String, tmpFile, Arr
  On Error Resume Next
  If Right(RootFolder, 1) <> "\" Then RootFolder = RootFolder & "\"
  str = """" & RootFolder & Search & """"
 
  With CreateObject("Scripting.FileSystemObject")
    tmpFile = .GetTempName
    'sComm = "DIR " & str & " /ON /B /A" & IIf(ListType, "-", "") & "D-S" & IIf(InSub, "/S", " ") & " >" & tmpFile
    sComm = "DIR " & str & " /ON /B /A" & IIf(ListType, "-", "") & "D" & IIf(InSub, "/S", " ") & " >" & tmpFile
    CreateObject("Wscript.Shell").Run "cmd /u /c " & sComm, 0, True
    With .OpenTextFile(tmpFile, 1, , -2)
      tmp = Trim(.ReadAll)
      If Right(tmp, 2) = vbCrLf Then tmp = Left(tmp, Len(tmp) - 2)
      If Len(tmp) Then
        If InSub = False Then tmp = RootFolder & Replace(tmp, vbCrLf, vbCrLf & RootFolder)
        FilesFoldersList = Split(tmp, vbCrLf)
      End If
      .Close
    End With
  End With
  Kill tmpFile
End Function
Áp dụng code trên để tìm theo cú pháp:
Mã:
FilesFoldersList(RootFolder, ListType, Search, InSub)
Trong đó:
- RootFolder: Là nơi chứa file mà bạn cần tìm
- ListType: là kiểu danh sách trả về. ListType = True sẽ lấy danh sách files. ListType = False sẽ lấy danh sách folders
- Search: Chuỗi tìm kiếm, cho phép gõ ký tự đại diện. Chẳng hạn là "*2017.xls" như bạn đề cập ở trên
- InSub: xác định có tìm trong thư mục con hay không
Ví dụ minh họa:
Mã:
arr = FilesFoldersList("D:\Excel", True, "*2017.xls", False)
Có nghĩa là tìm trong thư mục D:\Excel những files có đuôi dạng 2017.xls và không tìm trong thư mục con
Kết quả bạn nhận được từ hàm trên là 1 mảng chứa 1 hoặc nhiều giá trị. Nếu muốn lấy giá trị đầu tiên, cứ truy xuất arr(0) là ra


Em cảm ơn Thầy! Đoạn code trên với em hơi cao, nhưng em sẽ cố gắng tìm hiểu! Nếu có gì không hiểu em sẽ lại hỏi Thầy! ^_^!
 
Em cảm ơn Thầy! Đoạn code trên với em hơi cao, nhưng em sẽ cố gắng tìm hiểu! Nếu có gì không hiểu em sẽ lại hỏi Thầy! ^_^!
Khi bạn dùng hàm do anh Bill viết, chẳng hạn VLOOKUP, SUMIF.. bạn đâu có quan tâm source code ảnh vẽ rồng rắn gì trong đó mà bạn chỉ cần biết áp dụng đúng cú pháp do anh Bill đưa ra là đủ, đúng không?
Tương tự vậy cho code của tôi. Bạn hiểu thì tốt mà không hiểu cũng không sao, chỉ cần áp dụng đúng cú pháp là được rồi. Quá trình code chạy thể nào, code viết dài dòng hay khó hiểu... cứ kệ nó đi
 
Khi bạn dùng hàm do anh Bill viết, chẳng hạn VLOOKUP, SUMIF.. bạn đâu có quan tâm source code ảnh vẽ rồng rắn gì trong đó mà bạn chỉ cần biết áp dụng đúng cú pháp do anh Bill đưa ra là đủ, đúng không?
Tương tự vậy cho code của tôi. Bạn hiểu thì tốt mà không hiểu cũng không sao, chỉ cần áp dụng đúng cú pháp là được rồi. Quá trình code chạy thể nào, code viết dài dòng hay khó hiểu... cứ kệ nó đi

Cảm ơn Thầy...em sẽ làm như thế.....Nhưng em bị cái tật...cái gì mà hiểu không tới..khó chịu....^_^...
 
Cảm ơn Thầy...em sẽ làm như thế.....Nhưng em bị cái tật...cái gì mà hiểu không tới..khó chịu....^_^...
Code trên liên quan đến các kiến thức về DOS COMMAND.
Nếu bạn biết về MS DOS, bạn sẽ.. hiểu code trên
Vậy thôi
 
Cảm ơn Thầy...em sẽ làm như thế.....Nhưng em bị cái tật...cái gì mà hiểu không tới..khó chịu....^_^...
thời xưa mình và rất nhiều người cũng như bạn, giờ thì chịu không nhớ được các kiến thức mới, nên thấy hay là lưu lại, khi cần thì đem ra dùng
dùng lệnh dos xóa file phải cẩn thận với các tham số, thử lung tung nhiều khi phải cài lại máy tính
 

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

Back
Top Bottom