2013-02-18 2 views
2

Я новичок в VBA, и мне не удается сделать то, что я хочу, хотя это очень просто.Используйте значение ячейки в функции VBA с переменной

Мне нужно автоматически изменить ячейки большой (333x333) пустой (полной нулей) таблицы.

В отдельной таблице у меня есть строка и столбец всех ячеек для изменения. (5000 из них)

A for Петля, похоже, подходит для этой цели.

Вот код моего макроса. Проблема появляется на линии до последней.

Dim val1 As String, val2 As String, i As Integer 

For i = 1 To 333 

    Sheets("Feuil2").Activate 
    ActiveSheet.Cells(i, 1).Select 

    val1 = Cells(i, 1).Value 
    val2 = Cells(i, 2).Value 

Sheets("Classeur2.csv").Select 
Cells(val1, val2).Select 

ActiveCell.FormulaR1C1 = "1" 

Next i 

Линия, которая вызывает проблему, это одно: Cells (VAL1, val2) .Select

Я считаю, что моя ошибка является синтаксической ошибкой. Но я не могу узнать, что я должен добавить до, после или вокруг двух переменных «val1» и «val2»

Как вы думаете?

Большое спасибо за помощь. Николас.

Редактировать

Моя проблема теперь решена:

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

ответ

3

Не нужно активировать или выбирать листы или ячейки, если вы используете VBA. Вы можете получить доступ ко всему этому напрямую. Код:

Dim rng As Range 
For Each rng In Sheets("Feuil2").Range("A1:A333") 
    Sheets("Classeur2.csv").Cells(rng.Value, rng.Offset(, 1).Value) = "1" 
Next rng 

производит один и тот же результат, как и код Джо.

Если вам нужно переключить листы по некоторым причинам, используйте Application.ScreenUpdating = False в начале вашего макроса (и Application.ScreenUpdating=True в конце). Это приведет к удалению экрана и ускорит выполнение.

+0

Спасибо, Питер, это хорошо знать. Я дам ему попробовать в следующий раз. –

+0

Ну, я должен вам большое спасибо! Сегодня мне пришлось масштабировать макрос, чтобы рассмотреть 5000 строк. Прошло более 20 минут, чтобы пройти первые 3000 строк. Я знаю это, потому что мне пришлось остановить макрос и попробовать ваше решение. Я использовал эти 20 минут, чтобы понять нотацию «Range». Это быстрее (около минуты сейчас). –

+0

Вы можете ускорить его еще больше, вставив 'Application.ScreenUpdating = False' и' Application.Calculation = xlCalculationManual'! В конце макроса сбросьте его с помощью «Application.ScreenUpdating = False» и «Application.Calculation = xlCalculationAutomatic» :-) –

0

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

Dim val1 As Integer, val2 As Integer, i As Integer 

For i = 1 To 333 

    Sheets("Feuil2").Activate 
    ActiveSheet.Cells(i, 1).Select 

    val1 = Cells(i, 1).Value 
    val2 = Cells(i, 2).Value 

Sheets("Classeur2.csv").Select 
Cells(val1, val2).Select 

ActiveCell.FormulaR1C1 = "1" 

Next i 
+0

Вы также можете попробовать эту петлю как цикл FOR EACH. Не большая разница, но немного легче читать. – Joe

+0

Спасибо большое, он работал как ожидалось :) –

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