2013-02-16 7 views
2

Так, в Лист1 у меня есть основания некоторых имен и это выглядит следующим образом:формула Excel в VBA код

enter image description here

В Лист2 я работаю с этими именами из Лист1. Я делаю это так, что я вводил значение Кода в столбце A, а в столбце B я получил имя, в столбце C получаю фамилию. Это выглядит следующим образом:

enter image description here

Я сделал это с помощью формул, введя его в строке формул. Для столбца A (или Name) я использовал эту формулу: =IFERROR(VLOOKUP(A2;Sheet1!A:C;2;FALSE);"") и для столбца B (или фамилия), я использовал этот: =IFERROR(VLOOKUP(A2;Sheet1!A:C;3;FALSE);""). Я перетащил эти формулы в строку 20, и он отлично работает.

Теперь, что я хотел бы сделать, это поместить эти формулы в код Excel VBA и их работу для отмеченного диапазона. Я только начал использовать VBA, и я не знаю, как это сделать в нем, попробовал что-то, но не работает, ..., я сделал это до сих пор. Я новичок в этой работе Excel/Macro/VBA, поэтому любая помощь будет оценена по достоинству.

+0

Что именно вы хотите от макроса? если вы хотите разместить формулу в диапазоне, вы можете попробовать что-то вроде «Range (« B2: B20 »). Formula =« = IFERROR (VLOOKUP (A2, Sheet1! A: C, 2, FALSE) », "") "' –

+1

Показать код «Excel VBA» (указать контекст) и объяснить *, как это не работает. – 2013-02-16 23:05:07

+0

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

ответ

1

Ниже код будет работать, если вы наберете в ваших Code значений в sheet2 и выделить их, и запустить этот макрос:

Selection.Offset(0, 1).FormulaR1C1 = "=IFERROR(VLOOKUP(RC[-1],Sheet1!C[-1]:C,2,FALSE),"""")" 
Selection.Offset(0, 2).FormulaR1C1 = "=IFERROR(VLOOKUP(RC[-2],Sheet1!C[-2]:C,3,FALSE),"""")" 
Selection.Offset(0, 1).Value = Selection.Offset(0, 1).Value 
Selection.Offset(0, 2).Value = Selection.Offset(0, 2).Value 

Edit: Если вы желаете, чтобы обновить значения, как вы набираете использование (спасибо @PeterAlbert для дополнительной оптимизации):

Private Sub Worksheet_Change(ByVal Target As Range) 

    'end if the user made a change to more than one cell at once? 
    If Target.Count > 1 Then End 

    'stop system activating worksheet_change event while changing the sheet 
    Application.EnableEvents = False 

    'continue if column 1(A) was updated 
    'and 
    'dont continue if header or row 1 was changed 
    If Target.Column = 1 And Target.Row <> 1 Then 

     With Target.Offset(0, 1) 'alter the next cell, current column +1 (column B) 

      'RC1 = current row and column 1(A) e.g. if A2 was edited, RC1 = $B2 
      'C1:C2 = $A:$B 
      .FormulaR1C1 = "=IFERROR(VLOOKUP(RC1,Sheet1!C1:C2,2,FALSE),"""")" 
      .Value = .Value 'store value 
     End With 

     With Target.Offset(0, 2) 'alter the next cell, current column +2 (column C) 

      'C1:C3 = $A:$C 
      .FormulaR1C1 = "=IFERROR(VLOOKUP(RC1,Sheet1!C1:C3,3,FALSE),"""")" 
      .Value = .Value 'store value 
     End With 

    End If 

    Application.EnableEvents = True 'reset system events 
End Sub 

Explinatioin РЦ:

