【问题标题】:For loop is not looping in VBAFor循环不在VBA中循环
【发布时间】:2018-02-02 04:47:06
【问题描述】:

我目前正在尝试使用 VBA 解析单元格的内容。这是我的代码:

Sub Button1_Click()
Dim integ As Integer
Dim counter As Range
Dim counts As Integer
Dim num As Integer
num = 2
counts = 0
Dim element As Variant
Dim count As Integer
Dim players(1 To 100) As String
Dim lineup As String
Dim salary As Integer
For Each counter In Range("F2:F11")
    starter_letter = "L"
    lineup = counter.Value
    Dim arr() As String
    arr() = Split(lineup)
    For Each element In arr
        If element = "PG" Or element = "SG" Or element = "SF" Or element = "PF" Or element = "C" Or element = "G" Or element = "F" Or element = "UTIL" Then
            counts = counts + 1
        Else
            players(counts) = players(counts) + element + " "
        End If
    Next element
    For count = 1 To 8
        letter = Chr(Asc(starter_letter) + count)
        Range(letter + CStr(num)).Value = Trim(players(count))
    Next count
    num = num + 1
Next counter
End Sub

我将附上图片来说明问题。

我正在尝试从每个单元格中提取名称并将它们分配给不同的单元格。

它适用于我解析的第一个单元格,但计数器不会进入下一个单元格。任何帮助或见解将不胜感激。

这里是每个单元格的内容:

SF Ben Simmons C Marc Gasol PG CJ McCollum F Nicolas Batum PF Enes Kanter G Terry Rozier SG Andrew Harrison UTIL Wayne Selden Jr.
PG Kemba Walker C Marc Gasol G CJ McCollum UTIL Nicolas Batum F Enes Kanter SG Terry Rozier SF Al-Farouq Aminu PF Channing Frye
PG Kemba Walker C Kristaps Porzingis UTIL CJ McCollum SF Nicolas Batum G Terry Rozier F Josh Jackson PF Dirk Nowitzki SG Dwyane Wade
F LeBron James C Marc Gasol UTIL CJ McCollum SF Jaylen Brown SG Terry Rozier G Josh Jackson PG Wayne Selden Jr. PF Marreese Speights
C Dwight Howard PG Kemba Walker SG CJ McCollum PF Enes Kanter F Bobby Portis G Terry Rozier UTIL Wayne Selden Jr. SF Jae Crowder
SF LeBron James PF Al Horford G CJ McCollum C Myles Turner SG Denzel Valentine PG Terry Rozier UTIL Wayne Selden Jr. F Marreese Speights
C Dwight Howard SG CJ McCollum G Elfrid Payton SF Nicolas Batum PF Enes Kanter F Wesley Matthews PG Terry Rozier UTIL Channing Frye
PG Kemba Walker G CJ McCollum UTIL Dennis Smith Jr. SF Brandon Ingram F Enes Kanter C Bobby Portis SG Terry Rozier PF Jarrett Allen
G Kemba Walker F Al Horford UTIL CJ McCollum SG Jordan Clarkson SF Nicolas Batum PG Terry Rozier PF Dirk Nowitzki C Jahlil Okafor
SF LeBron James C Joel Embiid SG Nicolas Batum UTIL Bobby Portis G Terry Rozier PG Wayne Selden Jr. F Jarrett Allen PF Marreese Speights

这些是需要解析的单元格。

这些是当前 VBA 代码的输出。

【问题讨论】:

  • 您有 3 个 For 循环。哪个没有循环播放?
  • 首先连接字符在 vba 中是 & 而不是 + 所以将 Range("F" + CStr(counter)) 更改为 Range("F" & counter)
  • & 和 + 仅在文本时起作用。如果任何值恰好是数字,VBA 会将它们加在一起,而不是连接它们。
  • 第三:了解Cells() 它将消除在尝试设置列时将数字转换为字符串的需要。只是让excel将它们转换回数字。这就像将直流电转换为交流电只是为了将其转换回直流电为您的手机供电。
  • 这些都是加快代码速度的建议。

标签: vba excel for-loop


【解决方案1】:

试试这个:

Sub Button1_Click()

Dim inpts As Variant
Dim players() As Variant

With Worksheets("sheet3")
    inpts = .Range("F2:F11").Value
    ReDim players(1 To UBound(inpts, 1), 1 To 10)
    Dim counts As Long
    counts = 0
    For counter = LBound(inpts) To UBound(inpts)
        Dim arr() As String
        arr = Split(inpts(counter, 1))
        Dim element
        For Each element In arr
            If element = "PG" Or element = "SG" Or element = "SF" Or element = "PF" Or element = "C" Or element = "G" Or element = "F" Or element = "UTIL" Then
                counts = counts + 1
            Else
                players(counter, counts) = players(counter, counts) & element & " "
            End If
        Next element
        counts = 0
    Next counter
    .Range("L2").Resize(UBound(players, 1), UBound(players, 2)).Value = players
End With
End Sub

【讨论】:

  • 这条线 player(counter, counts) = player(counter, counts) & element & " " 给了我一个超出范围的错误
  • 0。这是第一次迭代
  • elements的值是多少?
  • “SF”是元素的值
  • 更新根本没有运行,因为for循环使用“元素”但下一个控件使用“元素”
猜你喜欢
  • 2021-07-30
  • 2011-05-11
  • 2016-02-28
  • 2021-04-27
  • 2023-03-18
  • 1970-01-01
  • 2021-10-01
  • 2021-06-01
  • 2018-04-22
相关资源
最近更新 更多