excel - 从两个工作簿复制到两个工作表
问题描述
我有一个文件夹,其中存储了两种类型的工作簿,它们是[person_name]-RESUME.xlsx
和
[person_name].xlsx
. 使用我的代码,用户可以选择这两个文件。
我希望单击工作簿上的按钮,选择这两个文件,将内容复制[person_name]-RESUME.xlsx
到 sheet1 并将内容复制[person_name].xlsx
到 sheet2,然后关闭这两个文件。
使用我的代码时出现错误Run-time error '91': Object variable or With block variable not set
,当我单击“调试”时,它会突出显示ElseIf
我的函数,我已经尝试打开单个文件的函数代码,它工作正常。贝娄是我的代码。
Sub opening_multiple_file()
Dim i As Integer
Dim myrange As Range
Dim n_rows_A As Long, n_rows_B As Long, n_rows As Long
'Opening File dialog box
With Application.FileDialog(msoFileDialogFilePicker)
'Enabling multiple files select
.AllowMultiSelect = True
.Filters.Clear
'Only Excel files can be selected
.Filters.Add "Excel Files", "*.xls*"
If .Show = True Then
For i = 1 To .SelectedItems.Count
'Opening selected file
Workbooks.Open .SelectedItems(i)
'Check if file is a resume
If InStr(.SelectedItems(i), "-RESUME") Then
n_rows_A = CountRows(myrange)
n_rows_B = CountRows(myrange.Offset(0, 1))
n_rows = WorksheetFunction.Max(n_rows_A, n_rows_B)
' Do the copy here
Sheets("Sheet1").Range("A1").Resize(n_rows, 12).Value = _
myrange.Resize(n_rows, 12).Value
Else
n_rows_A = CountRows(myrange)
n_rows_B = CountRows(myrange.Offset(0, 1))
n_rows = WorksheetFunction.Max(n_rows_A, n_rows_B)
' Do the copy here
Sheets("Sheet2").Range("A1").Resize(n_rows, 12).Value = _
myrange.Resize(n_rows, 12).Value
End If
Next i
End If
End With
End Sub
Function CountRows(ByRef r As Range) As Long
If IsEmpty(r) Then
CountRows = 0
ElseIf IsEmpty(r.Offset(1, 0)) Then
CountRows = 1
Else
CountRows = r.Worksheet.Range(r, r.End(xlDown)).Rows.Count
End If
End Function
我也想关闭新打开的工作簿。
解决方案
从另一个工作簿复制范围
- 如果其他东西有效,你可以在
For Next
循环中使用类似下面的东西,包括它下面的函数。
片段
Dim wb As Workbook
Set wb = Workbooks.Open(.SelectedItems(i))
myrange = getRange(wb.ActiveSheet, "A:B")
If InStr(.SelectedItems(i), "-RESUME") Then
' Do the copy here
ThisWorkbook("Sheet1").Range("A1") _
.Resize(myrange.Rows.Count, 12).Value = _
myrange.Resize(, 12).Value
Else
' Do the copy here
ThisWorkbook("Sheet2").Range("A1") _
.Resize(myrange.Rows.Count, 12).Value = _
myrange.Resize(, 12).Value
End If
wb.Close SaveChanges:=False
功能
Function getRange( _
aWorksheet As Worksheet, _
Optional ByVal ColumnAddress As String = "A", _
Optional ByVal FirstRowNumber As Long = 1) _
As Range
If Not aWorksheet Is Nothing Then
With aWorksheet
Dim rng As Range
Set rng = .Columns(ColumnAddress) _
.Resize(.Rows.Count - FirstRowNumber + 1) _
.Offset(FirstRowNumber - 1)
Dim cel As Range
Set cel = rng.Find( _
What:="*", _
LookIn:=xlFormulas, _
SearchOrder:=xlByRows, _
SearchDirection:=xlPrevious)
If Not cel Is Nothing Then
Set getRange = rng.Resize(cel.Row - FirstRowNumber + 1)
Else
' All cells below first row are empty.
End If
End With
Else
' Worksheet not defined.
End If
End Function
推荐阅读
- html - 为什么 div 会出现在主 div 容器之外?
- c# - 从 xamarin 中的列表视图中删除选定项目(使用 SQLite DB)
- r - 如何避免内容相似的长链
- visual-studio-code - Vs代码未在颤动中显示小部件结束注释
- javascript - 控制层中的传单清洁复选框
- r - 如何在 R 中分组排序这个数据框?
- c++ - 如何定义运算符重载函数来比较来自两个不同类的两个对象?
- javascript - 在 Angular 中的单击和显示场景中使用集合 - Angular 与 Blazor 方法
- node.js - Mongoose FindByIdAndUpdate 的奇怪行为 - 为什么它删除文档而不是更新?
- direct3d12 - D3D12 功能级别 12_2/终极其他功能