簡體   English   中英

擴展現有的復制粘貼循環:根據單元格值循環遍歷特定列

[英]Expand existing Copy-Paste Loop: Loop through specific Columns based on Cell Value

我目前有多個 excel 電子表格,如下所示:

我的桌子

該表是一份問卷,其中包含來自 CF 列的答案,C 是“最差”(字母 N),D 是“第二差”(字母 T),E 是第二好的(字母 W)和 F 是最好的(字母 G,如好的)。

該表的右側是我使用現有模塊復制到另一個電子表格的句子,具體取決於問卷中“x”的設置位置(它總是將句子復制到“x”右側的第 9 行)。

現在我想修改我現有的代碼,不僅復制每一行的所有句子,而且只復制每個工作表的 5 個句子。 這 5 個應該是 5 個“最佳”答案(F 列中的 5 個,表示問卷中的好答案,如果該列中的答案少於 5 個,則從 E 列中取 rest 直到您有 5 個)或 6 個“最差” 答案,表示 C 列中的 5(字母 N 不好),如果該列中的“X”少於 5 個,則從 D 列(字母 T)中獲取 rest。 這樣我想復制每個工作表的 5 個最佳或最差答案。 是否應復制最佳或最差答案的決定取決於每個工作表中的一個簡單單元格值(單元格 K6)。 如果 K6 >70% 取最佳答案,如果 K6 低於 70%,則取最差答案。

這是我當前將所有答案復制到新工作表的模塊:

Dim ws As Worksheet
Dim lr As Integer 'lastrow
Dim SpaltenIndex As Integer
Dim SheetNummer As Integer
Dim cl As Range 'cell
Dim rw As Range 'row
Dim Antwortrange As String
Dim WrkSht As Worksheet
Dim WrkShtCol As Sheets


'Create Destination Sheet
Sheets.Add
ActiveSheet.Name = "Handlungsempfehlungen"

'Set Questionnaire Answer Range to search through
Antwortrange = "C11:F400"

'ColumnIndex and SheetNumber
SpaltenIndex = 1
SheetNummer = 1

'Create Worksheet Collection with all the Questionnaire-Sheets
Set WrkShtCol = Worksheets(Array("AM AD - Anforderungsdefinition", "AM AA - Anforderunganalyse", "AM - Anforderungsdokumentation", "AM AV - Anforderungsvalidierung", "TM IT - Initiierung Test", "TM ZD - Zieldefinition", "TM TV - Testvorgehen", "TM TOB - Testobjektabgrenzung", "TM AS - Aufwandsschätzung", "TM TP - Testplanung", "TM TP - Testplanung", "TM TA - Testauftrag", "TM TS - Teststeuerung", "TM AO - Aufbauorganisation", "TM RM - Risikomanagement", "TM MI - Managementinformation", "TM AF - Abnahme Freigabe", "TM AT - Abschluss Test", "DT IT - Installationstest", "DT ST - Sicherheitstest", "OTP DT - Dokumententest", "OTP MT - Modultest", "OTP MIT - Modulintegrationstest", "OTP OO KT - OO Klassentest", "OTP OO KIT - OO Klassenintgrate", "OTP FT - Funktionstest", "OTP FIT - Funktionsintgratiotes", "OTP PIT - Produktintegratest", "OTP AT - Abnahmetest", "OTP ET - Ergonomietest", "OTP LPT - Last & Performance", "OTP GPT - Geschäftsprozesstest", "TUP TMK -Testumg Module Klassen", _
"TUP TUF - Testumgebung Funktion", "TUP TP - Testumgebung Prozesse", "ATP KM Konfigurationsmanagement", "ATP FAEM - Fehler Änderungs", "ATP DS - Datensicherheit", "ATP DSCH - Datenschutz", "ATP TEV -Testergebnisverwaltung", "ATP VG - Vertragsgestaltung"))
   
'MAIN LOOP: Take all sentences 9 rows to the right of each X in each Questionnaire and paste the value to the newly created sheet from above

