将文本文件导入主Excel文档(VBA)?

时间:2017-10-18 08:03:54

标签: excel-vba vba excel

我编写了一个代码,允许用户选择一个文件夹,然后循环遍历文件夹中的所有文件,将特定的数据列复制到我的主文档“PQ分析电子表格”中。

我想改进此代码,使其更通用。

有什么方法可以改变它,所以我不必指定'PQ分析电子表格'作为主文件吗?即所以无论用户希望如何都可以调用它。

此外,我目前将每个文件打开到一个新工作簿中,然后从那里复制。我确定必须有一种方法可以直接从txt文件输入到数组中,并从那里打印?

任何建议将不胜感激。这是我写的第一个VBA代码,所以我对这门语言很新!感谢。

Starting Jetty on port 8888
   [WARN] failed jsp
java.lang.ExceptionInInitializerError
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
    at java.lang.Class.newInstance(Class.java:442)
    at org.mortbay.jetty.servlet.Holder.newInstance(Holder.java:153)
    at org.mortbay.jetty.servlet.ServletHolder.doStart(ServletHolder.java:253)
    at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:39)
    at org.mortbay.jetty.servlet.ServletHandler.initialize(ServletHandler.java:616)
    at org.mortbay.jetty.servlet.Context.startContext(Context.java:140)
    at org.mortbay.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1220)
    at org.mortbay.jetty.handler.ContextHandler.doStart(ContextHandler.java:513)
    at org.mortbay.jetty.webapp.WebAppContext.doStart(WebAppContext.java:448)
    at com.google.gwt.dev.shell.jetty.JettyLauncher$WebAppContextWithReload.doStart(JettyLauncher.java:468)
    at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:39)
    at org.mortbay.jetty.handler.HandlerWrapper.doStart(HandlerWrapper.java:130)
    at org.mortbay.jetty.handler.RequestLogHandler.doStart(RequestLogHandler.java:115)
    at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:39)
    at org.mortbay.jetty.handler.HandlerWrapper.doStart(HandlerWrapper.java:130)
    at org.mortbay.jetty.Server.doStart(Server.java:222)
    at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:39)
    at com.google.gwt.dev.shell.jetty.JettyLauncher.start(JettyLauncher.java:672)
    at com.google.gwt.dev.DevMode.doStartUpServer(DevMode.java:509)
    at com.google.gwt.dev.DevModeBase.startUp(DevModeBase.java:1068)
    at com.google.gwt.dev.DevModeBase.run(DevModeBase.java:811)
    at com.google.gwt.dev.DevMode.main(DevMode.java:311)
Caused by: org.apache.commons.logging.LogConfigurationException: org.apache.commons.logging.LogConfigurationException: java.lang.NullPointerException (Caused by java.lang.NullPointerException) (Caused by org.apache.commons.logging.LogConfigurationException: java.lang.NullPointerException (Caused by java.lang.NullPointerException))
    at org.apache.commons.logging.impl.LogFactoryImpl.newInstance(LogFactoryImpl.java:543)
    at org.apache.commons.logging.impl.LogFactoryImpl.getInstance(LogFactoryImpl.java:235)
    at org.apache.commons.logging.impl.LogFactoryImpl.getInstance(LogFactoryImpl.java:209)
    at org.apache.commons.logging.LogFactory.getLog(LogFactory.java:351)
    at org.apache.jasper.servlet.JspServlet.<clinit>(JspServlet.java:58)
    ... 26 more
Caused by: org.apache.commons.logging.LogConfigurationException: java.lang.NullPointerException (Caused by java.lang.NullPointerException)
    at org.apache.commons.logging.impl.LogFactoryImpl.getLogConstructor(LogFactoryImpl.java:397)
    at org.apache.commons.logging.impl.LogFactoryImpl.newInstance(LogFactoryImpl.java:529)
    ... 30 more
Caused by: java.lang.NullPointerException
    at org.apache.commons.logging.impl.LogFactoryImpl.getLogConstructor(LogFactoryImpl.java:374)
    ... 31 more

example of txt document input

1 个答案:

答案 0 :(得分:0)

首先,选择文件的启动器,并开始导入每个文件:

Sub SelectFilesForImport()
    Dim fd  As FileDialog
    Dim i   As Long

    'set and determine file picker behaviors
    Set fd = Application.FileDialog(msoFileDialogFilePicker)
    fd.AllowMultiSelect = True

    'Launch file picker, exit if no files selected. 
    'Hold Ctrl to select multiple files. Ctrl+A to select all files
    If Not fd.Show = -1 Then Exit Sub

    'Start import selected files, file by file.
    For i = 1 To fd.SelectedItems.Count
        Call ImportFile(fd.SelectedItems(i))
    Next i
End Sub

第二个子行,逐行导入(不用在Excel中打开文件)

Private Sub ImportFile(ByVal FilePathAndName As String)
    Dim DataInTransit   As String
    Dim FileName        As String
    Dim N               As Integer

    N = FreeFile
    Open FilePathAndName For Input As #N
        Do While Not EOF(N)
            Line Input #N, DataInTransit

            ' ##################################################
            ' Up to this point, "DataInTransit" is a single line text.
            ' Now it depends on how you want to massage and put it into the worksheet.
            ' You can also skip lines which do not fit into context _
              by adding conditional IF statements.
            ' Modify below to suit your needs:
                Arr = Split(DataInTransit, ";")
                ActiveCell.Resize(1, UBound(Arr) + 1) = Split(DataInTransit, " ")
                ActiveCell.Offset(1).Activate
            ' ##################################################

        Loop
    Close #N
End Sub

对于放置导入的位置,我认为直接放入ActiveCell更简单,如上图第二个子所示,然后偏移到新行的下一行。但如果你有很多计算(可以通过自动计算来解决),它可能会很慢。否则,如您所建议的那样,使用数组来收集行,然后将它们全部放入工作表中。无论哪种方式,用户只需选择范围的左上角开始导入(提示消息要求他们选择单元格从哪里开始导入,这将是很好的,否则他们可能会陷入困境他们的整个工作表,p / s也允许他们取消提示中的宏以防万一)。这可以通过简单地将下面的行添加到第一个子中来完成。

    Dim k
    k = Application.InputBox("Please select where to place the import.")
    On Error GoTo Term 'If k is not a range, go to Term
    Range(k).Activate
    Exit Sub

    Term:
    End