AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / computer / 问题 / 1561938
Accepted
Kenny
Kenny
Asked: 2020-06-19 11:00:03 +0800 CST2020-06-19 11:00:03 +0800 CST 2020-06-19 11:00:03 +0800 CST

Excel 2016 宏将制表符分隔的 txt 文件导入到运行宏的工作簿中的特定工作表中?

  • 772

Excel 2016

你好

我有一个名为“Project”的工作簿和一个名为“Imported_Text”的工作表。

从在线资源和我自己有限的知识(反对可能性)生成了一个子(宏),它将打开用户选择的制表符分隔的 txt 文件,仅选择我需要的列,然后将其放在工作表中。一切正常,但是,Excel 总是创建一个新的工作簿并将导入的数据放入其中,这是我不想要的。

我需要能够从“项目”工作中运行子宏,并将导入的数据放入现有的“Imported_Text”工作表中,但我无法弄清楚如何。

我知道我可以录制宏,执行导入文本文件,当宏仍在录制时,手动选择并复制新工作表中的数据,将其粘贴到我的“Imported_Text”工作表中,保存我的“项目”工作簿,关闭保存 Excel 创建的新工作簿并停止宏录制。这会给我 VBA 代码来实现我的目标,但这似乎是一种相当复杂的做事方式。

任何人都可以提出更好的方法吗?

例如,数组的结果是否可以在将结果写入新文件并粘贴到我选择的工作表之前被捕获(到剪贴板?)?

这是我的代码 - 它远非优雅,但它有效,

Sub ImportTXT()
    Dim Answer As VbMsgBoxResult
    Dim fDialog As FileDialog, result As Integer
    Set fDialog = Application.FileDialog(msoFileDialogFilePicker)
    
'Optional: FileDialog properties
    fDialog.AllowMultiSelect = False
    fDialog.Title = "Select a file"
    fDialog.InitialFileName = "F:\"
    
'Optional: Add filters
    fDialog.Filters.Clear
    fDialog.Filters.Add "Text/CSV files", "*.txt"

    Answer = MsgBox("Are You Sure You Want To Import A Text File?", vbYesNo + vbCritical, "Import A Text File")
    If Answer = vbYes Then
        Application.ScreenUpdating = False

    FName = Application.GetOpenFilename()

' ImportTXT code copied from Macro recording
        Workbooks.OpenText FileName:=FName, Origin:=xlWindows, StartRow:=1, DataType:=xlDelimited, TextQualifier _
        :=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, Semicolon:= _
        False, Comma:=False, Space:=False, Other:=False, FieldInfo:=Array(Array _
        (1, 1), Array(2, 1), Array(3, 1), Array(4, 1), Array(5, 1), Array(6, 1), Array(7, 9), Array(8 _
        , 9), Array(9, 9), Array(10, 1), Array(11, 9), Array(12, 9), Array(13, 9), Array(14, 9), _
        Array(15, 9), Array(16, 9), Array(17, 9), Array(18, 9), Array(19, 9), Array(20, 9), Array( _
        21, 1), Array(22, 1), Array(23, 1), Array(24, 1), Array(25, 9)), TrailingMinusNumbers _
        :=True
    
    End If
End Sub
microsoft-excel vba
  • 3 3 个回答
  • 5213 Views

