Как объединить строку чисел в VBA - PullRequest
0 голосов
/ 16 мая 2019

[Обновлено] Спасибо всем за руководство.Я изменил код, как показано ниже.Но макрос не запускался и не генерировал никаких ошибок.Я также не хотел ставить в кавычки каждый элемент в переменной «столбцы».Большое спасибо за любую помощь.Спасибо!

Мой код выглядит следующим образом:

Я хотел бы сгенерировать индекс 35 случайных столбцов, если размер выборки равен 80, а если размер выборки равен 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

``

Ответы [ 2 ]

2 голосов
/ 16 мая 2019
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"

... но тогда это не массив значений, это просто строка.В модуле VBA.Strings есть функция Split, которую можно использовать для разбиения строки на массив с использованием символа пробела:

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).

0 голосов
/ 16 мая 2019

В 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"

Если вам нужно обрабатывать эти числа индивидуально, вам нужен массив, который вы можете инициализировать несколькими способами.

Классический способ

Объявите массив с фиксированным размером, а затем присвойте ему нужные значения:

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 () для инициализации массива с помощью встроенной команды:

Dim myArray() As Variant
myArray = Array("17", "21", "31", "32", "2")

Обратите внимание, что ваша переменная должна быть Variant использовать это решение.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...