簡體   English   中英

根據單元格計數和 header 值插入指定文本字符串 X 次

[英]Insert specified text string X amount of times based on cell count and header value

已更新 - 添加了屏幕截圖/添加了表格

VBA 的新手在這里,所以很抱歉,因為我確信這是一個簡單的任務,但已經研究和測試無濟於事。

我正在嘗試將標准報告重新格式化為新的文件格式以供上傳。 我正在嘗試根據 header 值插入文本值 X 次。 每列 header 不同(家屬護理;醫療 FSA;HSA),但必須拼寫為“家屬護理 FSA”或“健康儲蓄計划”等,並且必須在同一列(E 列)上運行 X 次不同的表。

到目前為止,這是我為此部分編寫的一段代碼,但似乎無法連續找到剛剛插入的內容的最后一行並繼續沿列向下運行。 實例的數量每周都會變化,因此希望這是動態的。 列標題和值繼續從 E1 到 J1 到 go。 值的數量都是一樣的,但這些都是每周都在變化的。 一周可能有 334 行,下一周可能有 340 行。

NumToRepeat = wksSource.Range("C" & Rows.Count).End(xlUp).Row

    If wksSource.Range("E1").Value = "Pre_Tax_FSA_Dependent_care(DR1)" And wksSource.Range("F1").Value = "Pre_Tax_FSA_Medical(DR1)" Then
                   
        wksDest.Range("E2").Select
        ActiveCell.FormulaR1C1 = "Dependent Care FSA"
        wksDest.Range("E2").Select
        Selection.AutoFill Destination:=wksDest.Range("E2:E" & NumToRepeat)

        wksDest.Range("E" & Cells(Rows.Count, "E").End(xlUp).Row + 1).Select
        ActiveCell.FormulaR1C1 = "Medical FSA"
        wksDest.Range("E" & Cells(Rows.Count, "E").End(xlUp).Row + 1).Select
        Selection.AutoFill Destination:=wksDest.Range("E" & NumToRepeat + 1, "E" & NumToRepeat * 2 - 1)
                   
    End If
    
End With

我可以讓這兩個堆疊起來,但不能讓其他人堆疊起來。 無論我寫什么,都只是復制第二個實例......

我只需要幫助來不斷找到最后一行並根據列標題中的內容粘貼文本。 如果這一切都令人困惑(和基本),我深表歉意,但很高興進一步澄清並真正感謝提前提供的所有幫助!

源數據示例

最終結果示例

它們以表格形式出現:Source Table Data Sample

付款日期 EE_代碼 社會保障號 EE 名稱 DepCareFSA FSAMed HSAemp 高鐵 停車處 通勤者
2021 年 5 月 14 日 A B C D 123456789 約翰·多伊 208.33 0 0 0 0 0
2021 年 5 月 14 日 EFGH 111111111 簡·多伊 0 0 0 38.46 0 0
2021 年 5 月 14 日 IJKL 222222222 傑瑞·多伊 0 0 0 38.46 0 0
2021 年 5 月 14 日 MNOP 333333333 吉爾·多伊 115.38 0 190.38 86.54 0 0
2021 年 5 月 14 日 QRST 444444444 吉姆·多伊 0 0 190.38 86.54 0 0
2021 年 5 月 14 日 紫外線WX 555555555 仁多 0 0 100 38.46 0 0

嘗試重新格式化為此...根據值來自的列來填充 C 列和 E 列,其中 F 列是標准的“當前”,一直到所有行。

員工標識符 投稿日期 貢獻描述 貢獻金額 計划名稱 稅前年
123456789 05142021 工資單 208.33 依賴護理FSA 當前的
111111111 05142021 工資單 0 依賴護理FSA 當前的
222222222 05142021 工資單 0 依賴護理FSA 當前的
333333333 05142021 工資單 115.38 依賴護理FSA 當前的
444444444 05142021 工資單 0 依賴護理FSA 當前的
555555555 05142021 工資單 0 依賴護理FSA 當前的

這將繼續使用來自 E 列的值,然后是堆疊在下方的 F 列,依此類推,並根據其來自哪一列列出相應的貢獻類型。

我能夠進行所有設置(在列中重復 SSN,重復日期......雖然格式不正確,對應值),但無法弄清楚如何獲取列 C 和 E 的從屬名稱以不斷找到最后一行,堆疊在一起,同時對應於正確的 SSN 和值...我沒有嘗試將 F 列添加到它一直顯示“當前”的位置,但是這很容易嗎?

任何和所有的幫助都非常感謝。 我是一位精通 Excel 用戶,但對 VBA 不熟悉,並且一直在努力解決這一切。 我已經完成了大約 75% 的路程,但需要這些步驟的幫助......

謝謝!

這是您的情況的解決方案。 將工作表的名稱調整為您需要的名稱。 助手SetTags function 僅根據標頭的值選擇適當的名稱。 它使用ByRef來直接更改這些變量(而不使用 function 將返回數組)。 在調用SetTags之前,我們需要清除這些變量 - 如果您在SetTags中拼錯了一些文本(在這種情況下,最終工作表上將有空單元格),這將使我們有機會發現錯誤。 如果我們不清除它們並且您拼錯了一些文本,您將在最終工作表上得到錯誤的文本。 代碼還使用兩個范圍 - 一個帶有 header ( rngTable ),另一個沒有 header ( rngData )。 rngData讓我們可以輕松地將數據傳輸到最終工作表,而無需任何進一步的計算。 最后,因為我們知道被復制的行數總是相同的,所以下一行(要插入到最終工作表上)計算為當前下一行加上這個行數。

Option Explicit

Sub Transfer()

    Dim wksSource As Worksheet, wksDest As Worksheet
    Dim rngTable As Range, rngData As Range
    Dim rowsCount&, nextRow&, col&
    Dim strContribDesc$, strPlanName$
    
    Set wksSource = Worksheets("SOURCE SAMPLE")
    Set wksDest = Worksheets("FINAL")
    Set rngTable = wksSource.Range("A1").CurrentRegion
    With rngTable: Set rngData = .Offset(1).Resize(.Rows.Count - 1): End With
    nextRow = 2: rowsCount = rngData.Rows.Count
    
    With wksDest
        .[A1].CurrentRegion.Offset(1).EntireRow.Delete '//Delete old data
        For col = 5 To 10
            strContribDesc = vbNullString: strPlanName = vbNullString
            Call SetTags(rngTable.Rows(1).Cells(col), strContribDesc, strPlanName)
            .Cells(nextRow, "A").Resize(rowsCount).Value = rngData.Columns(3).Value   '//EmployeeIdentifier
            .Cells(nextRow, "B").Resize(rowsCount).Value = rngData.Columns(1).Value   '//ContributionDate
            .Cells(nextRow, "C").Resize(rowsCount).Value = strContribDesc             '//ContributionDescription
            .Cells(nextRow, "D").Resize(rowsCount).Value = rngData.Columns(col).Value '//ContributionAmount
            .Cells(nextRow, "E").Resize(rowsCount).Value = strPlanName                '//PlanName
            .Cells(nextRow, "F").Resize(rowsCount).Value = "Current"                  '//PriorTaxYear
            nextRow = nextRow + rowsCount
        Next
    End With
    
    MsgBox "Well done!", vbInformation

End Sub

Private Sub SetTags(strHeader$, ByRef strContribDesc$, ByRef strPlanName$)
    Select Case strHeader
        Case "Pre_Tax_FSA_Dependent_care(DR1)"
            strContribDesc = "Payroll"
            strPlanName = "Dependent Care FSA"
        Case "Pre_Tax_FSA_Medical(DR1)"
            strContribDesc = "Payroll"
            strPlanName = "Medical FSA"
        Case "Pre_Tax_HSA_Employee(DR1)"
            strContribDesc = "Payroll"
            strPlanName = "Health Savings Plan"
        Case "Pre_Tax_HSA_Employer(DR1)"
            strContribDesc = "Employer"
            strPlanName = "Health Savings Plan"
        Case "Parking_Benefit(DR1)"
            strContribDesc = "Payroll"
            strPlanName = "Parking"
        Case "Commuter_Benefit(DR1)"
            strContribDesc = "Payroll"
            strPlanName = "Parking"
    End Select
End Sub

暫無
暫無

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

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