在 VBA 中使用文件对话框
Posted
技术标签:
【中文标题】在 VBA 中使用文件对话框【英文标题】:Using filedialog in VBA 【发布时间】:2018-02-20 14:03:44 【问题描述】:我通常只是用谷歌搜索并最终找到答案,但这次我真的被困住了。我不太熟悉 VBA 及其工作原理,但了解了基本概念。
我想做的是从多个 .lvm 文件中收集数据并将其放入图表中。 .lvm 文件是具有制表符分隔列的文本文件,它们包含文本和十进制数字。
我想从文件对话框中选择几个文件并从文件中复制一列并将其放入图表中。我可以复制该列,但是当我将值复制为文本而不是数字时。当我通常在 Excel 中打开文件时,值的格式为“常规”,我可以从中制作图表。但是当文件被filedialog打开时,格式会发生一些事情。我的代码看起来像这样(到目前为止):
Private Sub CommandButton1_Click()
Dim fd As FileDialog
Dim FileChosen As Variant
Dim FileName As String
Dim i As Integer
Set fd = Application.FileDialog(msoFileDialogFilePicker)
'use the standard title and filters, but change the
'initial folder
fd.InitialView = msoFileDialogViewList
'allow multiple file selection
fd.AllowMultiSelect = True
FileChosen = fd.Show
If FileChosen = -1 Then
'open each of the files chosen
For i = 1 To fd.SelectedItems.Count
Workbooks.Open fd.SelectedItems(i)
Sheets(1).Range("B23:B" & Range("B23").End(xlDown).Row).Copy
Application.DisplayAlerts = False
ActiveWorkbook.Close
ThisWorkbook.Sheets("Sheet2").Activate
Sheets("Sheet2").Select
Sheets("Sheet2").Cells(1, i * 1).Select
ActiveSheet.Paste
Application.DisplayAlerts = True
Next i
End If
End Sub
我的来源看起来像这样:
"Lots of text until row 23"
0,1 0,2 0,4 0,5 0,7 0,8
0,9 0,2 0,5 0,2 0,1 0,1
0,1 0,2 0,4 0,5 0,7 0,8
0,9 0,2 0,5 0,2 0,1 0,1
0,1 0,2 0,4 0,5 0,7 0,8
0,9 0,2 0,5 0,2 0,1 0,1
0,1 0,2 0,4 0,5 0,7 0,8
原始文件中有很多行,小数点后有五位
【问题讨论】:
使用 Format 函数,例如 Format(50000, "#,##0.0"),其中 50000 可以是变量或单元格。 我在运行您的代码时没问题。请从您的输入中向我们展示几行。注意:您似乎在用荷兰语工作。您确定国际设置符合您的输入吗? (所以请向我们展示您的意见)。尝试将控制面板中的国际设置设置为美国。 在原帖中查看我的编辑 【参考方案1】:我可以想到两种方法来做到这一点。一种是在使用 VBA 粘贴数据后格式化单元格。但是,我建议您使用更简单的选项 - 粘贴作为值。这是语法的样子
Sheets(1).Range("B23:B" & Range("B23").End(xlDown).Row).Copy
ActiveSheet.Range("").PasteSpecial xlPasteValues 'Enter the range as you need
粘贴为值将帮助您保留所有格式。希望这会有所帮助。
【讨论】:
它不适用于 PasteSpecial,因为当我从源代码复制时,它是文本而不是数字。问题源于文件对话框。我可以在没有文件对话框的情况下很好地复制和粘贴 好的,然后看看在你的范围内使用这个是否有效ActiveSheet.Range("").NumberFormat = "General"
【参考方案2】:
您可以将 Range 的 NumberFormat
更改为 General
。见:https://msdn.microsoft.com/en-gb/vba/excel-vba/articles/range-numberformat-property-excel
不建议使用ThisWorkbook
或Active
。您可以在此处获取有关此主题的更多信息:How to avoid using Select in Excel VBA
你为什么说i*1
?我把它改成简单的i
这应该为你做:
Dim wb_main As Workbook
Dim wb_source As Workbook
Set wb_main = ThisWorkbook
...
For i = 1 To fd.SelectedItems.Count
Set wb_source = Workbooks.Open(Filename:=fd.SelectedItems(i))
wb_source.Sheets(1).Range("B23:B" & Range("B23").End(xlDown).Row).Copy
'Application.DisplayAlerts = False
wb_source.Close SaveChanges:=False
With wb_main.Sheets("Blad2")
.Cells(1, i).PasteSpecial xlPasteValues
.Columns(i).NumberFormat = "General"
End With
'Application.DisplayAlerts = True
Next i
你为什么使用Application.DisplayAlerts = False
?如果您不希望 Excel 询问是否应更改更改,您可以在关闭操作中添加 SaveChanges:=False
:wb_source.Close SaveChanges:=False
希望对你有帮助
【讨论】:
第一:我用i*1是因为其他原因我把它改成了i*10。我知道现在看起来很傻。第二:我使用“Application.DisplayAlerts = False”,因为 Excel 不断询问我是否要将数据保存到剪贴板。我正在复制很多单元格。我尝试了您的代码,但我收到一条错误消息,指出该对象不支持“.Cells(1, i).Paste”行中的属性或方法 我编辑了答案。我用PasteSpecial xlPasteValues
替换了Paste
。现在它应该可以工作了
正如我之前所说,我不习惯 VBA,但它也不适用于 PasteSpecial。我收到错误 1004“PasteSpecial-method in Range-class Failed”。【参考方案3】:
我发现自己出了什么问题!该问题实际上是由workbooks.open
引起的。不知何故,它没有响应分隔符,因此源文件以错误的方式导入。我改用workbooks.OpenText
解决了这个问题。
Workbooks.OpenText FileName:= _
fd.SelectedItems(i), DataType:=xlDelimited, Local:=True
Set wb_source = ActiveWorkbook'
【讨论】:
以上是关于在 VBA 中使用文件对话框的主要内容,如果未能解决你的问题,请参考以下文章