【问题标题】:How do use a for loop such that if I index a specific value of a string I can use it within an if statement? [closed]如何使用 for 循环,以便如果我索引字符串的特定值,我可以在 if 语句中使用它? [关闭]
【发布时间】:2022-01-14 09:23:08
【问题描述】:

我目前正在编写一个代码,将数组作为一个名为“os”的字符串循环。

首先,我通过一系列If 语句过滤此工作簿中的所有数据。
然后,如果第二个循环到达我的字符串的第一个索引,即“CM”,我想将另一个工作簿中的数据复制到这个工作簿中。
然后下一个循环开始,但是这次如果达到我的字符串的第二个索引,即“PM”,我想将另一个工作簿中的其他数据复制到这个工作簿中。

图像可视化复制过程

您将在下面找到与我的问题相对应的代码部分。此代码不适用于我尝试索引字符串的部分,即os(k) = 1 和os(k) = 2。

Dim LastRow As Long
Dim j As Long
Dim k As Long
Dim os(1 To 2) As String

os(1) = "CM"
os(2) = "PM"

With ThisWorkbook.Worksheets("Brondata NB")
    LastRow = .Range("A" & .Rows.Count).End(xlUp).Row
End With

For j = 2 To LastRow
    For k = 1 To 2
        If ThisWorkbook.Worksheets("Brondata NB").Cells(j, 1).Value = "Q1" Then
            If ThisWorkbook.Worksheets("Brondata NB").Cells(j, 2).Value = "Harmsenbrug" Then
                If ThisWorkbook.Worksheets("Brondata NB").Cells(j, 4).Value = "0-20%" Then
                    If ThisWorkbook.Worksheets("Brondata NB").Cells(j, 3).Value = os(k) = 1 Then
                        OpenBook.Sheets("Resultaten").Range("C19:D23").Copy
                        ThisWorkbook.Worksheets("Brondata NB").Cells(j, 5).PasteSpecial xlPasteValues
                    End If
        
                    If ThisWorkbook.Worksheets("Brondata NB").Cells(j, 3).Value = os(k) = 2 Then
                        OpenBook.Sheets("Resultaten").Range("F19:G23").Copy
                        ThisWorkbook.Worksheets("Brondata NB").Cells(j, 5).PasteSpecial xlPasteValues
                    End If
                End If
            End If
        End If
    Next k
Next j

【问题讨论】:

  • Cells(j, 3).Value = os(k) = 1 应该是什么意思?
  • 由于 GSerg 暗示 (os(k) = 1) 始终为 False,因此除非 .Value 为 False,否则 J 循环中的每个“If”都将为假。你也不需要 k = 1 到 2 循环。所以注释 k 循环,删除 =1 和 =2,而不是 2 内部 If's do If... = os(1) Then ... ElseIf ... = os(2) Then...End如果
  • 感谢@PeterT 的解释和解决方案。在您的帮助下,我能够解决问题。
  • 另外一个问题。以下调整后的代码行也可以吗? @PeterT '如果 ThisWorkbook.Worksheets("Brondata NB").Cells(j, 2).Value = brug(k) And FileToOpen(i) Like "brug(k)" Then'。
  • 我几乎可以肯定您想从 Like brug(k) 中删除这些引号,但除此之外,不确定它是否会在没有上下文的情况下起作用。

标签: arrays excel vba string for-loop


【解决方案1】:

我设法解决了我的问题。这是代码。

Sub GetDataFromFile()


Dim FileToOpen As Variant
Dim OpenBook As Workbook
Dim i As Integer
Dim LastRow As Long
Dim j As Long
Dim os(1 To 2) As String
Dim brug(1 To 15) As String
Dim kwt(1 To 4) As String
Dim k As Long
Dim n As Long


os(1) = "CM"
os(2) = "PM"

brug(1) = "B"
brug(2) = "N"
brug(3) = "R"
brug(4) = "C"
brug(5) = "G"
brug(6) = "Ha"
brug(7) = "H"
brug(8) = "M"
brug(9) = "b"
brug(10) = "S"
brug(11) = "Su"
brug(12) = "Br"
brug(13) = "D"
brug(14) = "V"
brug(15) = "W"

