如何从外部工作簿导入图纸并使用文件名(末尾没有.datatype)作为新的工作表名称?
最后带有没有.datatype的部分的意思是因为我可以使用UBound从文件路径中拆分文件名,但是当我尝试使用文件名和文件类型来做到这一点时最后,它不起作用,并给我一个错误。也许我不明白无处不在 很好。
我在论坛的某个地方找到了这个Sub。 但是,除了与文件本身名称相同的工作表之外,我不想导入任何工作表。因此,我什至不确定您是否需要指定工作表名称。
所以我有这个带有VBA宏的Excel文件。工作表称为空白(因为如果没有工作表,我将无法获得excel文件), 我有一个“用户窗体”按钮,我先在其中浏览文件,然后将其中的工作表导入到我的Excel文件中,然后删除“空白”工作表并导入新的“外部”工作表。
此外,它应该从文件路径导入ANY工作表。因为名称总是不同的。
而且,如何将数据导入为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宏。但是,大多数情况下,我会用Google搜索该怎么做,并在理解它的同时尝试实现它,而不仅仅是复制和粘贴代码。通常,我只是逐行进行测试。 但是...你们如何记住所有这些? 如果我现在必须再次编程相同的东西,我将不知道该怎么做,因为我知道一种语法如何工作,但是我不知道实际使用哪种语法和东西来达到预期的效果... < / p>
它是否源于重复相同的事情=经验? 或者,您如何在不搜索几乎每件事的情况下获得编码能力?观看YouTube直播流时,他们如何编码内容,他们从不在互联网上查找。...
答案 0 :(得分: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))
但是,这些纯粹是学术思想,我不建议这样做。
答案 1 :(得分:0)
这里有两种方法来提取不带文件扩展名的工作簿名称。在这里,我要删除扩展名.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
答案 2 :(得分:0)
您可以使用InstrRev
。从扩展名所在的字符串的末尾开始,这是有效的。
Left$(wbBk.Name, InStrRev((wbBk.Name, ".") - 1)