如何在VBA中串联数字字符串

时间:2019-05-16 15:58:47

标签: vba

[更新]谢谢大家的指导。 我修改了如下代码。 但是宏没有运行,也没有产生任何错误。 我也不想对变量“ 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

``

2 个答案:

答案 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 index1是“对象”吗? 2,3是列索引吗?还是您是说object, column, index?即使对于知道值元组是什么的人也没有多大意义。听起来像R,您可以内联定义值元组。太酷了,但是VBA中没有值元组的概念,也没有内联对象。

如果需要一个对象,则可以在项目中添加一个类模块,并使用公共字段定义其公共接口来对其进行最少的定义:

'Class1
Option Explicit
Public Value As Long
Public Column As Long
Public Index As Long

然后,您可以使用NewSet foo = New Class1创建此类的新实例,然后分配和读取其属性,调用其方法:Debug.Print foo.Index, foo.Column, foo.Value


关于此:

columns = (num & num& ... &num)

请注意,某些标记具有多种语法目的; &是这样的令牌之一。在num & num中用空格包围时,它是字符串串联运算符

但是没有前导空格,例如num&,它是一个 type提示字符,它告诉编译器numLong整数,因此语法错误; 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才能使用此解决方案。

希望这会有所帮助。