【问题标题】:How to Import a Sheet from an external Workbook AND use the Filename (WITHOUT the .datatype at the end ) as the New Worksheet name?如何从外部工作簿导入工作表并使用文件名(末尾没有 .datatype)作为新工作表名称?
【发布时间】:2018-08-11 02:55:12
【问题描述】:

如何从外部工作簿导入工作表并使用文件名(末尾没有 .datatype)作为新工作表名称?

末尾没有 .datatype 的部分我的意思是因为我可以使用 UBound 从文件路径中拆分文件名,但是当我尝试使用文件名和文件类型时最后,它不起作用并给我一个错误。也许我不明白 ubound 够了。

我在论坛的某个地方找到了这个 Sub。 但我不想导入任何工作表,除了与文件本身同名的工作表。所以我什至不确定您是否需要指定工作表名称。

所以我有这个带有 VBA 宏的 Excel 文件。并且工作表被称为空白(因为我不能有一个没有工作表的excel文件)和 我有一个用户表单按钮,我首先浏览文件,那里的工作表应该导入我的 Excel 文件并删除空白工作表并导入新的外部工作表。

此外,它应该从文件路径中导入任何工作表。因为名字总是不同的。

另外,如何将数据导入为 csv? 我正在谷歌搜索,但我看不出究竟是什么原因导致它在其他人的解决方案中被导入为 csv。

Sub ImportSheet()
   Dim sImportFile As String, sFile As String
Dim sThisBk As Workbook, wbBk As Workbook
Dim vfilename As Variant
Dim wsSht As Worksheet
Application.ScreenUpdating = False
Application.DisplayAlerts = False
Set sThisBk = ActiveWorkbook
sImportFile = Application.GetOpenFilename( _
FileFilter:="Comma Separated Value, *.csv", Title:="Open Workbook")
If sImportFile = "False" Then
    MsgBox "No File Selected!"
    Exit Sub

Else
    vfilename = Split(sImportFile, "\")
    sFile = vfilename(UBound(vfilename))



    Application.Workbooks.Open Filename:=sImportFile

    Set wbBk = Workbooks(sFile)

    With wbBk
        If SheetExists("GaebTesten.g42_2") Then
            Set wsSht = .Sheets("GaebTesten.g42_2")
            wsSht.Copy Before:=sThisBk.Sheets("Start")

        Else
            MsgBox "There is no sheet with name :US in:" & vbCr & .Name
        End If
        wbBk.Close SaveChanges:=False
    End With
End If
Application.ScreenUpdating = True
Application.DisplayAlerts = True
End Sub


Private Function SheetExists(sWSName As String) As Boolean
    Dim ws As Worksheet
    On Error Resume Next
    Set ws = Worksheets(sWSName)
    If Not ws Is Nothing Then SheetExists = True
End Function

这是我关于堆栈溢出的第二篇文章,我的第一个问题非常愚蠢,当我问第一个问题时,这是我使用 vba 的第二个小时。 我想我现在大约 30 个小时,我学到了很多东西。

问题:我现在也在用用户窗体在 VBA 中做这个 Excel 宏。但大多数情况下,我在谷歌上搜索如何做,并尝试在理解它的同时实现它,我不只是复制和粘贴代码。通常我只是逐行进行测试。 但是……你们怎么记得这一切? 如果我现在必须再次编写相同的程序,我将不知道该怎么做,因为我知道语法是如何工作的,但我不知道实际使用哪种语法和东西来达到预期的效果......

它来自重复同样的事情 = 经验吗? 或者你如何获得编码能力而不用谷歌搜索几乎每一件事?在观看 youtuber 直播他们如何编写代码时,他们从不在互联网上查找....

【问题讨论】:

  • 回答你问题的底部:一年前我不知道VBA,并通过尝试在这里回答尽可能多的问题来学习,即使它已经有了答案,把它烧进记忆。还有很长的路要走
  • 同时研究其他人的解决方案比我的更好。\
  • 既然你提到了UBound(array, dimension):这是一个返回指定维度数组的上限(=最高索引)的函数。如果你想操作字符串,你应该看看 VBA.Strings 命名空间,例如VBA.Strings.Left$ - 正如@urdearboy 已经指出的那样。关于在编程时查找内容。我必须一直这样做——这很正常。你经常做的事情会留在你的脑海中,你将能够快速完成它们。其他您会忘记并需要再次查找的内容。直到他们也坚持下去。 :)
  • 嗯,应该更仔细地查看您的源代码。 :D UBound 用于获取初始路径的最后一个片段,在每个反斜杠处都是 Split 之后。 Split 的结果将是一个字符串数组,这就是 UBound 在这种情况下有效的原因。

标签: excel vba


【解决方案1】:

让我向您介绍一种与纯字符串操作不同的方式:

设置一个新的reference to Microsoft Scripting Runtime。这将启用 Scripting 命名空间。有了它,您可以执行以下操作:

sImportFile = "C:\StackFolder\PrintMyName.xlsx"
With New Scripting.FileSystemObject
    Debug.Print .GetBaseName(sImportFile)
    ' Outputs "PrintMyName"
    Debug.Print .GetExtensionName(sImportFile)
    ' Outputs "xlsx"
    Debug.Print .GetFileName(sImportFile)
    ' Outputs "PrintMyName.xlsx"
    Debug.Print .GetDriveName(sImportFile)
    ' Outputs "C:"
    Debug.Print .GetParentFolderName(sImportFile)
    ' Outputs "C:\StackFolder"
End With

您可以构建一个小辅助函数来为您提供所需的文件名部分:

Public Function GetFilenameWithoutExtension(ByVal filename as String) as String
    With New Scripting.FileSystemObject
        GetFilenameWithoutExtension = .GetBaseName(filename)
    End With
End Function

并称之为:sFile = GetFilenameWithoutExtension(sImportFile)


关于在您的子程序中有趣地使用UBound,您甚至可以通过这种方式获取文件名(不带扩展名)——假设它不包含额外的点:

vfilename = Split(sImportFile, "\")
sFile = vfilename(UBound(vfilename))
SplitName = Split(sFile, ".")
FilenameWithoutExtension = SplitName(UBound(SplitName)-1)
Extension = SplitName(UBound(SplitName))

不过,这些都是纯粹的学术想法,我不建议这样做。

【讨论】:

    【解决方案2】:

    这里有两种方法可以提取不带文件扩展名的工作簿名称。在这里,我将删除扩展名.xlsx。如果扩展名是不变的,你可以硬编码它。如果没有,你也可以使用通配符


    MsgBox Left(wbBk.Name, Len(ThisWorkbook.Name) - 5)
    MsgBox Replace(wbBk.Name, ".xlsx", "")
    

    您可以使用类似

    的方式引用与工作簿同名的工作表
    Sheets(Left(wbBk.Name, Len(ThisWorkbook.Name) - 5).Copy
    Sheets(Replace(wbBk.Name, ".xlsx", "").Copy
    

    【讨论】:

      【解决方案3】:

      您可以使用InstrRev。从扩展所在的字符串末尾开始是有效的。

      Left$(wbBk.Name, InStrRev((wbBk.Name, ".") - 1)
      

      【讨论】:

        猜你喜欢
        • 2018-01-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-29
        • 1970-01-01
        • 2012-08-12
        相关资源
        最近更新 更多