如何从保持前导“0”的 .TXT 文件中获取所有内容?
How to get all contents from .TXT file maintaining leading "0"?
我有这个代码
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
这就是我尝试自动执行以下手动操作的方式:
- 正在打开 .txt 文件
- Ctrl + a
- Ctrl + c
- 通过 VBA 代码将其粘贴到我的工作簿中,这在本例中无关紧要。
最后我得到了这种 table(下图中的主工作簿有 .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
输出
我有这个代码
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
这就是我尝试自动执行以下手动操作的方式:
- 正在打开 .txt 文件
- Ctrl + a
- Ctrl + c
- 通过 VBA 代码将其粘贴到我的工作簿中,这在本例中无关紧要。
最后我得到了这种 table(下图中的主工作簿有 .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
输出