【问题标题】:2 arrays increasing in a specific way2个数组以特定方式增加
【发布时间】:2016-05-25 13:05:47
【问题描述】:

我需要两个 VBA 语言的数组,它们将创建以下值

1  2
1  3
1  4
2  3
2  4
3  4

所以当在第二个数组中达到 4 时,数组 1 的下一个元素就是它的值加 1,数组 2 的下一个元素是数组 1 + 1 的下一个元素。我尝试过直到循环,但我进行无限计算。

我尝试了以下但我得到了无限的计算

将 ENumber 调暗为变体 ENumber = Worksheets("Inter").Range("B1")

Dim FirstLoop As Boolean

Dim m As Variant

ReDim IndexofE1(ENumber * (ENumber - 1) / 2) As Variant
ReDim IndexofE2(ENumber * (ENumber - 1) / 2) As Variant

IndexofE1(0) = 1

FirstLoop = True

Do Until IndexofE1(ENumber * (ENumber - 1) / 2) = Enumber - 1

    If IndexofEl2(m) <> ENumber Then

        If FirstLoop = False Then
            IndexofE1(m + 1) = IndexofE1(m)
            IndexofE2(m + 1) = IndexofE1(m) + 1
        End If

        If FirstLoop = True Then IndexofE2(m + 1) = IndexofE1(m) + 1

    Else
        IndexofE1(m + 1) = IndexofE1(m) + 1
        IndexofE2(m + 1) = IndexofE1(m + 1) + 1
    End If

    FirstLoop = False

Loop

【问题讨论】:

  • 向我们展示您的尝试,以便我们提供帮助。
  • 当然可以。他们应该什么时候结束?
  • 你永远不会改变“ENumber”,所以如果表达式计算为假,换句话说,你进入循环,它总是会计算假==永恒循环。我想这就是@GuyLowe 的意思:)
  • 我是 VBA 新手,很抱歉。这是我写的第一个循环。我声明当元素等于 Enumber - 1 时第一个数组停止。你能明确地编写代码吗?我是新来的,我在这里卡了很长时间
  • @Lvassilopoulos 在“Do...Loop”循环中,您设置一个布尔表达式。这意味着如果您添加“Do Until False”,它将成为一个永恒的循环,而“Do Until True”将永远不会进入循环。因此,只要“直到 IndexofE1(ENumber * (ENumber - 1) / 2) = Enumber - 1”的计算结果为假,循环就不会结束,并且由于您没有在循环中更改“ENumber”,它就会结束。您还有一个错字(“ENumber”与“Enumber”),因此将“Option Explicit”添加为代码的第一行,然后修复所有错误

标签: vba


【解决方案1】:

这样就可以了。我做了一个二维数组而不是两个一维数组。

Sub khkljhlkjh()
Dim ENumber As Variant
ENumber = Worksheets("Inter").Range("B1")
Dim IndexofE1
Dim i&, j&

Dim m As Long

ReDim IndexofE1(1 To ENumber * (ENumber - 1) / 2, 1 To 2) As Variant

m = 1
For i = 1 To ENumber - 1
    For j = i + 1 To ENumber
        IndexofE1(m, 1) = i
        IndexofE1(m, 2) = j
        m = m + 1g
    Next j
Next i


End Sub

如果你想要两个数组:

Sub khkljhlkjh()
Dim ENumber As Variant
ENumber = Worksheets("Inter").Range("B1")
Dim IndexofE1
Dim IndexofE2
Dim i&, j&

Dim m As Long

ReDim IndexofE1(1 To ENumber * (ENumber - 1) / 2) As Variant
ReDim IndexofE2(1 To ENumber * (ENumber - 1) / 2) As Variant
m = 1
For i = 1 To ENumber - 1
    For j = i + 1 To ENumber
        IndexofE1(m) = i
        IndexofE2(m) = j
        m = m + 1
    Next j
Next i


End Sub

现在这些都没有对数组做任何事情,因为你的 sn-p 没有显示你想对它们做什么。您需要将数组输出到某个位置,以便查看值。

【讨论】:

  • 很好的方法名 Scott :)
  • @马克手指会做手指会做的事情。
  • 但这样IndexofE2 将与IndexofE1 相同。我没明白这是 OP 的要求
  • @user3598756 是的,打错了。现已修复。
  • 谢谢斯科特。这是我理解的答案,也是我选择使用的答案
【解决方案2】:

怎么样

Dim int1 As Integer, int2 As Integer, intMax As Integer, intRes() As Integer, intIndex As Integer

intMax = 4
ReDim intRes(1 To intMax * (intMax - 1) / 2, 1 To 2)

Do
    int1 = int1 + 1
    If int1 = intMax Then
        Exit Do
    End If
    For int2 = int1 + 1 To intMax
        intIndex = intIndex + 1
        intRes(intIndex, 1) = int1
        intRes(intIndex, 2) = int2


    Next
Loop

【讨论】:

  • 不幸的是,我只需要数组形式。但是谢谢
【解决方案3】:

两个提案

一) 这将输出两个数组,其中包含您显示的数字,但不使用最后一个数组位置

Option Explicit
Sub main()
    Dim ENumber As Long, currVal1 As Long, i As Long, index As Long
    Dim array1 As Variant, array2 As Variant

    ENumber = Worksheets("Inter").Range("B1")
    ReDim IndexofE1(ENumber * (ENumber - 1) / 2) As Variant
    ReDim IndexofE2(ENumber * (ENumber - 1) / 2) As Variant

    currVal1 = 1
    index = 0
    Do While currVal1 <= ENumber - 1
        For i = currVal1 + 1 To ENumber
            IndexofE1(index) = currVal1
            IndexofE2(index) = i
            index = index + 1
        Next i
        currVal1 = currVal1 + 1
    Loop
End Sub

b) 这将输出两个没有调光问题的变体数组

Option Explicit

Sub main2()
    Dim ENumber As Long
    Dim array1 As Variant, array2 As Variant

    ENumber = Worksheets("Inter").Range("B1")

    getArrays ENumber, array1, array2

End Sub

Sub getArrays(ENumber As Long, array1 As Variant, array2 As Variant)
    Dim currVal1 As Long, i As Long
    Dim strng1 As String, strng2 As String

    currVal1 = 1
    Do While currVal1 <= ENumber - 1
        For i = currVal1 + 1 To ENumber
            strng1 = strng1 & currVal1 & " "
            strng2 = strng2 & i & " "
        Next i
        currVal1 = currVal1 + 1
    Loop

    array1 = Split(Left(strng1, Len(strng1) - 1))
    array2 = Split(Left(strng2, Len(strng2) - 1))
End Sub

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-29
    • 2022-01-18
    • 2020-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-15
    • 1970-01-01
    相关资源
    最近更新 更多