3 个回答

  • Voted
  1. Best Answer
    Ron Rosenfeld
    2020-06-20T08:29:47+08:002020-06-20T08:29:47+08:00

    这是一个修改代码的示例,它允许选择不同的文件,并将它们写入活动工作簿中的工作表。

    我使用 CSV 文件进行测试,但是:

    • 目的地是硬编码的,您可能想要更改它。
    • 您需要根据您的要求将分隔符从comma我用于测试的分隔符更改为tab
    • 您需要TextFileColumnDataTypes根据您的要求更改阵列。
    • 如果您希望目标是运行宏的工作表,则只需更改Set rDest = …为 Set rDest = ActiveSheet.Cells(row,column)
    Sub importText()
        Dim FName
        Dim rDest As Range
        Dim Answer As VbMsgBoxResult
        Dim fDialog As FileDialog, result As Integer
        Set fDialog = Application.FileDialog(msoFileDialogFilePicker)
        
    'Optional: FileDialog properties
        fDialog.AllowMultiSelect = False
        fDialog.Title = "Select a file"
        fDialog.InitialFileName = "F:\"
        
    'Optional: Add filters
        fDialog.Filters.Clear
        fDialog.Filters.Add "Text/CSV files (*.txt; *.csv)", "*.txt; *.csv", 1
        
        Answer = MsgBox("Are You Sure You Want To Import A Text File?", vbYesNo + vbCritical, "Import A Text File")
        If Answer = vbYes Then
            Application.ScreenUpdating = False
        Else
            Exit Sub
        End If
        
        FName = Application.GetOpenFilename(filefilter:="Text/CSV files (*.txt; *.csv),*.txt;*.csv", MultiSelect:=False)
        If FName = False Then Exit Sub
        
        Set rDest = Worksheets("sheet2").Cells(1, 1)
       
        With rDest.Worksheet.QueryTables.Add(Connection:= _
            "TEXT;" & FName, Destination:=rDest)
            .Name = "new 1_1"
            .FieldNames = True
            .RowNumbers = False
            .FillAdjacentFormulas = False
            .PreserveFormatting = True
            .RefreshOnFileOpen = False
            .RefreshStyle = xlInsertDeleteCells
            .SavePassword = False
            .SaveData = True
            .AdjustColumnWidth = True
            .RefreshPeriod = 0
            .TextFilePromptOnRefresh = False
            .TextFilePlatform = 437
            .TextFileStartRow = 1
            .TextFileParseType = xlDelimited
            .TextFileTextQualifier = xlTextQualifierDoubleQuote
            .TextFileConsecutiveDelimiter = False
            .TextFileTabDelimiter = False
            .TextFileSemicolonDelimiter = False
            .TextFileCommaDelimiter = True
            .TextFileSpaceDelimiter = False
            .TextFileColumnDataTypes = Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 1, 1)
            .TextFileTrailingMinusNumbers = True
            .Refresh BackgroundQuery:=False
        End With
    End Sub
    
    • 1
  2. Rajesh Sinha
    2020-06-19T21:41:42+08:002020-06-19T21:41:42+08:00

    这个 VBA 宏解决了这个问题。

     Sub ImportTXTFile()
    
      Dim vPath As Variant
      Dim wb As Excel.Workbook
      Dim ws As Excel.Worksheet
      Dim rng As Range, TextLine As String
      Dim rw As Long, col As Long
      Dim i As Long, j As Long, ary() As String, a As Variant
    
      Set wb = Excel.ActiveWorkbook
    
      vPath = Application.GetOpenFilename("TXT (Comma Separated) (*.Txt),*.Txt" _
         , 1, "Select the file", , False)
         
      MsgBox vPath
      
      Set rng = Application.InputBox(Prompt:="Pick the Sheet & a Cell", Type:=8)
      rng.Parent.Parent.Activate
      rng.Parent.Activate
      rw = rng(1).Row
      col = rng(1).Column
    
      Close #1
      i = rw
      Open vPath For Input As #1
      Do While Not EOF(1)
         Line Input #1, TextLine
         ary = Split(TextLine, ",")
         j = col
         For Each a In ary
            Cells(i, j).Value = a
            j = j + 1
         Next a
         i = i + 1
      Loop
      Close 1
    
     End Sub
    

    这个怎么运作:

    • 运行宏,显示文件选择器。
    • 选择文本文件。
    • 宏显示带有路径的文件,以 Ok 结束。
    • 它提示选择工作表和单元格以粘贴导入的数据。

    注意

    • 在此代码(*.Txt),*.Txt"中它也应该是可编辑的*.CSV。

    • 将工作簿另存为已启用宏。

    • 0
  3. James Owen
    2021-02-27T18:48:28+08:002021-02-27T18:48:28+08:00

    我制作了一个类似的宏,可以在单个操作中读取文件,并且它还在将项目放入单元格之前清理数据:

    Sub RoundedRectangle1_Click()
        Dim Ret
        Ret = Application.GetOpenFilename("Text Files (*.txt),*.txt")
        If Ret <> False Then
            readFile (Ret)
        End If
    End Sub
    
    Sub readFile(fname)
        Dim MyData As String, strData() As String, tabData() As String
    
        Open fname For Binary As #1
        MyData = Space$(LOF(1))
        Get #1, , MyData
        Close #1
    
        MyData = Replace(MyData, vbTab + vbTab, vbTab)
    
        strData() = Split(MyData, vbLf)
        For Row = 1 To UBound(strData) + 1
            tabData() = Split(strData(Row - 1), vbTab)
            For Column = 1 To UBound(tabData) + 1
                cellStr = Trim(tabData(Column - 1))
                If (Not cellStr = vbNullString) Then
                    Cells(Row, Column) = cellStr
                End If 
            Next
        Next
    End Sub
    

    笔记

    • 此代码将覆盖电子表格中的许多现有单元格,因此请注意
    • 我用单个选项卡替换了双选项卡,这解决了我的单元格放置问题。您可能需要更复杂的替代品
    • 双回路极限是根据经验得出的
    • 我必须对 windows txt 文件使用 vbLf,对 mac txt 文件使用 vbNl
    • 此代码从 1,1 开始放置单元格,但您可以更改它以满足您的需要

    您可以阅读我在我的网站上为我的开源项目编写的文章形式的此信息:https ://www.virtualtwigs.com/articles/excel_macro_import_tab_delim_txt_article

    • -1

