Как ссылаться на ячейку в VBA, которая зависит от значения даты

Мне нужно обновить ежедневные объемы, рассчитанные с одного листа на таблицу с историческими данными.

Например: В листе 1 у меня есть дата в 1 ячейке и значение в соседней ячейке. На другом листе у меня есть несколько столбцов, где столбец А является датами, а остальные столбцы заполнены данными.

Мне нужен макрос, который ссылается на дату в листе 1 и вставляет значение в лист 2 в столбце B, соответствующее дате в листе 1.

Это код, который я использую сейчас, но он неэффективен.

Дата, которую я ищу, находится в ячейке sheet1 (1,2). Datematch – это в основном числовое значение, которое подсчитывает, как далеко вниз мне нужно будет компенсировать в sheet2 и DateValues ​​значение, которое я пытаюсь ввести в столбце В

Я хочу сделать это без использования значения Datematch

Sub testing() Set Datematch = Sheet1.Cells(1, 1) Set DateValues = Sheet1.Cells(2, 2) Sheet2.Activate Range("A1").Offset(Datematch, 1).Value = DateValues End Sub 

Джеймс Позвольте мне бросить это тоже вы, чтобы дать вам что-то для работы, а затем вернуться с другим вопросом, когда вам нужна помощь (не хотите, чтобы весь проект был создан для вас)

короткий код руки:

 Sub FindStuff() Application.ScreenUpdating = False Dim VariableToLookUp() as Variant 'i used all variants because i don't know what data you have Dim Results() as Variant Dim VariableWithValues() as Variant Dim I,II as long Redim Results(UBound(VariableToLookUp)) Set VariableToLookUp Range(Cell(1,1),Cell(LastRow,1) Set VariableWithValues Sheet2.Range(Cell(1,1),Cell(LastRow,2) 'this gets column2 For I = 0 to UBound(VariableToLookUp) For II = 0 to UBound(VariableWithValues) If VariableToLookup(I,1) = VariableWithValues(II,1) Then Results(I) = VariableWithValues(II,2) exit for endIf next next Sheet1.Range("B2").Activate For I = 0 to Ubound(Results) ActiveCell.Offset(I,0).Value = Results(I) next Application.ScreenUpdating = True ) 

Теперь имейте в виду несколько вещей … 1 Я не тестировал это, так как надеюсь, что это будет больше для того, чтобы привести вас к следующему вопросу. и 2 у меня может быть неправильный синтаксис, но я обещаю правильные идеи или достаточно близко. Если вы опубликуете еще один вопрос, ответьте на это со ссылкой, чтобы я мог ее найти. В качестве побочного примечания, если вы можете установить обе таблицы или добавить логику для сортировки в каком-то порядке, вы можете получить реальные сложные функции поиска для ускорения их, я должен был проверить 3MM + номера против 90K в VBA, поэтому пришлось придумать некоторую логику индекса

Это похоже на то, что можно решить с помощью функции Lookup . Посмотрите на VLOOKUP или HLOOKUP. Или, если вы хотите изучить продвинутый метод, используйте INDEX (MATCH ()) .

Зависит от того, как и как часто этот исходный лист обновляется, будет другое лучшее решение. Поскольку вы не сказали, как обновляются исходные данные, я предполагаю, что это одна вещь, когда новые данные будут на разных листах.

Вам может не понадобиться макрос, основываясь на том, что у вас есть.
– Назовите диапазон исходных данных (статический или динамический), скажем, SourceRange
– Убедитесь, что они отсортированы в порядке возрастания (можно сделать в макрос)
– Затем в Col B другого листа используйте формулу
=IFERROR(VLOOKUP(<col A>,SourceRange,2,FALSE),0)

Чтобы проиллюстрировать это, я поставил все на одном листе:
иллюстрация

И поскольку вы не упомянули, как хранятся исторические данные при обновлении, ничего не сделано.

Этот подход будет изменяться в зависимости от того, как обновляются / извлекаются исходные данные и что делать со старыми данными.

Не удалось выяснить, как работать, используя значение cheat, то есть DateRow, которое в основном является функцией соответствия, которая возвращает мне, в какой строке находится моя дата.

 Sub InventoryUpdate() Set DateRow = Sheets("Inputs").Cells(40, 8) Set DateValues = Sheets("Inputs").Range("B40:F40") DateValues.Copy Sheets("Inventory").Activate Range("A1").Offset(DateRow - 1, 30).Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False End Sub 
Давайте будем гением компьютера.