我通常只是谷歌并最终找到答案,但这次我真的被卡住了。我不熟悉VBA以及它是如何工作的,但却得到了基本的想法。
我要做的是从多个.lvm文件中收集数据并将其放在图表中。 .lvm文件是带有制表符分隔列的文本文件,它们包含文本和十进制数字。
我想从filesialog中选择几个文件,然后从文件中复制一列并将其放在图表中。我能够复制列,但是当我将值复制为文本而不是数字时。当我在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
原始文件中有更多行,小数点分隔符后面有五位数
答案 0 :(得分:0)
我可以想到两种方法来做到这一点。一种方法是在使用VBA粘贴数据后格式化单元格。但是我建议你使用更简单的选项 - 粘贴作为值。这是语法的样子
Sheets(1).Range("B23:B" & Range("B23").End(xlDown).Row).Copy
ActiveSheet.Range("").PasteSpecial xlPasteValues 'Enter the range as you need
粘贴值可以帮助您保留所有格式。希望这会有所帮助。
答案 1 :(得分:0)
您可以将范围的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
希望这有帮助
答案 2 :(得分:0)
我发现自己出了什么问题!问题实际上是由workbooks.open
引起的。不知怎的,它没有响应分隔符,因此源文件以错误的方式导入。我使用workbooks.OpenText
来解决它。
Workbooks.OpenText FileName:= _
fd.SelectedItems(i), DataType:=xlDelimited, Local:=True
Set wb_source = ActiveWorkbook'