相关问题

  • 如何对整列使用 Excel 的 LENGTH 函数?

  • Excel 数组(2 个变量)

  • 如何从 WSL 打开 office 文件

  • VBA根据文件名重命名工作表

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何减少“vmmem”进程的消耗?

    • 11 个回答
  • Marko Smith

    从 Microsoft Stream 下载视频

    • 4 个回答
  • Marko Smith

    Google Chrome DevTools 无法解析 SourceMap:chrome-extension

    • 6 个回答
  • Marko Smith

    Windows 照片查看器因为内存不足而无法运行?

    • 5 个回答
  • Marko Smith

    支持结束后如何激活 WindowsXP?

    • 6 个回答
  • Marko Smith

    远程桌面间歇性冻结

    • 7 个回答
  • Marko Smith

    子网掩码 /32 是什么意思?

    • 6 个回答
  • Marko Smith

    鼠标指针在 Windows 中按下的箭头键上移动?

    • 1 个回答
  • Marko Smith

    VirtualBox 无法以 VERR_NEM_VM_CREATE_FAILED 启动

    • 8 个回答
  • Marko Smith

    应用程序不会出现在 MacBook 的摄像头和麦克风隐私设置中

    • 5 个回答
  • Martin Hope
    CiaranWelsh 如何减少“vmmem”进程的消耗? 2020-06-10 02:06:58 +0800 CST
  • Martin Hope
    Jim Windows 10 搜索未加载,显示空白窗口 2020-02-06 03:28:26 +0800 CST
  • Martin Hope
    v15 为什么通过电缆(同轴电缆)的千兆位/秒 Internet 连接不能像光纤一样提供对称速度? 2020-01-25 08:53:31 +0800 CST
  • Martin Hope
    fixer1234 “HTTPS Everywhere”仍然相关吗? 2019-10-27 18:06:25 +0800 CST
  • Martin Hope
    andre_ss6 远程桌面间歇性冻结 2019-09-11 12:56:40 +0800 CST
  • Martin Hope
    Riley Carney 为什么在 URL 后面加一个点会删除登录信息? 2019-08-06 10:59:24 +0800 CST
  • Martin Hope
    zdimension 鼠标指针在 Windows 中按下的箭头键上移动? 2019-08-04 06:39:57 +0800 CST
  • Martin Hope
    jonsca 我所有的 Firefox 附加组件突然被禁用了,我该如何重新启用它们? 2019-05-04 17:58:52 +0800 CST
  • Martin Hope
    MCK 是否可以使用文本创建二维码? 2019-04-02 06:32:14 +0800 CST
  • Martin Hope
    SoniEx2 更改 git init 默认分支名称 2019-04-01 06:16:56 +0800 CST

热门标签

windows-10 linux windows microsoft-excel networking ubuntu worksheet-function bash command-line hard-drive

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve