Использовать макрос в excel для редактирования значений ячеек в другой таблице?

У меня есть проект Excel, который содержит 3 рабочих листа, а именно «Нездоровая пища», «Здоровая пища» и «Еда».

Две таблицы продуктов питания содержат список продуктов, а также их содержание жиров, белков и углеводов. Используя эти данные, также рассчитываются их калории на 100 граммов. Эти продукты разделены на 3 подзаголовка: продукты, закуски и напитки. Я хочу создать макрос, который будет запускаться с помощью кнопки «Добавить в еду» рядом с каждым продуктом питания на каждой таблице, который будет копировать содержимое строки в первую доступную строку в классе «Еда».

Возможно ли это сделать? Если да, то как?


person Josh    schedule 14.05.2011    source источник
comment
Обязательно ли иметь кнопку, которую нужно нажать?   -  person Alex P    schedule 14.05.2011


Ответы (1)


Проблема (на мой взгляд) с использованием кнопок для ссылки на ячейки на рабочем листе заключается в том, что кнопки являются объектами на рабочем листе, что делает получение их положения с точки зрения столбца/строки довольно сложным.

Вот подход грубой силы, если вы хотите использовать кнопки. Предположим, в Healthy Foods у вас есть следующее:

     A         B      C          D
1    Item      Fat    Protein    Sugar
2    Apple     0      50         5       |Add To Menu|  <-- this is a commandbutton called **Apple**
3    Snickers  100    0          100     |Add to Menu|  <-- this is a commandbutton called **snickers**

Следующий код скопирует данные в следующую доступную строку в Meal (NB — я предполагаю, что формат таблицы Meal такой же, как показано выше)

Private Sub Apple_Click()
    AddMealToMenu Range("A2") //For each button you must specify range where item is in table
End Sub

Sub AddMealToMenu(ref As Range)
    Dim mealItem As Range
    Set mealItem = Range(ref, ref.Offset(0, 3))
    mealItem.Copy Destination:=GetNextFreeRow
End Sub

Function GetNextFreeRow() As Range
    With Worksheets("Meal")
        If .Range("A2") = vbNullString Then
            Set GetNextFreeRow = .Range("A2")
        Else
            Set GetNextFreeRow = .Range("A1").End(xlDown).Offset(1, 0)
        End If
    End With
End Function

Для Snickers вам нужно будет добавить код simialr для Apple, т.е.

Private Sub Snickers_Click()
    AddMealToMenu Range("A3")
End Sub

Если это работает для вас, хорошо, но это может потребовать некоторой настройки и является подходом грубой силы.

person Alex P    schedule 14.05.2011
comment
Сработало отлично, спасибо :) Другой вопрос, скажем, я ищу пищу с наибольшим количеством белка, я знаю, что могу использовать формулу MAX, чтобы узнать, какая пища имеет самый высокий уровень белка, но как я могу заставить ячейку отображать название еды, а не уровень белка? - person Josh; 15.05.2011
comment
Вы имеете в виду кнопку на листе, которую вы нажимаете, и она выделяет пищу с наибольшим количеством белка? - person Alex P; 15.05.2011
comment
Нет, у меня есть небольшая таблица в нижней части рабочего листа, в которой нужно получить название продукта с самым высоким содержанием белка с помощью формулы, а не макроса. - person Josh; 15.05.2011
comment
@Remnant Итак, например, у меня есть продукты: апельсины, яблоки, миндаль и пицца, один под другим на рабочем листе, а в ячейке рядом с каждым продуктом указано содержание белка. Я могу использовать формулу МАКС из таблицы, о которой я говорил в предыдущем комментарии, которая будет выглядеть примерно так: =МАКС(D10,D11,D12,D13,D14) Проблема в том, что клетка покажет самое высокое содержание белка. содержание в виде числа (в данном случае 2100, что является значением D11), а не название продукта, в котором это содержание белка (это яблоко) - person Josh; 15.05.2011
comment
Предполагая, что ваши продукты содержат C10:C14, а белок – D10:D14, попробуйте следующее: =INDIRECT(ADDRESS(MATCH(MAX(D10:D14),D10:D14,0)+9,3)) - person Alex P; 15.05.2011
comment
@Remnant Что делать, если мои продукты относятся к A10: A14, а белки относятся к D10: D14? - person Josh; 15.05.2011
comment
Измените 3 в приведенной выше формуле на 1 - person Alex P; 15.05.2011