excel - 在此项目中进行一些更改后,无法让 VBA 数组写回工作表
问题描述
我有 10 列来自每周发布的工作表(“玩家跟踪”)。我正在使用该跟踪表来更新主文件工作表(“播放器目录”)。这段代码正在做它应该做的事情,但是在为项目添加了一些改进之后,这部分不起作用。我做了什么?
1 玩家跟踪表应该发生什么 - 玩家 ID、姓名、屏幕名称、代理名称、代理 ID、费用、RB%、Adj RB、总手数和现金手数。SrcColumns 数组(2、3、4、5、6、7、8、10、11、14)。
2 Player Directory 应该与 PLayer Tracking 进行比较,以查看是否有任何更新或添加。类别相同,但行略有不同。Trgtcolumns 数组(2, 3, 4, 10, 11, 13, 12, 14, 15, 16, 17)
3 如果要添加行,则应该添加行以确保容量。最后 6 列是应该累积的数字。例如。费用是玩家跟踪的第 7 列。如果该单元格的值为 10,而每周报告的值为 2。我希望将现有的 10 与 2 相加,因此它现在将显示为 12。
此外,我没有收到任何错误代码,但我的代码也可能阻止了这种情况。当我运行代码时,看起来事情正在发生。即使当我逐步浏览它时,一切看起来都很好,但是当 sub 结束时,目录页面仍然是空白的。
`Sub DirectoryAdds()
Const tgtName As String = "Player Directory"
Const srcFirstRow As Long = 4
Const tgtFirstRow As Long = 4
Dim srcColumns As Variant: srcColumns = Array(2, 3, 4, 5, 6, 7, 8, 10, 11, 13, 14)
Dim tgtColumns As Variant: tgtColumns = Array(2, 3, 4, 10, 11, 13, 12, 14, 15, 16, 17)
Dim PT As Worksheet: Set PT = PokerBros.Worksheets(Worksheets.Count)
Dim PD As Worksheet: Set PD = ThisWorkbook.Worksheets(tgtName)
Dim rng As Range
Dim Source As Variant, Target As Variant
Dim NewRow As Long
Dim Curr As Long
Dim UB As Long
Dim i As Long
Dim k As Long
If PT Is PD Then MsgBox "Wrong sheet selected.": GoTo exitProcedure
Set rng = PT.Columns(srcColumns(0)).Find("*", , xlFormulas, , , xlPrevious)
If rng Is Nothing Then GoTo exitProcedure
If rng.row < srcFirstRow Then GoTo exitProcedure
Source = PT.Range(PT.Cells(srcFirstRow, srcColumns(0)), rng)
Set rng = PD.Columns(tgtColumns(0)).Find("*", , xlFormulas, , , xlPrevious)
If rng Is Nothing Then GoTo exitProcedure
If rng.row < tgtFirstRow Then GoTo exitProcedure
Target = PD.Range(PD.Cells(tgtFirstRow, tgtColumns(0)), rng)
NewRow = rng.row + 1
UB = UBound(srcColumns)
For i = 1 To UBound(Source)
On Error Resume Next
Curr = WorksheetFunction.Match(Source(i, 1), Target, 0)
If Err.Number = 0 Then
On Error GoTo 0
GoSub updateExistingRecord
Else
On Error GoTo 0
GoSub addNewRecord
End If
Next
MsgBox "Operation finished successfully."
GoTo exitProcedure
updateExistingRecord:
Set rng = PD.Cells(Curr + tgtFirstRow - 1, tgtColumns(UB))
rng.Value = rng.Value + PT.Cells(i + srcFirstRow - 1, srcColumns(UB)).Value
Return
addNewRecord:
For k = 0 To UB - 1
PD.Cells(NewRow, tgtColumns(k)).Value = _
PT.Cells(i + srcFirstRow - 1, srcColumns(k)).Value
Next k
Set rng = PD.Cells(NewRow, tgtColumns(UB))
rng.EntireRow.Insert
rng.Value = rng.Value + PT.Cells(i + srcFirstRow - 1, srcColumns(UB)).Value
NewRow = NewRow + 1
Return
exitProcedure:
Erase srcColumns
Erase tgtColumns
updateExistingRecord: Set rng = PD.Cells(Curr + tgtFirstRow - 1, tgtColumns(UB)) rng.Value =
rng.Value + PT.Cells(i + srcFirstRow - 1, srcColumns(UB)).Value Return addNewRecord: For k = 0 To
UB - 1 PD.Cells(NewRow, tgtColumns(k)).Value = _ PT.Cells(i + srcFirstRow - 1, srcColumns(k)).Value
Next k Set rng = PD.Cells(NewRow, tgtColumns(UB)) rng.EntireRow.Insert
.Value = rng.Value + PT.Cells(i + srcFirstRow - 1, srcColumns(UB)).Value NewRow = NewRow + 1 Return exitProcedure: Erase srcColumns Erase tgtColumns End Sub`
`
解决方案
没有 goto/gosub
编译但未测试。
编辑:简化/更新以删除变体数组
Sub DirectoryAdds()
Const tgtName As String = "Player Directory"
Const srcFirstRow As Long = 4
Const tgtFirstRow As Long = 4
Dim srcColumns As Variant, tgtColumns As Variant
Dim PT As Worksheet, PD As Worksheet
Dim rng As Range, rngSource As Range, c As Range
Dim NewRow As Long, Curr, UB As Long, i As Long, k As Long
srcColumns = Array(2, 3, 4, 5, 6, 7, 8, 10, 11, 13, 14)
tgtColumns = Array(2, 3, 4, 10, 11, 13, 12, 14, 15, 16, 17)
UB = UBound(srcColumns)
Set PT = PokerBros.Worksheets(Worksheets.Count) 'what is PokerBros?
Set PD = ThisWorkbook.Worksheets(tgtName)
If PT Is PD Then
MsgBox "Wrong sheet selected."
Exit Sub
End If
Set rngSource = PT.Range(PT.Cells(srcFirstRow, srcColumns(0)), _
PT.Cells(Rows.Count, srcColumns(0)).End(xlUp))
For Each c In rngSource.Cells
If Len(c.Value) > 0 Then
'Simpler to search full column, but assumes there will be no match
' in the header or the cells above it...
Curr = Application.Match(c.Value, PD.Columns(tgtColumns(0)), 0) 'no Worksheetfunction=no runtime error if no match
If Not IsError(Curr) Then
'increment last column
With PD.Cells(Curr, tgtColumns(UB))
.Value = .Value + PT.Cells(c.Row, srcColumns(UB)).Value
End With
Else
'no match: copy over
Set rng = PD.Cells(Rows.Count, tgtColumns(0)).End(xlUp).Offset(1, 0)
For k = 0 To UB - 1
PD.Cells(rng.Row, tgtColumns(k)).Value = PT.Cells(c.Row, srcColumns(k)).Value
Next k
'not sure what the insert is for?
'rng.EntireRow.Insert
'rng.Value = rng.Value + PT.Cells(i + srcFirstRow - 1, srcColumns(UB)).Value
End If 'got a match
End If 'have a value to search for
Next c
MsgBox "Operation finished successfully."
End Sub
推荐阅读
- visual-studio-code - VS 代码更新后 Jupyter Notebook 未运行
- android - 通知立即消失
- excel - Powershell 导出 CSV 看起来很奇怪
- python - Python Flask 上传和读取 Img 文件
- phabricator - 奥术师:Arc Land Exception
- javascript - 如何用组件道具覆盖反应选择
- excel - 将 Selenium 与 Excel VBA UnknownError 一起使用
- google-cloud-platform - 无法在 Google Cloud Composer 上创建环境
- javascript - 如何在 @tracked 数组中更新对象的值,以便它可以反映 ember js 中屏幕上的更改
- python - K-means聚类如何判断哪种颜色属于“中心”数组中的哪些值