Я очень запутался после того, как попытался выяснить, как это можно сделать. Это очень просто, но все же не могу найти решение.
Я хочу узнать следующее. У меня есть три отдельных документа, все из которых в какой-то степени связаны; данные вводятся из документа (1. основной ввод) и суммируются в трех электронных таблицах.
Каждый документ имеет идентичную структуру, единственными переменными факторами являются даты, а для основных входных данных у нас есть числовые значения.
В наглядном виде это выглядит так:
a. 1 Главный вход --> (входит в) 2,3 b. 2 --> (входит в) 3 и 4 c. 3 --> (входит в) 4
Что я хочу знать, так это то, что в документах 2,3 и 4... данные меняются каждый год. У меня есть много "гиперссылок" электронной таблицы в качестве примера:
2015 =" \Ежедневный доход\2015[Доход 2015.xls]Сводка по году'!$C$160"
2016 =" \Ежедневный доход\2016[Доход 2016.xls]Сводка по году'!$C$160"
2017 ="\Ежедневный доход\2017[Доход 2017.xls]Сводка по году'!$C$160"
Из вышесказанного единственная переменная, которую мне нужно изменить, это год. Есть ли какой-либо код/макрос и т. д., который я могу использовать для замены?ГОДвнутри гиперссылки. Имейте в виду, что путь к файлу будетвсегдаоставаться прежним.
Я полностью осознаю,найти и заменитьОднако я хочу сделать эту функцию удобной и простой в использовании.
Пожалуйста, помогите мне, спасибо!
решение1
Во-первых, вы продолжаете говорить о гиперссылках. Я думаю, вы имеете в виду формулы, которые ссылаются на другие файлы. Это не гиперссылки. Вот решение, если вы действительно имели в виду гиперссылки:
Отвечая на ваш фактический вопрос: Да, для этого есть макрос. Конечно. Я думаю, вам нужно знать об объекте Worksheet.Hyperlinks
. Вы можете перебрать каждую гиперссылку на каждом листе и заменить адрес на то, что вам нужно. Вот пример фрагмента:
Sub ChangeHyperlinks()
Dim ws As Worksheet
Dim hyp As Hyperlink
For Each hyp In ws.Hyperlinks
hyp.Address = Replace(hyp.Address, "2015", "2016")
Next
End Sub
Вам придется изменить его, если вы не хотите ничего менять.каждыйгиперссылку, добавляя условные операторы, например If InStr(1, hyp.Address, "\Daily Revenue\2015") Then
. Вы могли бы использовать Workbook_Open
событие для запуска при каждом открытии файла, выбрать нужный год на основе имени файла, а затем запустить замену для гиперссылок. Да, это сработаеткаждыйвремя открытия файла, даже если он уже правильный. В зависимости от того, сколько у вас гиперссылок, это может быть нормально или может все застопорить.
А вот фрагмент кода, если вы действительно имели в виду формулы. Опять же, вам придется адаптировать его больше под свои нужды, но это должно помочь вам начать.
Private Sub Workbook_Open()
Dim i As Integer
Dim srcArray As Variant
srcArray = ThisWorkbook.LinkSources(xlLinkTypeExcelLinks)
For i = 1 To UBound(srcArray)
Debug.Print srcArray(i)
ThisWorkbook.ChangeLink srcArray(i), Replace(srcArray(i), "2015", "2016")
Next
End Sub
Кроме того, если вы имели в виду формулы, то ваш вопрос является дубликатомПереполнение стека.
решение2
В вашем вопросе есть несколько двусмысленностей. Этот ответ предполагает, что вы говорите о ссылках на ячейки в других книгах, как показано в ваших примерах, а не о гиперссылках, и что задача состоит в том, чтобы настроить ссылки как регулируемые по году, а не переписывать все формулы каждый год.
Во-первых, вам где-то нужна ссылка на год. Неясно, когда или каким образом вы хотите, чтобы год менялся (автоматически 1 января каждого года? В выбранную вами дату? Вы хотите иметь возможность менять год в любое время?). Поэтому я буду основываться на общем решении. Выберите ячейку для хранения ссылки на год. Для своего примера я буду использовать ячейку Z1
рабочего листа, которая содержит ссылки на ячейки в вашем примере. Если вам нужна возможность менять год по желанию или в выбранную вами дату, просто введите Z1
четырехзначный год. Если вы хотите, чтобы год автоматически менялся 1 января, используйте =YEAR(TODAY())
.
Затем, вместо того, чтобы жестко кодировать год в каждой формуле, соедините ссылку Z1
и используйте функцию INDIRECT для преобразования текстовой строки в ссылку на ячейку. Например:
'\Daily Revenue\2015[Revenue 2015.xls]Year Summary'!$C$160 becomes
INDIRECT("'\Daily Revenue\"&Z1&"[Revenue "&Z1&".xls]Year Summary'!$C$160")
При наличии существующего рабочего листа вам нужно будет сделать единовременное изменение, чтобы изменить ссылки на ячейки. После этого вы сможете изменить год, когда захотите, изменив запись Z1
.