2014-11-06 110 views
2

我仍然是VBA編程的新學習者,並且遇到了一個我似乎無法找到解決方案的問題。我正在嘗試創建一個工作簿來處理食譜。我打電話給一個用戶窗體,用來在一個宏中添加一個配方,並帶有幾個文本框輸入(〜96個)。當我輸入所有成分,數量,單位並按OK按鈕時,我希望它將用戶表單中的內容寫入工作表。所有文本框以升序命名(例如,.txtIngredient1,.txtIngredient2,...)。是否可以使用for循環將Me.txtIngredientX.Value複製到工作表上的範圍?for Excel循環中的Excel VBA增量變量

我目前的代碼片段:

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 + I)',不應該是'range(「B」&(addatrow - 1 + i))'?你也可以使用'Cells(addatrow - 1 + i,2)' – 2014-11-07 18:20:46

回答

4

試試這個:

注意nameForm必須是你的表單的名稱,隨着Me似乎不起作用。

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

這工作!將90多行代碼轉換爲10左右!謝謝! – 2014-11-07 00:38:54

+1

@Jose,只要您在用戶表單代碼的頁面中,「Me」對於任何模塊子代碼,您需要使用Form的全局名稱,或者將其從參數傳遞給sub,如下所示:'call Mysub(arg1,arg2,Me)',然後在模塊中:'sub Mysub(byval arg1 as Long,byval arg2 as String,byref Form as UserForm)''。注意'Byref'用於保存用戶窗體的任何更改。 – 2014-11-07 18:09:39

-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時,您不需要將其轉換爲字符串,應用程序自動執行此操作。 – 2014-11-07 18:19:11

+1

旁邊沒有可用的VBA。 VBA!= Vb.Net – RubberDuck 2014-11-07 18:44:01

1

這個代碼必須鏈接到OK按鈕,用戶窗體的代碼頁中:

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陣列並且一舉將其寫入是一件大事,但我喜歡快速的事情^^ – 2014-11-07 18:39:33