【发布时间】: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在这种情况下有效的原因。