копировать листы Excel со ссылками на таблицы - PullRequest
3 голосов
/ 03 февраля 2011

У меня есть документ Excel 2007 с несколькими листами, назовем его source.xls. Я хотел бы скопировать некоторые листы во все документы Excel в папке, скажем C:\some_folder.

Я понял, как перебрать каталог:

Dim file As String
file = dir("C:\some_folder\*.xlsx")
Do While file <> ""

   Rem do_stuff

   file = dir()
Loop

А как копировать листы между рабочими книгами:

For Each ws in ActiveWorkbook.Worksheets
    Dim wb as Workbook
    Set wb = Workbook.Open(file)
    ws.Copy , wb.sheets(w.sheets.Count)
    wb.Close SaveChanges:=True
Next ws

Пока все хорошо.

Теперь один из листов содержит таблицу с внешними данными с SQL Server. Копирование это работает хорошо.

На другом листе данные в этой таблице обозначены как Table_MYSERVER_MYDB[[row][col]]. Когда я копирую его, ссылки автоматически превращаются в source.xls!Table_MYSERVER_MYDB[[row][col]]

UPDATE : Я просто пытался ссылаться на данные в таблице по листам и ячейкам, например, =Other_Sheet!A1. Все та же проблема, ссылка волшебным образом превращается в =[source.xls]Other_Sheet!A1.

ОБНОВЛЕНИЕ 2 : Следующая попытка состояла в том, чтобы получить доступ к ячейкам на другом листе с помощью =INDIRECT("Other_Sheet!"&CELL("address")), но, похоже, это вызывает ошибку в Excel 2007. Все ячейки будут иметь одинаковое значение. Попробуйте сами :)

Я бы хотел, чтобы листы в целевом документе ссылались на таблицу в той же книге. Как бы я это сделал?

Я открыт для других решений, кроме VBA

Ответы [ 2 ]

1 голос
/ 03 февраля 2011

Я сам все понял:

Моя последняя отчаянная попытка была использовать Поиск и Заменить по всем формулам для удаления [source.xls].

Вот тогда коллега по работе предложил использовать:

wb.ChangeLink Name:=source.xls NewName:=wb.Name Type:=xlExcelLinks

Именно то, что я искал!

0 голосов
/ 03 февраля 2011

Попробуйте это:

Sub CopyFormula()
Dim R1,R2 As Range

Set R1 = Workbooks("wb2.xls").Sheets(1).Range("A1")
Set R2 = Workbooks("wb1.xls").Sheets(1).Range("A1")

R1.Formula = R2.Formula
End Sub
...