2014-11-06 5 views
2

Я все еще новый ученик программирования VBA, и я столкнулся с проблемой, с которой я не могу найти решение. Я пытаюсь создать книгу для обработки рецептов. Я вызываю форму пользователя, используемую для добавления рецепта в макрос с несколькими вводами текстовых полей (~ 96 из них). Когда я ввожу все ингредиенты, количество, единицы и нажмите кнопку «ОК», я хочу, чтобы он написал, что находится в пользовательской форме на листе. Все текстовые поля имеют именование, заканчивающееся номером в порядке возрастания (например, .txtIngredient1, .txtIngredient2, ...). Можно ли использовать цикл for для копирования Me.txtIngredientX.Value в диапазон на листе?Excel VBA incrementing variable in for loop

Фрагмент моего текущего кода:

Sheets("Recipes").Range("B" & addatrow + 0) = Me.txtIngredient1.Value 
Sheets("Recipes").Range("B" & addatrow + 1) = Me.txtIngredient2.Value 
Sheets("Recipes").Range("B" & addatrow + 2) = Me.txtIngredient3.Value 
Sheets("Recipes").Range("B" & addatrow + 3) = Me.txtIngredient4.Value 
Sheets("Recipes").Range("B" & addatrow + 4) = Me.txtIngredient5.Value 
Sheets("Recipes").Range("B" & addatrow + 5) = Me.txtIngredient6.Value 
Sheets("Recipes").Range("B" & addatrow + 6) = Me.txtIngredient7.Value 
Sheets("Recipes").Range("B" & addatrow + 7) = Me.txtIngredient8.Value 
Sheets("Recipes").Range("B" & addatrow + 8) = Me.txtIngredient9.Value 
Sheets("Recipes").Range("B" & addatrow + 9) = Me.txtIngredient10.Value 
Sheets("Recipes").Range("B" & addatrow + 10) = Me.txtIngredient11.Value 
Sheets("Recipes").Range("B" & addatrow + 11) = Me.txtIngredient12.Value 
Sheets("Recipes").Range("B" & addatrow + 12) = Me.txtIngredient13.Value 

я попробовал единственное, что я знаю, чтобы сделать что-то вроде этого:

for i = 1 to 32 
    Sheets("Recipes").Range("B" & addatrow - 1 + i) = me.txtIngredient & i.value 

, который не работает. Примечание: addatrow - это переменная в макросе, которая определяет, где должен быть вставлен следующий рецепт.

Любая помощь очень ценится!

Спасибо!

+0

просто интересен, если 'диапазон ("B" и addatrow - 1 + я)', не должны be 'range (" B "& (addatrow - 1 + i))' ?? Кроме того, вы можете использовать 'Cells (addatrow - 1 + i, 2)' –

ответ

4

Попробуйте это:

Обратите внимание, что nameForm должно быть имя вашей формы, с Me, кажется, не работает.

for i = 1 to 32 
    Sheets("Recipes").Range("B" & addatrow - 1 + i) = nameForm.Controls("txtIngredient" & i).Value 
+0

Это сработало! превратили 90+ строк кода в 10! Спасибо! –

+1

@Jose, 'Me' работает до тех пор, пока вы находитесь на странице кода пользователя; для любого кода модуля sub вам нужно либо использовать глобальное имя Формы, либо передать его (от формы к модулю) в аргументе sub, как это: 'call Mysub (arg1, arg2, Me)', а затем в модуле: 'sub Mysub (byval arg1 as Long, byval arg2 как String, byref Form как UserForm)'. Обратите внимание, что 'Byref' там, чтобы сохранить изменения в UserForm. –

-1

Как насчет:

for i as integer = 1 to 32 
    for each c as control in me.controls 
     if typeof(c) is textbox andAlso c.name = "txtIngredient" & i.tostring then 
      Sheets("Recipes").Range("B" & addatrow - 1 + i) = c.value 
      exit for 
     end if 
    next c 
next i 

Хороший вопрос, я часто хотел сделать такую ​​вещь сама :)

(Это VB.NET код, не знаю, сколько из этой воли работать в VBA, надеюсь, что он работает)

+0

, почему цикл через элементы управления, если вы уже знаете его имя? Двойной цикл не имеет смысла. Кроме того, в VBA вам не нужно преобразовывать в строку, когда вы пишете «ffff» & i, ее автоматическое выполнение выполняется. –

+1

рядом ни с чем из этого не будет работать в VBA. VBA! = Vb.Net – RubberDuck

1

этот код должен быть связан с кнопкой ОК, в кодовой странице UserForm в:

Sub Button_OK_Click 'Assuming the 'Ok' button is called Button_Ok on the userform 

dim DATA() 'automatically declared as Variant, need to be Variant. 
dim Sh as worksheet 
dim i& ' declared as Long , this is our looping variable 
redim DATA (1 to 96, 1 to 1) 'a one colone array with 96 rows 
set Sh = thisworkbook.Sheets("Recipes") 

with Me 
    for i = 1 to 96 
     DATA (i,1) = .Controls("txtIngredient" & i).Value 
    next i 
end with 

with application 
    .screenupdating = false 
    .enableevents = false 
    .calculation = XlManual 
end with 


with Sh 
    .Range(.cells(addatrow,2) , .cells (addatrow+95 , 2)).value2 = DATA 'write it to the sheet in a single line 
end with 

erase DATA 
Set Sh = Nothing 

with application 
    .screenupdating = true 
    .enableevents = true 
    .calculation = XlAutomatic 
end with 

end sub 
+0

Я знаю, используя массив VBA и написание его одним махом - большой перебор, но мне нравятся вещи^^ –