2016-06-14 1174 views
-1

这是我的细胞是这样的:如何在vba中使用字符串作为变量?

enter image description here

这是我的代码,我会在下面解释它。

Sub Macro1() 
Dim product as String 
Dim group as Long 
Dim recordno as Long 
dim pol_number as Long 
dim plan_name as Long 

product = "corp" 
group = 1 
recordno = 1 
pol_number = 1 
plan_name = "TTT" 

Range("A2").Select 
For i = 1 to 5 
    ActiveCell.Value = Selection.End(xlUp).Value 
    ActiveCell.Offset(0,1).Select 
Next i 

End Sub 

我想用变量值填充所有的单元格。我知道变量不区分大小写,并且我明白,我拥有的代码只是将列中的文本填充到单元格的最上面的单元格中,但我不知道是否有一个函数会将文本顶部单元格并将其转换为变量。那可能吗?

+1

我不知道你想要做什么 - 你永远不引用该变量。您选择列A并将其设置为自己,因此它是PRODUCT。您需要参考产品' – Raystafarian

+0

您知道'Dir'将尝试在您的文件系统上通过该名称查找文件或文件夹吗?你想做什么? –

+0

VBA变量不区分大小写。你能尝试解释你想要做什么吗? – Raystafarian

回答

1

如果你这样做

someCell.Value = someOtherCell.Value 

someOtherCell.Value"product"然后someCell不会被填满你保存在变量product"product"(我包括引号,以强调这是它的一个串)。这是一件好事,因为如果你不小心在你的代码中加入了一些随机变量的名字,它会混淆你的代码。

如果你的要求是这样的:

  • 你有你下面写产品等的行中编写产品等值

  • 的标题并不总是以相同的顺序。

  • 您可能想稍后添加新的变量,而不会大惊小怪。

他们某种键控列表可能是你要找的。这意味着您可以使用名称来引用它们,而不是通过数字索引来引用变量。

如果订单是固定的,那么最好使用一个数组,其中第1项是产品名称,第2项是组号等,如ja72和Sgdva建议。

但是,如果你仍然想通过名称来引用变量,你可以使用一个集合:

Dim coll As New Collection 
With coll 
    .Add "corp", "product" 
    .Add 1, "group" 
    .Add 1, "recordno" 
    '... 
End With 

然后,而不是选择单元格和引用ActiveCell你应该直接(引用单元格使用选择和ActiveCell可以可避免大部分的时间和减慢宏,甚至可能会导致不必要的错误)

For i = 1 To 5 
    Cells(2, i).value = coll(Cells(1, i).value) 
Next i 

到集合的替代方案是一本字典它提供了一种简单的方法来检查,如果存在键(与交流ollection你必须赶上错误)

Dim dict As Object 
Set dict = CreateObject("Scripting.Dictionary") 
With dict 
    .Add "product", "corp" 
    .Add "group", 1 
    .Add "recordno", 1 
    '... 
End With 

现在你可以检查第一项存在,所以它不会引发错误:

For i = 1 To 5 
    If dict.Exists(LCase(Cells(1, i).value)) Then 'note that the dictionary keys are case sensitive 
     Cells(2, i).value = dict(LCase(Cells(1, i).value)) 
    Else 
     MsgBox "Entry for " & LCase(Cells(1, i).value) & " not found!" 
    End If 
Next i 

注意,当您使用dict("somekey")和进入"somekey"不存在,它不会抛出错误,但添加一个空条目。

+1

变量值改变,当他们改变时,他们会被写入一个新的行。你在最后给出的代码可以为此工作。但我只想查看所有列,并在当前行中放置与列标题对应的变量的新值。 –

+1

@JamesMarriott然后,您可以使用我给出的第一个示例并遍历列?我看到你编辑了你的代码,并在我有机会时调整我的答案。 – arcadeprecinct

+0

我从来没有意识到收藏。它不像变量那么容易,至少因为我不得不返回并替换所有的变量。但如果这是唯一的方式,我喜欢你的解决方案。非常感谢! –

0

我想你要完成能以这种方式

for j = 1 to 6 'Or whatever your last column happens to be 
    if UCase(cells(1, j)) = "PRODUCT" then 
     if ActiveCell.Column = j then 
      ActiveCell.Value = "corp" 
     end if 
    end if 
next j 

类似的东西来解决呢?

+0

为什么不'如果UCase(单元格(1,ActiveCell.Column))=“PRODUCT”那么ActiveCell.Value =“corp”'? – arcadeprecinct

+0

虽然我不清楚OP需要什么,但是在各行之间阅读时,我认为仅当活动单元位于标题正下方时才起作用是很重要的。 –

+0

经过OP的编辑,看起来很清楚,在这里不需要ActiveCell,应该避免。我只注意到你的例子中的循环是不需要的(尽管有必要解决op的问题),因为你可以取活动单元的列而不是循环,并检查你是否到达该列 – arcadeprecinct

1

为什么不是数组,然后根据需要循环遍历元素?

Dim ArrayTitles() As Variant 'since strings and numbers are mixed 
ReDim Preserve ArrayTitles(5) 
ArrayTitles(1) = "corp" 
ArrayTitles(2) = 1 
ArrayTitles(3) = 1 
ArrayTitles(4) = 1 
ArrayTitles(5) = "TTT" 

Range("A2").Select 
For i = 1 To 5 
MsgBox (ArrayTitles(i)) 
2

试试这个从变量去细胞

Dim values as Variant 
'Array 0 to 4 
values = Array(product,group,recordno,pol_number,plan_name)  
Range("A2").Resize(1,5).Value2 = values 

相反的是

Dim values as Variant 
'Array 1 to 5 
values = Range("A2").Resize(1,5).Value2 
product = values(1,1) 
group = values(1,2) 
recordno = values(1,3) 
pol_number = values(1,4) 
plan_name = values(1,5) 
+0

我对数组并不是很熟悉,所以我现在正在研究这个。是否有可能将数组放入数组中?否则,这是一个好主意,但不适用于我正在做的事情。 –

+0

是的,在VBA数组中可以包含可以包含其他数组的变体。实际上,由Range().Resize().Value2'语句返回的数组是一个二维数组,或者是一个数组数组 – ja72

+0

谢谢,这有助于很多。 –

相关问题