3

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

Обновить:

Благодаря приведенной ниже информации мне удалось найти некоторые дополнительные данные. У меня есть довольно грубый макрос, который работает, если пользователь вручную выбирает правильную ячейку. Теперь мне просто нужно выяснить, как автоматически выбирать текущую ячейку относительно текущей даты.

Sub Update_Deposits()  
'  
' Update_Deposits Macro  
'  

Dim selectedDate As String  
Dim rangeFound As Range  
selectedDate = Sheets("Summary Sheet").Range("F3")  
Set rangeFound = Sheets("Deposits").Cells.Find(CDate(selectedDate))  


Dim Total1 As Double  
Dim Total2 As Double  
Dim Total3 As Double  
Dim Total4 As Double  
Dim Total5 As Double  

  Total1 = Sheets("Summary Sheet").Range("E6")  
  Total2 = Sheets("Summary Sheet").Range("E7")  
  Total3 = Sheets("Summary Sheet").Range("E8")  
  Total4 = Sheets("Summary Sheet").Range("E9")  
  Total5 = Sheets("Summary Sheet").Range("E10")  

If Not (rangeFound Is Nothing) Then  
    rangeFound.Offset(0, 2) = Total1  
    rangeFound.Offset(0, 3) = Total2  
    rangeFound.Offset(0, 4) = Total3  
    rangeFound.Offset(0, 6) = Total4  
    rangeFound.Offset(0, 7) = Total5  
End If  

'  
End Sub  

Эта версия найдет первое значение на странице и заполнит значения:

Sub Update_Deposits()  
'  
' Update_Deposits Macro  
'  

Dim selectedDate As String  
Dim rangeFound As Range  
selectedDate = Sheets("Summary Sheet").Range("F3")  
Set rangeFound = Sheets("Deposits").Cells.Find(CDate(selectedDate))  

Dim Total1 As Double  
Dim Total2 As Double  
Dim Total3 As Double  
Dim Total4 As Double  
Dim Total5 As Double  

  Total1 = Sheets("Summary Sheet").Range("E6")  
  Total2 = Sheets("Summary Sheet").Range("E7")  
  Total3 = Sheets("Summary Sheet").Range("E8")  
  Total4 = Sheets("Summary Sheet").Range("E9")  
  Total5 = Sheets("Summary Sheet").Range("E10")  

If Not (rangeFound Is Nothing) Then  
    rangeFound.Offset(0, 2) = Total1  
    rangeFound.Offset(0, 3) = Total2  
    rangeFound.Offset(0, 4) = Total3  
    rangeFound.Offset(0, 6) = Total4  
    rangeFound.Offset(0, 7) = Total5  
End If  

'  
End Sub  

1 ответ1

1

Поскольку вы начинаете с макро-решения, я предполагаю, что у вас достаточно знаний в области программирования, чтобы объединить конечный результат; Итак, учитывая, что основные части, я думаю, вам нужно:

Начать

Убедитесь, что лента разработчика отображается, затем переключитесь на редактор VBA (Alt-F11).
Прочитайте эту страницу, чтобы получить общее представление о процессе; некоторые примеры могут быть очень близки к тому, что вы хотите (например, «Автоматическое создание файлов рабочей книги из данных рабочей таблицы»).

Чтение клетки

dim myVar1 as string
myVar1 = Sheets("Sheet1").Range("A1")

Это позволит читать из любой конкретной ячейки на любом конкретном листе.

Агрегирование значений ячеек

Dim myvar2 As Integer
myvar2 = Application.WorksheetFunction.Sum(Sheets("Sheet1").Range("B4:B6"))

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

Запись в камеру

Sheets("Sheet2").Range("A1") = myVar1

(просто обратное чтение)

Подключение макроса к кнопке на листе

После того, как вы создадите свой макрос, добавьте кнопку на свой мастер-лист, где это наиболее удобно, следуя этому руководству.

Удачи!

РЕДАКТИРОВАТЬ 1:

Запись на основе смещения

Чтобы записать в конкретную ячейку на основе смещения даты, вы можете использовать функцию DateDiff, чтобы получить расстояние до смещения, например:

Dim startDate As Date
Dim currDate as Date
Dim dateOffset As Integer

startDate = #10/21/2011#
currDate = Sheets("Summary Sheet").Range("F3")
dateOffset = DateDiff("d", startDate, currDate)

Затем вы можете написать в определенную ячейку так же, как вы уже:

ActiveSheet.Range("A1").Offset(0, dateOffset) = Total1
ActiveSheet.Range("A1").Offset(0, dateOffset+1) = Total2

так далее

РЕДАКТИРОВАТЬ 2:

Нахождение даты

Основываясь на вашем комментарии: вы можете найти дату на другом листе следующим образом:

Dim selectedDate As String
Dim rangeFound As Range
selectedDate = ActiveCell.Value
Set rangeFound = Sheet2.Cells.Find(CDate(selectedDate))

Очевидно, вы бы изменили Sheet2 на то, что вы хотели. Это даст вам адрес ячейки, содержащей дату в сводном листе. Если вы используете rangeFound.Address вы получите значение, аналогичное $D$9 . Если вы используете rangeFound.Row и rangeFound.Column вы получите фактические номера строк и столбцов. Обратите внимание, что у вас также есть адрес активной ячейки по тому же принципу (например, ActiveCell.Row) Оттуда вы можете копировать значения, используя что-то вроде

If Not (rangeFound Is Nothing) Then
    ActiveCell.Offset(0, 1) = rangeFound.Offset(0, 1)
    ActiveCell.Offset(0, 2) = rangeFound.Offset(0, 2)
End If

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .