vba - 如何在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
``
解决方案
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
as ,我可以使用(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)
。
推荐阅读
- html - 出现在未渲染网页上的 CSS 代码
- sql - 许多组的重叠日期最多为一种状态,最少为另一种状态
- reactjs - 使用带有 Typescript 的 React-Hook-Form 返回 React-Select 的值
- lme4 - 默认情况下不显示相关矩阵,因为 p = 91 > 12。如果需要,请使用 print(x, correlation=TRUE) 或 vcov(x)
- flutter - 使用 Flutter 应用程序登录 Salesforce CRM
- paypal - paypal api v2 - 每月订阅
- python-3.x - 如何在 Plotly 中的两个子图之间共享图例颜色
- r - 如何选择具有一定连续数的数据
- c# - 来自不同类的 Lambda 表达式中的多个 Where 子句
- python - 随机数,小数