For Each WrkSht In WrkShtCol

   For Each rw In WrkSht.Range(Antwortrange).Rows   
   For Each cl In rw.Cells
       
   lr = ws.Cells(ws.Rows.Count, SpaltenIndex).End(xlUp).Offset(1).Row
   If lr = 2 And ws.Range("A1") = "" And lr < 500 Then lr = 1
   'If lr = 2 And ws.Range("A2") = "" Then lr = 1
      
           If LCase(cl.Value) = "x" Then
               cl.Offset(0, 9).Copy Sheets("Handlungsempfehlungen").Cells(lr, SpaltenIndex)       
           End If
       Next cl
   Next rw



'If 1st row is empty in destination sheet, delete and shift rest up 
If Sheets("Handlungsempfehlungen").Cells(1, SpaltenIndex) = "" Then Sheets("Handlungsempfehlungen").Cells(1, SpaltenIndex).Delete Shift:=xlUp

'WrkShtCol(1).range("A2").Copy Worksheets("Handlungsempfehlungen").Cell(lr, SpaltenIndex)

Sheets("Handlungsempfehlungen").Cells(35, SpaltenIndex).Value = WrkShtCol(SheetNummer).Cells(2, 1)


SpaltenIndex = SpaltenIndex + 1
SheetNummer = SheetNummer + 1


End Sub

我希望你能幫助我,任何提示將不勝感激。 非常感謝你。

編輯 - 預期結果:

