我有这个代码
Dim FileToOpen As Variant
Dim OpenBook As Workbook
FileToOpen = Application.GetOpenFilename("Text Files (*.txt), *.txt")
If FileToOpen <> False Then
Set OpenBook = Application.Workbooks.Open(FileToOpen)
OpenBook.Sheets(1).UsedRange.Select
Selection.NumberFormat = "@"
OpenBook.Sheets(1).UsedRange.Copy
ThisWorkbook.Worksheets("BOM").Range("C1").PasteSpecial xlPasteValues
OpenBook.Close False
End If
这是我尝试自动执行以下操作的方式:
最后,我得到了这种表(下图中的主工作簿具有.NumberFormat =“ @”):https ://i.stack.imgur.com/98tiC.png
但是,当我使用上面的代码运行它时,最终得到:
https://i.stack.imgur.com/bJahk.png
忽略第1行中的列标题。
我遇到的问题是,上面的代码在一个临时excel工作簿中打开已经丢失的前导“ 0”的.txt文件内容,然后从中将其复制到我的活动工作簿中。
我想知道是否有任何办法可以解决我想要完成的事情,即通过像现在一样通过显示搜索消息框的VBA代码正确地自动化上面列出的手动操作序列,然后选择一个.txt文件,需要并将所有内容从它获取到我的活动工作簿中,同时保持所有前导零(零的数量和字符串的长度可能会有所不同,因此没有将其重新添加回去的解决方案不是我想要的)
您遇到的问题是,一旦excel掌握了数据,就会产生问题。
因此,将其读取为文本文件并分割每一行,然后将其直接输出到您的目标范围-为此,它将停止excel将任何字符串解析为值-之后,您可以执行任何操作
option explicit
Sub read_text()
Dim FileToOpen As Variant
FileToOpen = Application.GetOpenFilename("Text Files (*.txt), *.txt")
Dim max_cols As Long
max_cols = 0
Dim r_out As Range
Set r_out = ThisWorkbook.Worksheets("BOM").Range("C1")
Dim row_offset As Long
offset = 0
If FileToOpen <> False Then
Dim fso As Object
Dim file As Object
Set fso = CreateObject("Scripting.FileSystemObject")
Set file = fso.OpenTextFile(FileToOpen, 1)
While Not file.AtEndOfStream
Dim line As String
line = file.ReadLine
Dim line_arr As Variant
line_arr = Split(line, vbTab)
ThisWorkbook.Worksheets("BOM").Range("C1").offset(row_offset, 0) _
.Resize(1, UBound(line_arr) - LBound(line_arr) + 1).Value = line_arr
row_offset = row_offset + 1
Wend
file.Close
End If
End Sub
输出
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句