1. Presentación de la pregunta
Hay una plantilla de libro de trabajo 1, que tiene dos hojas de trabajo, la Hoja A y la Hoja B. Ahora es necesario copiar por lotes la hoja de trabajo B en el libro de trabajo 1 a casi cien otros libros de trabajo en el directorio actual, mantener el nombre de la hoja de trabajo original sin cambios y actualizar las fórmulas en ella para hacer referencia al contenido del libro de trabajo actual.
2. Análisis de algoritmos
Si copia y pega manualmente y luego usa el método de buscar y reemplazar para actualizar la fórmula, el formato de la hoja de trabajo puede cambiar y también será muy engorroso y consumirá mucho tiempo.
Así que considere usar VBA para resolver este problema en lotes. Los pasos del algoritmo son los siguientes:
- Para obtener el contenido de la hoja B en el libro de trabajo 1
- Recorra todos los archivos xls en el directorio actual y excluya el libro de trabajo 1.xls
- Después de abrir los archivos por lotes, cópielos, luego actualice las fórmulas y finalmente guárdelos.
3. Visualización de código
El siguiente es un programa escrito por VBA. Debe colocar este programa en el módulo recién creado en el libro de trabajo 1.xls y luego ejecutarlo.
Sub BatchCopyWorksheetFromAnotherWorkbook()
Dim fso As Object
Dim folderPath As String
Dim file As Object
Dim sourceWorkbook As Workbook
Dim targetWorkbook As Workbook
Dim targetWorksheet As Worksheet
Dim sourceWorksheet As Worksheet
Dim sourceWorkbookName As String
Dim sourceWorksheetName As String
' 获取当前目录路径
folderPath = ThisWorkbook.Path
' 创建FileSystemObject对象
Set fso = CreateObject("Scripting.FileSystemObject")
sourceWorkbookName = ActiveWorkbook.Path & "/工作簿1.xls" ' 替换为实际的源工作簿文件名
sourceWorksheetName = "工作表B" ' 替换为实际的源工作表名称
Set sourceWorkbook = Workbooks.Open(sourceWorkbookName)
' 遍历当前目录下的所有文件
For Each file In fso.GetFolder(folderPath).Files
' 排除文件名中包含"工作簿1.xls"的文件
If Not file.Name Like "*工作簿1.xls*" And file.Name Like "*.xls*" Then
' 打开源工作簿
Set targetWorkbook = Workbooks.Open(file.Path)
' 创建目标工作表
'Set targetWorkbook = ThisWorkbook ' 当前工作簿
'Set targetWorksheet = targetWorkbook.Sheets.Add(After:=targetWorkbook.Sheets(targetWorkbook.Sheets.Count))
'targetWorksheet.Name = "工作表B"
' 复制源工作表到目标工作簿
Set sourceWorksheet = sourceWorkbook.Sheets(sourceWorksheetName) ' 替换为实际的源工作表名称
'sourceWorksheet.Copy After:=targetWorksheet
sourceWorksheet.Copy After:=targetWorkbook.Sheets(targetWorkbook.Sheets.Count)
' 替换公式中的引用
targetWorkbook.Sheets(targetWorkbook.Sheets.Count).Cells.Replace What:="[工作簿1.xls]", Replacement:="", LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False
' 关闭源工作簿,不保存更改
targetWorkbook.Close SaveChanges:=True
End If
Next file
End Sub
4. Reflexión post-escolar
- VBA tiene ventajas obvias en el funcionamiento de Excel, especialmente en la copia de formato.
- Las referencias absolutas deben usarse en VBA, no las referencias relativas, de lo contrario, se puede informar un error.
- Habilitar antes de escribir: Opción Explícita, que requiere explícitamente que todas las variables se declaren por adelantado.
- VBA también es un lenguaje de programación orientado a objetos y tiene algo en común con Python, por lo que pueden aprender unos de otros.