[更新]谢谢大家的指导。 我修改了如下代码。 但是宏没有运行,也没有产生任何错误。 我也不想对变量“ columns”中的每个项目都加双引号。 非常感谢您的帮助。 谢谢!
我的代码如下:
如果样本大小为80,我想生成35个随机列索引, 如果样本大小为50,则生成25;如果样本大小为32,则生成20;如果样本大小为20,则生成15。 然后为此创建平均值和标准差列。
`
Sub randomize1()
Dim wb As Workbook
Dim average As Range
Dim sd As Range
Dim columns As String
Dim values As Variant
Set wb = ActiveWorkbook
With wb
For i = 2 To 1730
Set average = Worksheets("CT").Range("CY2:CY1730")
Set sd = Worksheets("CT").Range("CZ2:CZ1730")
If WorksheetFunction.CountA(".Cells(i,11):.Cells(i,91)") = 80 Then
columns = "17 21 31 32 2 18 22 7 9 20 23 6 27 10 26 8 29 3 1 13 5 24 35 15 28 11 25 14 16 4 12 34 19 30 33"
values = Strings.Split(columns, " ")
.Cells(i, average).Value = Application.average(Range(i, columns).Offset(, 10).Select)
.Cells(i, sd).Value = Application.WorksheetFunction.StDev(Range(i, columns).Offset(, 10).Select)
ElseIf WorksheetFunction.CountA(".Cells(i,11):.Cells(i,91)") = 50 Then
columns = "1 22 17 5 18 8 20 9 10 6 25 14 13 7 2 3 19 16 4 12 15 11 24 23 21"
values = Strings.Split(columns, " ")
.Cells(i, average).Value = Application.average(Range(i, columns).Offset(, 10).Select)
.Cells(i, sd).Value = Application.WorksheetFunction.StDev(Range(i, columns).Offset(, 10).Select)
ElseIf WorksheetFunction.CountA(".Cells(i,11):.Cells(i,91)") = 32 Then
columns = "14 2 3 16 19 11 20 1 13 18 6 9 17 8 4 5 10 15 12 7"
values = Strings.Split(columns, " ")
.Cells(i, average).Value = Application.average(Range(i, columns).Offset(, 10).Select)
.Cells(i, sd).Value = Application.WorksheetFunction.StDev(Range(i, columns).Offset(, 10).Select)
ElseIf WorksheetFunction.CountA(".Cells(i,11):.Cells(i,91)") = 20 Then
columns = "13 8 7 2 1 12 11 6 14 15 3 10 4 5 9"
values = Strings.Split(columns, " ")
.Cells(i, average).Value = Application.average(Range(i, columns).Offset(, 10).Select)
.Cells(i, sd).Value = Application.WorksheetFunction.StDev(Range(i, columns).Offset(, 10).Select)
End If
Next i
End With
End Sub
``
答案 0 :(得分:2)
Dim columns As String columns = (17 21 31 32 2 18 22 7 9 20 23 6 27 10 26 8 29 3 1 13 5 24 35 15 28 11 25 14 16 4 12 34 19 30 33)`
表达式(17 21 31 ...)
不是文字String
。在VBA中(与许多其他语言一样),字符串文字用"
双引号(而不是括号)定界。
编译错误是因为无法计算表达式(integerLiteral integerLiteral integerLiteral ...)
,对编译器没有任何意义。我猜想它21
令人窒息,因为它,
是一个有效的表达式,因此期望使用)
列表分隔符或columns = (17)
右括号。
这将编译:
Dim columns As String
columns = "17 21 31 32 2 18 22 7 9 20 23 6 27 10 26 8 29 3 1 13 5 24 35 15 28 11 25 14 16 4 12 34 19 30 33"
...但是,这不是值的数组,而是一个字符串。 Split
模块中有一个VBA.Strings
函数,您可以使用该函数将字符串拆分为数组,并使用分隔符-例如空格字符:
Dim values As Variant
values = Strings.Split(columns, " ")
这为您提供了Variant/String
个项目的数组,以后可以根据需要迭代并转换为Long
个值。
在R中,如果要将
,可以使用c(1,2,3)
定义为object,column index
(1,2,3)
对于VBA专家来说,这种说法非常不清楚,很难理解-(1,2,3)
如何映射到object, column index
? 1
是“对象”吗? 2,3
是列索引吗?还是您是说object, column, index
?即使对于知道值元组是什么的人也没有多大意义。听起来像R,您可以内联定义值元组。太酷了,但是VBA中没有值元组的概念,也没有内联对象。
如果需要一个对象,则可以在项目中添加一个类模块,并使用公共字段定义其公共接口来对其进行最少的定义:
'Class1
Option Explicit
Public Value As Long
Public Column As Long
Public Index As Long
然后,您可以使用New
:Set foo = New Class1
创建此类的新实例,然后分配和读取其属性,调用其方法:Debug.Print foo.Index, foo.Column, foo.Value
。
关于此:
columns = (num & num& ... &num)
请注意,某些标记具有多种语法目的; &
是这样的令牌之一。在num & num
中用空格包围时,它是字符串串联运算符。
但是没有前导空格,例如num&
,它是一个 type提示字符,它告诉编译器num
是Long
整数,因此语法错误; num& num
与(42 17)
一样非法。
答案 1 :(得分:0)
在VBA中,引号""
之间的所有内容均为 String 。
如果只需要创建一个包含这些数字的字符串,则可以执行以下操作:
Dim columns As String
columns = "17 21 31 32 2 18 22 7 9 20 23 6 27 10 26 8 29 3 1 13 5 24 35 15 28 11 25 14 16 4 12 34 19 30 33"
如果需要分别处理这些数字,则需要一个数组,可以使用以下多种方法对其进行初始化。
经典方式
以固定大小声明数组,然后为其指定所需的值:
Dim myArray(1 to 34) As String 'Goes from 1 to 34
myArray(1) = 17 'First element
myArray(2) = 21 'Second element
'etc...
使用Array()命令
您可以使用有用的命令Array()通过内联命令初始化Array:
Dim myArray() As Variant
myArray = Array("17", "21", "31", "32", "2")
请注意,您的变量必须为Variant
才能使用此解决方案。
希望这会有所帮助。