首页 > 解决方案 > 如何在VBA中连接数字字符串

问题描述

[更新] 谢谢大家的指导。我已将代码修改如下。但是宏没有运行,也没有产生任何错误。我也不想双引号变量“列”中的每个项目。非常感谢您的帮助。谢谢!

我的代码如下:

如果样本量为 80,我想生成 35 个随机列索引,如果样本量为 50,则生成 25,如果样本量为 32,则生成 20,如果样本量为 20,则生成 15。然后创建一个平均值和 sd 列。

    `
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

``

标签: vba

解决方案


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 indexas ,我可以使用(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&,它是一个类型提示字符,告诉编译器num是一个Long整数,因此语法错误;num& num和 .一样非法(42 17)


推荐阅读