Типы формул FormulaR1C1 полезны при обращении к ячейке относительно текущей ячейки. Там несколько правил, чтобы помнить:

  • The R стенды для Row и C для столбца и после того, как целое число, если таковые имеются, определяет строку или столбец;
  • В качестве основы формула RC сама ссылается;
  • Любое число, следующее за R или C, скрещенное в [] является смещением к себе, например. если вы находитесь в ячейке A1 и используете R[1]C[1], вы будете ссылаться на ячейку B2;
  • Также любое число, следующее за R и C, является точным, например. если вы ссылаетесь на R2C2 независимо от того, в какой ячейке вы находитесь, укажите также B2; и

Чтобы усложнить ситуацию, если вы были в камере C5, например.используя Range("C5").FormulaR1C1 = и закодировал follwing:

  1. "=RC[-1]" ссылки клеток B5
  2. "=RC1" ссылки на ячейки A5, более справедливо $A5
  3. "=R[1]C[-2]" ссылки клеток A6
  4. "=Sum(C[-1]:C5)" является =Sum(B:E), более справедливо =Sum(B:$E)
+0

Спасибо за это! Этот код действительно делает то, что мне нужно, но выбор продолжает идти до конца столбцов. Я поместил это в процедуру Worksheet_Change, и это произошло. вы знаете, почему? Как это решить? – Sylca

+1

@glh: Два варианта улучшения: 1. Используйте оператор 'WITH Selection' 2. Вместо' rng.Copy/rng.PasteSpecial' просто используйте 'rng.Value = rng.Value' –

+1

@Sylca, это потому, что метод Я использовал изменения значений и как таковой бесконечный цикл будет происходить до тех пор, пока не будет достигнут последний столбец. – glh

2

Если я правильно понимаю ваши вопросы и комментарии, вы хотите, чтобы столбцы B & C всегда показывали правильные значения на основе вашей формулы, но также хотели бы защитить (и, возможно, даже скрыть формулу) от пользователей.

Я бы предположил, что вместо этого вы используете защиту листа: все, что вам нужно сделать, это разблокировать ячейки, которые вы хотите, чтобы пользователи редактировали, т. Е. Выбрать столбец A и в диалоговом окне «Формат ячеек» снять отметку «Заблокировано» в поле «». вкладка. Аналогично для столбцов B & C, отметьте «Скрытый». Теперь щелкните правой кнопкой мыши имя листа и выберите Защитный лист. Как только это будет сделано, пользователь может отредактировать столбец A - но не увидит формулу в B & C и не сможет редактировать эти ячейки.

Если по каким-то причинам вам нужно, чтобы обеспечить это в VBA, используйте следующий код:

Private Sub Worksheet_Change(ByVal Target As Range) 
    Application.EnableEvents = False 'to prevent endless loop 
    With Target.Offset(, 2 - Target.Column).Resize(, 2) 
     .FormulaR1C1 = "=IFERROR(VLOOKUP(RC1,Sheet1!C1:C3,COLUMN(RC),0),"""")" 
     .Value = .Value 
    End With 
    Application.EnableEvents = True 
End Sub 

Вы должны поместить это в модуле листа.

+0

Я бы хотел убедиться в этом в VBA! Причинами являются, например, то, что я не знаю, как клетки SUMPRODUCT, в которых есть формулы. Еще один, если я перетащил формулу на следующую страницу, эта страница будет активной, и мне это не понадобится. – Sylca

+0

Кроме того, в вашем ответе вы взяли значение из строки B из Sheet1. Как взять значение из столбца C из Sheet1? Я не совсем понимаю, как вы ссылаетесь на определенный столбец/строку/ячейку. Еще раз спасибо за ваши усилия, вы от большой помощи для меня !!! Благодаря!!! – Sylca

+0

Вы можете применить SUMPRODUCT к ячейкам с формулами так же, как и применять их к значениям! Не уверен, что я понимаю вашу проблему с перетаскиванием формулы (макрос в ответе тоже не обратится к этому вопросу.) В отношении формулы: я объединил обе формулы в одну - я заменил «2» и «3» соответственно на ' COLUMN (RC) '. Это вернет номер столбца ячейки, т. Е. '2' в столбце B и' 3' в столбце C. –

Смежные вопросы