【问题标题】:Copying Type String Array to Range in Excel - Invalid Qualifier在 Excel 中将类型字符串数组复制到范围 - 限定符无效
【发布时间】:2019-08-13 13:12:51
【问题描述】:

我想将内容从“类型”数组的一部分传输到 excel 范围(参见下面的示例),但出现“无效的限定符”错误。任何帮助将不胜感激?

Public Type typDetails
    firstName As String
    lastName As String
End Type

Dim userDetails(100) As typDetails

Public Sub test()

    userDetails(0).firstName = "Bob"
    userDetails(0).lastName = "Bobson"
    userDetails(1).firstName = "Bob"
    userDetails(1).lastName = "Bobson"
    userDetails(2).firstName = "Bob"
    userDetails(2).lastName = "Bobson"

    Worksheets(1).Range("A1:A3") = userDetails.firstName

End Sub

提前致谢, 亚历克斯。

【问题讨论】:

  • 哪一行?我怀疑你可以像这样一次性添加所有名字。

标签: arrays excel vba types


【解决方案1】:

认为你需要一个循环:

Public Sub test()

Dim i As Long

userDetails(0).firstName = "Bob"
userDetails(0).lastName = "Bobson"
userDetails(1).firstName = "Bob"
userDetails(1).lastName = "Bobson"
userDetails(2).firstName = "Bob"
userDetails(2).lastName = "Bobson"

For i = 0 To 2
    Worksheets(1).Cells(1, i + 1).Value = userDetails(i).firstName
Next i

End Sub

【讨论】:

  • 数据集比这个大很多,循环太慢了。感谢您的回复。
【解决方案2】:

数组:基于 0 与基于 1、1D 与 2D

  • Workbook Download (Dropbox)
  • 要一次性复制数据,您必须将其放入适当的数组中, 不幸的是使用循环,但应该比 循环一个范围。
  • 以下是实现这一目标的各种选择。
  • 我已将其扩展为包括姓氏。
  • 您可能应该为UBound(userDetails) 引入一个long 变量。
  • 我使用Private 而不是Public 将其保持在模块级别。

模块1

Option Explicit

Private Type typDetails
    firstName As String
    lastName As String
End Type

Private userDetails(2) As typDetails

' Introduce two 0-based arrays (needs Transpose and 'size adjustment').
Sub test1()

    Dim i As Long
    Dim vntFirst As Variant
    Dim vntLast As Variant

    userDetails(0).firstName = "Bob1"
    userDetails(0).lastName = "Bobson1"
    userDetails(1).firstName = "John1"
    userDetails(1).lastName = "Johnson1"
    userDetails(2).firstName = "Peter1"
    userDetails(2).lastName = "Peterson1"

    ReDim vntFirst(UBound(userDetails))
    ReDim vntLast(UBound(userDetails))

    For i = 0 To UBound(userDetails)
        vntFirst(i) = userDetails(i).firstName
        vntLast(i) = userDetails(i).lastName
    Next

    With Worksheets(1)
        .Range("A1").Resize(UBound(vntFirst) + 1) = _
                Application.Transpose(vntFirst)
        .Range("B1").Resize(UBound(vntLast) + 1) = _
                Application.Transpose(vntLast)
    End With

End Sub

' Introduce two 1D 1-based arrays (needs Transpose).
Sub test2()

    Dim i As Long
    Dim vntFirst As Variant
    Dim vntLast As Variant

    userDetails(0).firstName = "Bob2"
    userDetails(0).lastName = "Bobson2"
    userDetails(1).firstName = "John2"
    userDetails(1).lastName = "Johnson2"
    userDetails(2).firstName = "Peter2"
    userDetails(2).lastName = "Peterson2"

    ReDim vntFirst(1 To UBound(userDetails) + 1)
    ReDim vntLast(1 To UBound(userDetails) + 1)

    For i = 0 To UBound(userDetails)
        vntFirst(i + 1) = userDetails(i).firstName
        vntLast(i + 1) = userDetails(i).lastName
    Next

    With Worksheets(1)
        .Range("A1").Resize(UBound(vntFirst)) = Application.Transpose(vntFirst)
        .Range("B1").Resize(UBound(vntLast)) = Application.Transpose(vntLast)
    End With

