返回列表 上一主題 發帖

VBA 抓取ListBox中的內容

回復 40# samwang
那如果直接把機1、機2那個資料夾當預設的資料夾呢?

TOP

本帖最後由 samwang 於 2021-7-6 20:20 編輯

回復 41# wang077

還是有問題,因為無法得知機1機2的路徑,所以無法開啟檔案,除非是固定路徑或與程式檔案放同一個路徑,
另外您10樓說有好多個機台,那為什麼現在只有預設機1機2?是另外需求嗎?

TOP

回復 42# samwang
因為機1,機2是我抓出來當範例用,之後如果完成還會加入更多
那如果資料夾的路徑是固定的,檔案也都固定放在資料夾裏的話呢?

TOP

回復 43# wang077

提供2種方法,請測試看看,謝謝

Private Sub UserForm_Activate()
Dim fs, f, fc, xD, a
Set fs = CreateObject("Scripting.FileSystemObject")
Set xD = CreateObject("Scripting.Dictionary")
'a = ThisWorkbook.Path  '程式檔與資料檔放同一個資料夾
a = "D:\test"                       '資料檔放在固定路徑
fnorg = ActiveWorkbook.Name
Set f = fs.GetFolder(a)
Set fc = f.Files
For Each f1 In fc
    n = n + 1
    If InStr(f1.Path, fnorg) Then GoTo 99
    Arr(n, 1) = f1.Path
    Arr(n, 2) = Split(f1.Name, ".")(0)
    xD(Arr(n, 2) & "") = ""
99: Next
Me.ListBox1.List = xD.keys
Set fs = Nothing: Set f = Nothing: Set fc = Nothing: Set xD = Nothing
EndSub:
End Sub

TOP

回復 44# samwang
Application.ScreenUpdating = False
Application.DisplayAlerts = False
Application.AskToUpdateLinks = False
fileorg = ActiveWorkbook.Name
Set xD = CreateObject("Scripting.Dictionary")
For i1 = 1 To n1
    If Not xD.Exists(Ar(i1, 1) & "") Then
        xD(Ar(i1, 1) & "") = ""
        For i = 1 To n
            If Arr(i, 2) = Ar(i1, 1) Then n2 = n2 + 1: Ar1(n2, 1) = Arr(i, 1)
        Next
    End If
Next
R = 1: Sheets("6月份數據").Select
With Sheets("6月份數據")
    If .FilterMode Then .ShowAllData
    .Range("a1:AA" & .[a65536].End(3).Row).Delete
    Tm = Timer
    For i1 = 1 To n2
        Set WB = Workbooks.Open(Ar1(i1, 1))
        With Sheets("6月份數據")
            If .FilterMode Then .ShowAllData
            fn = Split(ActiveWorkbook.Name, ".")(0)
            .Range("a1:z" & .[a65536].End(3).Row).Copy Workbooks(fileorg).Sheets("6月份數據").Range("a" & R)
        End With
        WB.Close
        .Range("U" & R & ":U" & .[a65536].End(xlUp).Row) = fn
        R = .[a65536].End(xlUp).Row + 1
    Next
End With
MsgBox "資料複製完成" & Timer - Tm & "秒"
Erase Arr: Erase Ar
Unload Me

Application.ScreenUpdating = True
Application.DisplayAlerts = True
Application.AskToUpdateLinks = True

複製資料的時候
Set WB = Workbooks.Open(Ar1(i1, 1))
這行出現了錯誤

TOP

回復 45# wang077
找到錯誤了,剛剛把程式檔放再同一個資料夾,所以出現錯誤
以解決這錯誤

TOP

回復 1# wang077
  1. With ListBox1
  2.           .ListStyle = 1  '序前方框框
  3. End With
複製代碼

TOP

本帖最後由 wang077 於 2021-7-7 10:40 編輯

回復 44# samwang
Private Sub ListBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
Application.ScreenUpdating = False
Application.DisplayAlerts = False
Application.AskToUpdateLinks = False
fileorg = ActiveWorkbook.Name
Set xD = CreateObject("Scripting.Dictionary")
For i1 = 1 To n1
    If Not xD.Exists(Ar(i1, 1) & "") Then
        xD(Ar(i1, 1) & "") = ""
        For i = 1 To n
            If Arr(i, 2) = Ar(i1, 1) Then n2 = n2 + 1: Ar1(n2, 1) = Arr(i, 1)
        Next
    End If
Next
R = 1: Sheets("6月份數據").Select
With Sheets("6月份數據")
    If .FilterMode Then .ShowAllData
    .Range("a1:AA" & .[a65536].End(3).Row).Delete
    Tm = Timer
    For i1 = 1 To n2
        Set WB = Workbooks.Open(Ar1(i1, 1))
        With Sheets("6月份數據")
            If .FilterMode Then .ShowAllData
            fn = Split(ActiveWorkbook.Name, ".")(0)
            .Range("a1:z" & .[a65536].End(3).Row).Copy Workbooks(fileorg).Sheets("6月份數據").Range("a" & R)
        End With
        WB.Close
        .Range("U" & R & ":U" & .[a65536].End(xlUp).Row) = fn
        R = .[a65536].End(xlUp).Row + 1
    Next
End With
MsgBox "資料複製完成" & Timer - Tm & "秒"
Erase Arr: Erase Ar

Application.ScreenUpdating = True
Application.DisplayAlerts = True
Application.AskToUpdateLinks = True
End Sub

   


大大,我把複製資料的程式碼丟進去ListBox1_DblClick裡面
可以直接選取ListBox來叫出資料,但我如果第一次點擊機1可以叫出機1的資料,我第二次點擊機2的時候
他又顯示這錯誤了
求解!

TOP

回復 47# s3526369
此問題已解決
感謝分享

TOP

回復 48# wang077


我測試沒問題,可附件讓我測試看看嗎? 謝謝

TOP

        靜思自在 : 【時間如鑽石】時間對一個有智慧的人而言,就如鑽石般珍貴;但對愚人來說,卻像是一把泥土,一點價值也沒有。
返回列表 上一主題