kwt(1) = "Q1"
kwt(2) = "Q2"
kwt(3) = "Q3"
kwt(4) = "Q4"

Application.ScreenUpdating = False
FileToOpen = Application.GetOpenFilename(Title:="Blader naar uw bestand & importeer", filefilter:="Excel Files(*.xls*),*xls*", MultiSelect:=True)

     
      
            
            
If IsArray(FileToOpen) Then 'If files are selected then the code below is followed
    
    For i = LBound(FileToOpen) To UBound(FileToOpen) 'The number of files selected in a specific folder will form the upper and lower point for the loop
        Set OpenBook = Application.Workbooks.Open(FileToOpen(i)) 'If the filename contains a certain string text then values are copied and pasted
            If FileToOpen(i) Like "*Botlekbrug*" Or FileToOpen(i) Like "*Noord*" Or FileToOpen(i) Like "*Rijn*" Or _
                FileToOpen(i) Like "*Calandbrug*" Or FileToOpen(i) Like "*Giesserbrug*" Or FileToOpen(i) Like "*Harmsenbrug*" Or _
                FileToOpen(i) Like "*Haringvlietbrug*" Or FileToOpen(i) Like "*Merwedebrug*" Or FileToOpen(i) Like "*beneden*" Or _
                FileToOpen(i) Like "*Spijkenisserbrug*" Or FileToOpen(i) Like "*Suuroffbrug*" Or FileToOpen(i) Like "*Brienenoordbrug*" Or _
                FileToOpen(i) Like "*Dordrecht*" Or FileToOpen(i) Like "*Volkerakbrug*" Or FileToOpen(i) Like "*Wantijbrug*" Then
        
                
                With ThisWorkbook.Worksheets("Brondata NB")
                    LastRow = .Range("A" & .Rows.Count).End(xlUp).Row
                End With

                For n = 1 To 4
                    For j = 2 To LastRow
                        For k = 1 To 15
                            If InStr(1, ThisWorkbook.Worksheets("Brondata NB").Cells(j, 1).Value, kwt(n)) And InStr(1, OpenBook.Path, kwt(n)) Then
                                If InStr(1, ThisWorkbook.Worksheets("Brondata NB").Cells(j, 2).Value, brug(k)) And InStr(1, OpenBook.Name, brug(k)) Then
                                    If ThisWorkbook.Worksheets("Brondata NB").Cells(j, 4).Value = "0-20%" Then

                                        If ThisWorkbook.Worksheets("Brondata NB").Cells(j, 3).Value = os(1) Then
                                            OpenBook.Sheets("Resultaten").Range("C19:D23").Copy
                                            ThisWorkbook.Worksheets("Brondata NB").Cells(j, 5).PasteSpecial xlPasteValues
                                            OpenBook.Sheets("Resultaten").Range("C25:D29").Copy
                                            ThisWorkbook.Worksheets("Brondata NB").Cells(j, 7).PasteSpecial xlPasteValues
                                        End If
            
                                        If ThisWorkbook.Worksheets("Brondata NB").Cells(j, 3).Value = os(2) Then
                                            OpenBook.Sheets("Resultaten").Range("F19:G23").Copy
                                            ThisWorkbook.Worksheets("Brondata NB").Cells(j, 5).PasteSpecial xlPasteValues
                                            OpenBook.Sheets("Resultaten").Range("F25:G29").Copy
                                            ThisWorkbook.Worksheets("Brondata NB").Cells(j, 7).PasteSpecial xlPasteValues
                                        End If
                                    End If
                                End If
                            End If
                        Next k
                    Next j
                Next n
                
            End If
            OpenBook.Close False


    Next i
    
End If


Application.ScreenUpdating = True
End Sub
    

【讨论】:

  • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center。
猜你喜欢
  • 1970-01-01
  • 2020-03-26
  • 1970-01-01
  • 1970-01-01
  • 2018-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多