Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 如何从外部工作簿导入工作表,并使用文件名(末尾没有.datatype)作为新工作表名称?_Excel_Vba - Fatal编程技术网

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

Excel 如何从外部工作簿导入工作表,并使用文件名(末尾没有.datatype)作为新工作表名称?,excel,vba,Excel,Vba,如何从外部工作簿导入工作表,并使用文件名(末尾没有.datatype)作为新工作表名称 我的意思是,我可以使用UBound从文件路径中分割文件名,但当我尝试使用文件名和文件类型结尾时,它不起作用,并给我一个错误。也许我不明白 很好 我在论坛的某个地方找到了这个潜艇。 但是我不想导入任何工作表,除了与文件本身同名的工作表。因此,我甚至不确定是否需要指定图纸名称 所以我有这个Excel文件和VBA宏。该工作表被称为空白(因为我不能在excel文件中没有工作表),并且 我有一个用户窗体按钮,我首先浏览

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

我的意思是,我可以使用UBound从文件路径中分割文件名,但当我尝试使用文件名和文件类型结尾时,它不起作用,并给我一个错误。也许我不明白 很好

我在论坛的某个地方找到了这个潜艇。 但是我不想导入任何工作表,除了与文件本身同名的工作表。因此,我甚至不确定是否需要指定图纸名称

所以我有这个Excel文件和VBA宏。该工作表被称为空白(因为我不能在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小时了,我学到了很多

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

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

这里有两种方法可以提取不带文件扩展名的工作簿名称。在这里,我正在删除扩展名
.xlsx
。如果扩展名是常量,则可以对其进行硬编码。如果没有,也可以使用通配符


您可以使用以下方法引用与工作簿同名的工作表:

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

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

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

让我介绍一种不同于纯字符串操作的方法:

设定一个新的目标。这将启用
脚本
命名空间。使用它,您可以执行以下操作:

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=getfilenamwithoutextension(sImportFile)


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

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

然而,这些都是纯学术性的想法,我不建议这样做。

回答你问题的最后部分:一年前我还不知道VBA,我通过尝试回答尽可能多的问题来学习,即使它已经有了答案,也要将其铭记于心。还有很长的路要走所以研究其他人比我更好的解决方案有助于退出。\n因为您提到了
UBound(array,dimension)
:这是一个函数,返回指定维度中数组的上限(=最高索引)。如果要操作字符串,应该查看
VBA.strings
名称空间,例如@urderboy已经指向的
VBA.strings.Left$
。关于在编程时查找内容。我必须一直这样做——这很正常。你经常做的事情会留在你的脑海里,你会很快做到。其他你会忘记的事情,需要重新查找。直到它们也粘在一起。:)那么,我们应该更仔细地查看您的源代码:D
UBound
用于获取初始路径的最后一个片段,在每个反斜杠处对其进行
Split
之后。
Split
的结果将是一个字符串数组,这就是
UBound
在这种情况下工作的原因。
vfilename = Split(sImportFile, "\")
sFile = vfilename(UBound(vfilename))
SplitName = Split(sFile, ".")
FilenameWithoutExtension = SplitName(UBound(SplitName)-1)
Extension = SplitName(UBound(SplitName))