0

我正在尝试使用打开的文件填充列表框。整个过程会将选定的工作表从现有文件导出到另一个工作簿,并将其保存为附加到同一目录的日期时间戳。它根据表单列表框中的项目构建此导出名称和文件。

宏将从 Personal.XLSB 运行;问题是这成为活动工作簿,导出的文件从它继承路径和文件名。我想通过让用户从列表框中选择一个文件名来构建导出名称,但是我不希望 Personal.XLSB 显示在列表中,此外,一旦用户选择了文件名(从打开的列表中文件)我想让该文件成为活动文件。我花了三个小时进行许多变化的 INSTR(使用数字或仅使用文本)甚至文本比较,或者在下面的“instr”中使用“PERSONAL.xlsb”,但我根本无法让它工作。有没有过这样的一天??????

任何人都可以提供任何见解?

代码如下:

' Populate the open file name list box excluding Personal.xlsb

Dim wbOpen As Workbook
Dim wbopenText As String

ListBoxOpenFiles.Clear
    For Each wbOpen In Workbooks
    wbopenText = wbOpen.Name
    If InStr(1, wbopenText, "Per") = 0 Then
        ListBoxOpenFiles.AddItem wbOpen.Name    ' add the name to the list
        MsgBox wbOpen.Name & "Added to list"
    End If
    
    If InStr(1, wbopenText, "Per") = 1 Then ' If "Personal" is NOT found skip
    
    End If                                  'Loop again
Next
' next step - make the existing file the active workbook

'still to do
4

2 回答 2

0

所有这些都应该起作用(我是中间变量的忠实粉丝,但我认为wbopenText在这种情况下不需要该变量):

If StrComp("ABC", "personal.xlsb", vbTextCompare) = 0 Then
    ListBoxOpenFiles.AddItem wbOpen.Name 
End If

If wb.Name <> "PERSONAL.XLSB" Then
   ListBoxOpenFiles.AddItem wbOpen.Name
End If

If InStr(wb.Name, "PER") = 0 Then
    ' Dangerous as it would also skip "MySuperWorkbook"
    ListBoxOpenFiles.AddItem wbOpen.Name
End If

If InStr(1, wb.Name, "per", vbTextCompare) = 0 Then
    ' Also dangerous as it would also skip "MySuperWorkbook"
    ListBoxOpenFiles.AddItem wbOpen.Name
End If

If不需要您的第二个(除非您想对个人工作簿做一些特别的事情)。

有关说明,请参阅https://stackoverflow.com/a/45216693/7599798

要告诉您如何从 ListBox 中获取所选项目,您需要告诉我们列表框的位置:在工作表上?在用户窗体上?假设您能够自己获取所选名称并将其放入变量中SelectedWorkbook

Dim wb As workbook
set wb = workbooks(SelectedWorkbook) 
wb.Activate
Debug.Print wb.FullName 
于 2021-11-26T18:45:31.460 回答
0

谢谢你。我对此尝试了许多变体,包括您发送的变体。然后一分钱掉了,我的文件名是“PERSONAL.xlsb”,我将代码更改为:

新代码如下

'填充打开的文件名列表框,不包括 Personal.xlsb Dim wbOpen As Workbook Dim wbopenUcase As String

ListBoxOpenFiles.Clear
    For Each wbOpen In Workbooks
    wbopenUcase = UCase(wbOpen.Name)                    ' convert name to uppercase just in case Personal XLSB has different cases
  
        If wbopenUcase <> "PERSONAL.XLSB" Then
            ListBoxOpenFiles.AddItem wbOpen.Name            ' add the name to the list
        End If                                              'Loop again
    Next
于 2021-11-29T16:01:48.347 回答