programing

VBA(Excel) 루프 없이 전체 어레이 초기화

closeapi 2023. 5. 31. 15:56
반응형

VBA(Excel) 루프 없이 전체 어레이 초기화

저는 VBA가 상당히 생소하기 때문에 이것은 간단한 질문일 수 있지만 여기 있습니다.

배열을 .myArray 정수,VBA는 정수입니다.간단한 초기화를 통해 다음과 같은 작업을 수행할 수 있습니다.

Dim myArray
myArray = Array(1, 2, 4, 8)

그러나 어레이가 크면 이 작업이 번거로우므로 모든 요소를 동일한 값으로 초기화하려고 합니다.이상적으로는 다음과 같습니다.

myArray(:) = 0

저는 그것을 시도했지만 컴파일러가 불평했습니다.그리고 노력했습니다.myArray() = 0그리고 그것에 대해서도 불평했습니다.

누가 이걸 반복하지 않고 어떻게 하는지 설명해줄 수 있나요?가능하다면 한 문장으로 하고 싶습니다.

명확화:

배열의 모든 요소를 초기 값으로 초기화합니다.그래서 만약 내가 배열을 가지고 있다면,Dim myArray(300) As Integer예를 들어, 300개의 정수 중 300개의 모든 요소는 동일한 초기 값(예: 숫자 13)을 가집니다.

더 많은 설명

는 다음과 같은 변수로 이 작업을 수행할 수 있다는 답변을 찾았습니다.

Dim x As Double: x = 0

구문을 약간 업데이트하여 어레이에 적용할 수 있는 방법이 있습니까?

적어도 1 기반, 1D 또는 2D 변형 배열을 원하는 경우에는 이 작업이 쉽습니다.

Sub StuffVArr()
    Dim v() As Variant
    Dim q() As Variant
    v = Evaluate("=IF(ISERROR(A1:K1), 13, 13)")
    q = Evaluate("=IF(ISERROR(A1:G48), 13, 13)")
End Sub

바이트 배열도 나쁘지 않습니다.

Private Declare Sub FillMemory Lib "kernel32" Alias "RtlFillMemory" _
        (dest As Any, ByVal size As Long, ByVal fill As Byte)

Sub StuffBArr()
    Dim i(0 To 39) As Byte
    Dim j(1 To 2, 5 To 29, 2 To 6) As Byte
    FillMemory i(0), 40, 13
    FillMemory j(1, 5, 2), 2 * 25 * 5, 13
End Sub

동일한 방법을 사용하여 다른 숫자 데이터 유형의 배열을 채울 수 있지만 반복 바이트 하나로 표시할 수 있는 값으로만 제한됩니다.

Sub StuffNArrs()
    Dim i(0 To 4) As Long
    Dim j(0 To 4) As Integer
    Dim u(0 To 4) As Currency
    Dim f(0 To 4) As Single
    Dim g(0 To 4) As Double

    FillMemory i(0), 5 * LenB(i(0)), &HFF 'gives -1
    FillMemory i(0), 5 * LenB(i(0)), &H80 'gives -2139062144
    FillMemory i(0), 5 * LenB(i(0)), &H7F 'gives 2139062143

    FillMemory j(0), 5 * LenB(j(0)), &HFF 'gives -1

    FillMemory u(0), 5 * LenB(u(0)), &HFF 'gives -0.0001

    FillMemory f(0), 5 * LenB(f(0)), &HFF 'gives -1.#QNAN
    FillMemory f(0), 5 * LenB(f(0)), &H80 'gives -1.18e-38
    FillMemory f(0), 5 * LenB(f(0)), &H7F 'gives 3.40e+38

    FillMemory g(0), 5 * LenB(g(0)), &HFF 'gives -1.#QNAN
End Sub

만약 여러분이 다른 상황에서 루프를 피하고 싶다면, 그것은 더 털이 많아집니다.어레이가 50,000개 이상의 엔트리가 아니면 가치가 없습니다. 값을 루프로 설정하기만 하면 앞서 답변에서 설명한 것처럼 충분히 빠릅니다.

차원을 지정하여 배열을 초기화할 수 있습니다.예를들면

Dim myArray(10) As Integer
Dim myArray(1 to 10) As Integer

어레이 관련 작업을 수행하는 중이고 이번이 처음이라면 Chip Pearson의 웹 사이트를 방문하는 것이 좋습니다.