End Sub

' Introduce two 2D 1-based arrays.
Sub test3()

    Dim i As Long
    Dim vntFirst As Variant
    Dim vntLast As Variant

    userDetails(0).firstName = "Bob3"
    userDetails(0).lastName = "Bobson3"
    userDetails(1).firstName = "John3"
    userDetails(1).lastName = "Johnson3"
    userDetails(2).firstName = "Peter3"
    userDetails(2).lastName = "Peterson3"

    ReDim vntFirst(1 To UBound(userDetails) + 1, 1 To 1)
    ReDim vntLast(1 To UBound(userDetails) + 1, 1 To 1)

    For i = 0 To UBound(userDetails)
        vntFirst(i + 1, 1) = userDetails(i).firstName
        vntLast(i + 1, 1) = userDetails(i).lastName
    Next

    With Worksheets(1)
        .Range("A1").Resize(UBound(vntFirst)) = vntFirst
        .Range("B1").Resize(UBound(vntLast)) = vntLast
    End With

End Sub

模块2

Option Explicit

Private Type typDetails
    firstName As String
    lastName As String
End Type

' Declare as 1D 1-based array.
Private userDetails(1 To 3) As typDetails

' Introduce two 1D 1-based arrays (needs Transpose).
Sub test3()

    Dim i As Long
    Dim vntFirst As Variant
    Dim vntLast As Variant

    Erase userDetails
    userDetails(1).firstName = "Bob4"
    userDetails(1).lastName = "Bobson4"
    userDetails(2).firstName = "John4"
    userDetails(2).lastName = "Johnson4"
    userDetails(3).firstName = "Peter4"
    userDetails(3).lastName = "Peterson4"

    ReDim vntFirst(1 To UBound(userDetails))
    ReDim vntLast(1 To UBound(userDetails))

    For i = 1 To UBound(userDetails)
        vntFirst(i) = userDetails(i).firstName
        vntLast(i) = userDetails(i).lastName
    Next

    With Worksheets(1)
        .Range("A1").Resize(UBound(vntFirst)) = Application.Transpose(vntFirst)
        .Range("B1").Resize(UBound(vntLast)) = Application.Transpose(vntLast)
    End With

End Sub

模块3

Option Explicit

Private Type typDetails
    firstName As String
    lastName As String
End Type

' Declare as 2D 1-based array.
Private userDetails(1 To 3, 1 To 1) As typDetails

' Introduce two 2D 1-based arrays.
Sub test5()

    Dim i As Long
    Dim vntFirst As Variant
    Dim vntLast As Variant

    Erase userDetails
    userDetails(1, 1).firstName = "Bob5"
    userDetails(1, 1).lastName = "Bobson5"
    userDetails(2, 1).firstName = "John5"
    userDetails(2, 1).lastName = "Johnson5"
    userDetails(3, 1).firstName = "Peter5"
    userDetails(3, 1).lastName = "Peterson5"

    ReDim vntFirst(1 To UBound(userDetails), 1 To 1)
    ReDim vntLast(1 To UBound(userDetails), 1 To 1)

    For i = 1 To UBound(userDetails)
        vntFirst(i, 1) = userDetails(i, 1).firstName
        vntLast(i, 1) = userDetails(i, 1).lastName
    Next

    With Worksheets(1)
        .Range("A1").Resize(UBound(vntFirst)) = vntFirst
        .Range("B1").Resize(UBound(vntLast)) = vntLast
    End With

End Sub

【讨论】:

  • 完美!感谢您的快速回复。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-21
  • 2011-10-10
  • 1970-01-01
  • 1970-01-01
  • 2016-01-05
  • 1970-01-01
相关资源
最近更新 更多