如果 K6 超過 70% - 找到 5 個最佳答案(第一優先級 F 列,如果 F 列中有 5 個“x”,則找到這些單元格並將值 9 行復制到新工作表的右側。

因此,如果問卷如下所示: QuestionnaireOver70%粘貼的表格應如下所示: Table

And if the questionnaire is under 70%, do the same but for the worst (Column C & D, C being the worst, if there are not 5 "x" in C then take the rest from D (second worst))

希望這可以幫助

編輯:包含我要復制的所有工作表和當前模塊的文件: https://www.dropbox.com/sh/wq8dgzmlpxgm76x/AACOG_SkE9WMqE22qvcd3tVBa?dl=0

編輯:更新的鏈接,excel 文件有更多解釋以及所需的步驟和工作表以幫助理解(一個具有當前 output,一個具有所需輸出)

閱讀代碼的注釋並根據您的需要進行調整

Option Explicit

Public Sub DoSomething()

    ' Define the results sheet's name
    Dim resultsSheetName As String
    resultsSheetName = "Handlungsempfehlungen"
    
    ' Set the results sheet reference
    Dim resultsSheet As Worksheet
    Set resultsSheet = ThisWorkbook.Worksheets(resultsSheetName)

    ' Define the sheets to evaluate in an array
    Dim targetSheets As Sheets
    Set targetSheets = ThisWorkbook.Worksheets(Array("AM AD - Anforderungsdefinition", "AM AA - Anforderunganalyse", _
                        "AM - Anforderungsdokumentation", "AM AV - Anforderungsvalidierung", _
                        "TM IT - Initiierung Test", "TM ZD - Zieldefinition", _
                        "TM TV - Testvorgehen", "TM TOB - Testobjektabgrenzung", _
                        "TM AS - Aufwandsschätzung", "TM TP - Testplanung", _
                        "TM TP - Testplanung", "TM TA - Testauftrag", _
                        "TM TS - Teststeuerung", "TM AO - Aufbauorganisation", _
                        "TM RM - Risikomanagement", "TM MI - Managementinformation", _
                        "TM AF - Abnahme Freigabe", "TM AT - Abschluss Test", _
                        "DT IT - Installationstest", "DT ST - Sicherheitstest", _
                        "OTP DT - Dokumententest", "OTP MT - Modultest", _
                        "OTP MIT - Modulintegrationstest", "OTP OO KT - OO Klassentest", _
                        "OTP OO KIT - OO Klassenintgrate", "OTP FT - Funktionstest", _
                        "OTP FIT - Funktionsintgratiotes", "OTP PIT - Produktintegratest", _
                        "OTP AT - Abnahmetest", "OTP ET - Ergonomietest", _
                        "OTP LPT - Last & Performance", "OTP GPT - Geschäftsprozesstest", _
                        "TUP TMK -Testumg Module Klassen", "TUP TUF - Testumgebung Funktion", _
                        "TUP TP - Testumgebung Prozesse", "ATP KM Konfigurationsmanagement", _
                        "ATP FAEM - Fehler Änderungs", "ATP DS - Datensicherheit", _
                        "ATP DSCH - Datenschutz", "ATP TEV -Testergebnisverwaltung", _
                        "ATP VG - Vertragsgestaltung"))

    ' Loop through each sheet
    Dim targetSheet As Worksheet
    For Each targetSheet In targetSheets
        
        ' Get last row in target sheet
        Dim lastRow As Long
        lastRow = targetSheet.Cells(targetSheet.Rows.Count, "A").End(xlUp).Row
        
        'targetSheet.Activate
        
        ' Remove any filters
        If targetSheet.FilterMode Then targetSheet.ShowAllData
        
        ' Set the range with X
        Dim rangeToFilter As Range
        Set rangeToFilter = targetSheet.Range("C7:F" & lastRow)
    
        ' Define a counter to check how many X there are
        Dim resultCounter As Long
        resultCounter = 1
        
        ' Check the grade (
        Dim gradeValue As Variant
        gradeValue = targetSheet.Range("K6").Value
        
        ' Check if the grade is not an error
        If Not IsError(gradeValue) Then
            
            ' Define the columns to filter (in order) according to the grade value
            Select Case gradeValue
            Case Is > 0.7
                    
                Dim columnsToFilter As Variant
                columnsToFilter = Array(4, 3) ' Columns F and E
                
            Case Else
                
                columnsToFilter = Array(1, 2) ' Columns C and D
                
            End Select
            
            ' Set a reference to the range that holds the Xs in first column
            Dim resultRange As Range
            Set resultRange = filterRange(rangeToFilter, columnsToFilter(0), "X")
            
            ' If there are any results in first column
            If Not resultRange Is Nothing Then
                ' Count them
                Dim countResult As Long
                countResult = resultRange.Count
                
                ' Get the results sheet's last row
                Dim resultsRow As Long
                resultsRow = resultsSheet.Cells(resultsSheet.Rows.Count, "A").End(xlUp).Row
                
                ' Print the results in results sheet
                printResults resultsSheet, resultsRow, resultRange, resultCounter
                
            End If

            ' If the results with Xs are less than five
            If resultCounter <= 5 Then
                ' Remove filters from sheet
                If targetSheet.FilterMode Then targetSheet.ShowAllData
                
                ' Set a reference to the range that holds the Xs in second column
                Set resultRange = filterRange(rangeToFilter, columnsToFilter(1), "X")
                
                ' If there are any results in second column
                If Not resultRange Is Nothing Then
                    
                    ' Print the results in results sheet
                    printResults resultsSheet, resultsRow, resultRange, resultCounter
                End If
            End If
            
        End If
        
    Next targetSheet

End Sub

Private Function filterRange(ByVal rangeToFilter As Range, ByVal fieldToFilter As Long, ByVal criteriaToFilter As String) As Range
    
    ' Apply auto filter in selected column
    rangeToFilter.AutoFilter Field:=fieldToFilter, Criteria1:=criteriaToFilter
    
    ' Use error handling to handle the case in which there aren't any results
    On Error Resume Next
    Set filterRange = rangeToFilter.Offset(1, 0).Columns(fieldToFilter).SpecialCells(xlCellTypeVisible)
    On Error GoTo 0
End Function

' In this sub is used the variable resultCounter ByRef which means that the value is passed back to the variable that is in the calling procedure
Private Sub printResults(ByVal resultsSheet As Worksheet, ByVal resultsRow As Long, ByVal resultRange As Range, ByRef resultCounter As Long)
    
    Dim targetCell As Range
    For Each targetCell In resultRange
        
        If resultCounter <= 5 Then
            resultsSheet.Range("A" & resultsRow + resultCounter).Resize(1, 3).Value = Array(resultRange.Parent.Name, resultCounter, targetCell.Offset(0, 9).Value)
        Else
            Exit For
        End If
        
        resultCounter = resultCounter + 1
        
    Next targetCell
    
End Sub

PS。 我無法理解“Handlungsempfehlungen”中的 output 所以我留下了一個通用的

讓我知道它是否有效

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM