【问题标题】:How to copy column from user-chosen source workbook\worksheet\column to active target workbook\worksheet\column?如何将列从用户选择的源工作簿\工作表\列复制到活动目标工作簿\工作表\列?
【发布时间】:2016-12-08 07:02:33
【问题描述】:

源列在每个单元格中都包含一个字符串。有4000多个细胞。这些需要复制并粘贴到活动(调用宏的)工作簿的工作表中。用户应使用搜索/浏览弹出框选择源工作簿。

下面的代码做了一些接近我预期目标的事情,但是你看到的目录是静态的,这是不可接受的。用户手动选择源文件应该具有最大的灵活性。此外,我想防止每次文件夹/文件重命名/移动时文件路径都过时。有人告诉我应该使用Application.GetOpenFilename(),但是如何正确实现呢?

我对 VBA 的经验很少,我尝试修改此宏失败了,所以我想就此事征求您的意见。同样,以下代码运行良好,但不够灵活,无法实用。

编辑:问题已解决。查看最终的工作代码。

'MACRO TO READ-IN EXTERNAL EXCEL FILE FROM WHICH JOB NO.'S ARE EXTRACTED INTO USERFORM
Sub ReadDataFromCloseFile()
    'IN CASE OF ERROR SEND TO ERROR FUNCTION
    On Error GoTo ErrHandler
    
    'PREVENT OPENED EXCEL SOURCE FILE FROM SHOWING TO USER
    Application.ScreenUpdating = False
    
    'OPEN SOURCE EXCEL WORKBOOK IN "READ ONLY MODE"
    Dim SrcName As String
    Dim src As Workbook
    SrcName = Application.GetOpenFilename()
    Set src = Workbooks.Open(SrcName, True, True)
    
    'GET THE TOTAL ROWS FROM THE SOURCE WORKBOOK
    Dim iTotalRows As Integer
    iTotalRows = src.Worksheets("PROJECT LIST").Range("A1:A" & Cells(Rows.Count, "A").End(xlUp).Row).Rows.Count
    
    'COPY DATA FROM SOURCE WORKBOOK  -> DESTINATION WORKBOOK
    Dim iCnt As Integer     '(COUNTER)
    For iCnt = 1 To iTotalRows
        Worksheets("Test_File_8").Range("B" & (iCnt + 1)).Formula = src.Worksheets("PROJECT LIST").Range("A" & (iCnt + 1)).Formula
    Next iCnt

    'CLOSE THE SOURCE WORKBOOK FILE
    src.Close False 'FALSE = DONT SAVE THE SOURCE FILE
    Set src = Nothing  'FLUSH DATA

    'ERROR FUNCTION
    ErrHandler:
        Application.EnableEvents = True
        Application.ScreenUpdating = True
End Sub

【问题讨论】:

    标签: excel vba


    【解决方案1】:

    在下面查看我的更改。我添加了两个变量XstrSrcX 是用于循环遍历 .SelectedItems 的变体,strSrc 是最终保存路径的字符串。

        Sub ReadDataFromCloseFile()
    
        'Set variable to hold workbook path and workbook path string
           Dim X as Variant
           Dim strSrc as String
    
           With Application.FileDialog(msoFileDialogFilePicker)
              .InitialFileName = "" ' You can provide a base path here
              .Title = "Select file."
              .AllowMultiSelect = False
              If .Show = -1 Then
                  For Each X In .SelectedItems
                      strSrc = X
                      Exit For
                  Next X
              End If
           End With
    
        'IN CASE OF ERROR SEND TO ERROR FUNCTION
            'On Error GoTo ErrHandler
    
        'PREVENT OPENED EXCEL SOURCE FILE FROM SHOWING TO USER
            Application.ScreenUpdating = False
    
        'OPEN SOURCE EXCEL WORKBOOK IN "READ ONLY MODE"
            Dim src As Workbook
            Set src = Workbooks.Open(strSrc, True, True)
    
        'GET THE TOTAL ROWS FROM THE SOURCE WORKBOOK
            Dim iTotalRows As Integer
            iTotalRows = src.Worksheets("PROJECT LIST").Range("A1:A" & src.Worksheets("PROJECT LIST").Cells(Rows.Count, "A").End(xlUp).Row).Rows.Count
    
        'COPY DATA FROM SOURCE WORKBOOK  -> DESTINATION WORKBOOK
                Dim iCnt As Integer     '(COUNTER)
                For iCnt = 1 To iTotalRows
                    src.Worksheets("Test_File_8").Range("B" & (iCnt + 1)).Formula = src.Worksheets("PROJECT LIST").Range("A" & (iCnt + 1)).Formula
                Next iCnt
    
        'CLOSE THE SOURCE WORKBOOK FILE
            src.Close False             'FALSE = DONT SAVE THE SOURCE FILE
            Set src = Nothing           'FLUSH DATA
    
        'ERROR FUNCTION
         ErrHandler: Application.EnableEvents = True Application.ScreenUpdating = True End Sub
    
        'MACRO TO READ-IN EXTERNAL EXCEL FILE FROM WHICH JOB NO.'S ARE EXTRACTED INTO USERFORM
    

    【讨论】:

    • 凯尔,感谢您这么快的回复!可悲的是代码不起作用。发生的情况是源工作簿被打开并带到我的屏幕最前面,就像代码被破坏时通常所做的那样。 VBA 编辑器没有给出错误消息。
    • 代码是否打开所需的工作簿并复制/粘贴代码?
    • 源工作簿打开并保持打开状态。没有代码被复制/粘贴到目标工作簿中。没有 VBA 编辑器错误。
    • 查看我的更改。我敢打赌你有一个错误,但你的错误处理程序掩盖了它。您永远不应该使用错误处理程序进行开发。
    • 你是对的。 ErrHandler 正在抑制错误 9,现在您已将其注释掉。除此之外,源工作簿出现在屏幕上。没有任何内容被复制/粘贴到目标。错误 9 将此行标记为有问题:“ src.Worksheets("Test_File_8").Range("B" & (iCnt + 1)).Formula = src.Worksheets("PROJECT LIST").Range("A" & ( iCnt + 1)).公式"
    猜你喜欢
    • 1970-01-01
    • 2021-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多