이것은 무엇으로 초기화합니까?예를 들어 전체 어레이를 13으로 초기화하려면 어떻게 해야 합니까?

13개 요소의 배열을 초기화하려는 경우 두 가지 방법으로 실행할 수 있습니다.

Dim myArray(12) As Integer
Dim myArray(1 to 13) As Integer

은 첫번서배하의한다은음시로다작니로 합니다.013개의 요소를 배열에 저장할 수 있습니다.를 들어, .

myArray(0) = 1
myArray(1) = 2
'
'
'
myArray(12) = 13

을 두번예제하는다한음을로 했습니다.1따라서 어레이가 다음과 같이 시작됩니다.1 13개의 값을 할 수 .

myArray(1) = 1
myArray(2) = 2
'
'
'
myArray(13) = 13

의 방법 중 된 각 이 위의방법중하사배용초여때열기배할다같습니값다각음과은요소의열의화을하나를▁to▁w▁equal▁in다▁of같니습▁the▁using▁element▁value▁is,▁eachize▁array다과▁an▁array위와 같습니다.0확인하려면 이 코드를 사용하십시오.

Sub Sample()
    Dim myArray(12) As Integer
    Dim i As Integer

    For i = LBound(myArray) To UBound(myArray)
        Debug.Print myArray(i)
    Next i
End Sub

또는

Sub Sample()
    Dim myArray(1 to 13) As Integer
    Dim i As Integer

    For i = LBound(myArray) To UBound(myArray)
        Debug.Print myArray(i)
    Next i
End Sub

의견에 따른 후속 조치

따라서 이 예제에서 모든 값은 13입니다.따라서 어레이 DimmyArray(300) As Integer를 사용하면 300개의 모든 요소가 13이라는 값을 가집니다.

제가 말씀드린 것처럼, AFAIK, 당신이 원하는 것을 직접적으로 달성할 수 있는 방법은 없습니다.는 하지만 함수를 하는 한 .Rept13's 반적문만듭다니을자열인의 반복 을 만드는 것.그 문자열이 , 우리는 끈손넣으면에을우는, 리일그단을 할 수 .SPLIT용사를 ","구분 기호로 지정합니다.그러나 이렇게 하면 변형 배열이 생성되지만 계산에 사용할 수 있습니다.

참고로 다음 예에서는myArray값이 의 값을 합니다. 이하여 설명해야 . 마 값 비 개 있 를 초 추 이 여 값 설 하 화 을 명 제 거 해 야 합 니 지 이 다 하 막 로 마 거 가 값 막 이 기 나 을 어 는 다 합 니 유 보 지 로 제 실 값 을 의 ▁will 를 ▁-마 ▁the ,"sNum Split작동.

Sub Sample()
    Dim sNum As String
    Dim i As Integer
    Dim myArray

    '~~> Create a string with 13 three hundred times separated by comma
    '~~> 13,13,13,13...13,13 (300 times)
    sNum = WorksheetFunction.Rept("13,", 300)
    sNum = Left(sNum, Len(sNum) - 1)

    myArray = Split(sNum, ",")

    For i = LBound(myArray) To UBound(myArray)
        Debug.Print myArray(i)
    Next i
End Sub

계산에 변형 배열 사용

Sub Sample()
    Dim sNum As String
    Dim i As Integer
    Dim myArray

    '~~> Create a string with 13 three hundred times separated by comma
    sNum = WorksheetFunction.Rept("13,", 300)
    sNum = Left(sNum, Len(sNum) - 1)

    myArray = Split(sNum, ",")

    For i = LBound(myArray) To UBound(myArray)
        Debug.Print Val(myArray(i)) + Val(myArray(i))
    Next i
End Sub

VBA의 경우 두 줄로 초기화해야 합니다.

Sub TestArray()

Dim myArray
myArray = Array(1, 2, 4, 8)

End Sub

배열의 모든 요소를 초기 값으로 초기화합니다.예를 들어 300개의 정수로 구성된 배열 DimmyArray(300)가 있으면 300개의 모든 요소가 동일한 초기 값(예: 숫자 13)을 가집니다.

누가 이걸 반복하지 않고 어떻게 하는지 설명해줄 수 있나요?가능하다면 한 문장으로 하고 싶습니다.

무엇을 이길까요?

