[英]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.