Sub SuperTest()
   Dim myArray
   myArray = Application.Transpose([index(Row(1:300),)-index(Row(1:300),)+13])
End Sub

이 함수는 크기 및 초기 값에 대한 변수와 함께 작동하며 tbur 및 Filipe 반응을 결합합니다.

Function ArrayIniValue(iSize As Integer, iValue As Integer)
Dim sIndex As String
sIndex = "INDEX(Row(1:" & iSize & "),)"
ArrayIniValue = Evaluate("=Transpose(" & sIndex & "-" & sIndex & "+" & iValue & ")")
End Function

다음과 같이 호출됩니다.

myArray = ArrayIniValue(350, 13)

함수에 @rdhs 답변을 넣는 멋진 방법:

Function arrayZero(size As Integer)
  arrayZero = Evaluate("=IF(ISERROR(Transpose(A1:A" & size & ")), 0, 0)")
End Function

다음과 같이 사용합니다.

myArray = arrayZero(15)

답변 감사합니다.Matlab에서 어레이를 초기화하기 위해 몇 가지 기본 기능을 재구축했습니다.

  • 함수로서의 결장 연산자
  • 린스페이스
  • 하나
  • 영점

어떤 응용에도 도움이 될 것이라는 희망

Function colon( _
    ByVal LB As Integer, _
    ByVal UB As Integer, _
    Optional ByVal Step As Integer = 1, _
    Optional ByRef ColonStr As String = "")
'generates array from LB to UB with stepwidth Step
'equal to Matlab operator "a:b" or "a:n:b"

Dim sIndex As String
Cnt = WorksheetFunction.RoundUp((UB - LB + 1) / Step, 0)
sIndex = "INDEX(Row(1:" & Cnt & "),)"

ColonStr = "((Transpose(" & sIndex & ")-1)*" & Step & "+" & LB & ")"
colon = Evaluate("=" & ColonStr)
End Function


Function linspace( _
    ByVal LB As Integer, _
    ByVal UB As Integer, _
    Optional ByVal Count As Integer = 100)
'requirements: colon()
'generates linearly spaced array
'equal to Matlab function linspace()

Dim str As String
Count0 = Count - 1
temp = colon(0, Count0, 1, str)
y = Evaluate("=" & LB & "+" & str & "*" & ((UB - LB) / Count0))
linspace = "=" & LB & "+" & str & "*" & ((UB - LB) / Count0)
End Function


Function ones( _
    ByVal vert As Integer, _
    Optional ByVal horz As Integer = 1)
'generate array of all ones
'horz (multidimension) not implemented yet

Dim sIndex As String
sIndex = "INDEX(Row(1:" & vert & "),)"
ones = Evaluate("=Transpose(" & sIndex & ")*0+1")
End Function


Function zeros( _
    ByVal vert As Integer, _
    Optional ByVal horz As Integer = 1)
'generate array of all zeros
'horz (multidimension) not implemented yet

Dim sIndex As String
sIndex = "INDEX(Row(1:" & vert & "),)"
zeros = Evaluate("=Transpose(" & sIndex & ")*0")
End Function

새로운 다이내믹 기능을 통한 하나의 라이너Sequence()

새로운 동적 SEQUENCE() 기능(vs)을 폐기하는 경우.Excel/MS365) 순차적 번호 목록으로 채워지는 지정된 치수 인덱스(예: 5행, 4열)를 사용하여 1 기반 2차원 배열을 만들 수 있습니다.

OP는 전체 배열을 고정된 숫자 값(예: 13의 세 번째 인수)으로 초기화해야 하므로 증분 단계(마지막 인수)를 0으로 설정하기만 하면 됩니다.

Excel 함수 원하는 워크시트 셀에 입력된 다음 공식은 배열 결과를 유출 범위로 표시합니다.

=SEQUENCE(5,4,13,0)
 

VBA 절차 내에서 사용

다음 중 하나를 할당할 수도 있습니다.

  • 평가 결과 또는
  • 워크시트 함수 자체

미리 선언된 배열로:

    Dim myArray()           ' declare variant array

평가

    myArray = [Sequence(5,4,13,0)]
    myArray = Evaluate("Sequence(5,4,13,0)")

기능적 접근

    myArray = Worksheetfunction.Sequence(5,4,13,0)  ' or even: Application.Sequence

언급URL : https://stackoverflow.com/questions/19336987/vba-excel-initialize-entire-array-without-looping

반응형