Vba 编辑特殊单元格中的单元格值失败?
我有两张表,一张是关于玩家玩的牌组的信息,谁拥有它,牌组名称是什么,以及更早的名字。然后另一个地方,我有比赛信息的球员,所有者和甲板名称 我的目标是将匹配信息组名称更新为最新的。我有这两个子过程。首先查找我们需要更新的内容,然后使用筛选子过程筛选匹配列表,以便只显示包含玩家、所有者和牌组组合的匹配 然后它调用另一个方法,我尝试在其中更新名称。它运行得很好,调试日志中愉快地说,它已从oldname重命名为new name,但完成后,deck name单元格中的值保持不变 我做错了什么 编辑:我试用了你的脚本Pefington,并修改了for I和for each循环的拆分。我还使用了您建议的变体方法。现在它再次运行,并说它试图将“chulane PRECO”更新为“chulane”,但该更改没有反映在excel表中 不得不用一种相当丑陋的方式,从字符串数组中填充变量数组 我还添加了一个rownumber,以便在调试器中检查它是否确实使用chulane precon遍历该行,确实如此,但仍然无法实际将chulane保存到单元格中。这是我需要帮助的事情。:)Vba 编辑特殊单元格中的单元格值失败?,vba,Vba,我有两张表,一张是关于玩家玩的牌组的信息,谁拥有它,牌组名称是什么,以及更早的名字。然后另一个地方,我有比赛信息的球员,所有者和甲板名称 我的目标是将匹配信息组名称更新为最新的。我有这两个子过程。首先查找我们需要更新的内容,然后使用筛选子过程筛选匹配列表,以便只显示包含玩家、所有者和牌组组合的匹配 然后它调用另一个方法,我尝试在其中更新名称。它运行得很好,调试日志中愉快地说,它已从oldname重命名为new name,但完成后,deck name单元格中的值保持不变 我做错了什么 编辑:我试用
编辑以在反馈后添加:
Sub RenameInSpecialCells(oldName As String, currentName As String)
dim rng as range, c as range
set rng = ActiveWorkbook.Worksheets("Game Logs").AutoFilter.range.SpecialCells(xlCellTypeVisible) #.range? can't get intellisense to trigger on this one#
For Each c In rng.cells
If (StrComp(c.value, oldName) = 0) Then
c.value = currentName
Debug.Print ("Renamed " & oldName & " to " & currentName)
End If
Next
End Sub
第一篇文章在这里,新的在编码,但我想我看到了一些问题,希望能有所帮助
Dim oldNameS As String
注意s
,复数形式。
然后使用:
For Each oldName In oldNamesArray
现在,您正在调用oldName(单数),就好像它是oldNames集合的成员一样,但它不是
你可以选择:
For Each oldNames in oldNamesArray
我认为第二个问题是,您试图对字符串数组上的每个循环使用。要做到这一点,您的数组需要是一个变体
因此,数组声明应为:
Dim oldNamesArray() as Variant
最后:
Dim name As Variant
我看不到这一个被使用,也许在过程中丢失了
有了这些注释,代码如下所示:
Sub CleanOldDeckNames()
' DISABLE EXCEL ANIMATIONS
Application.ScreenUpdating = False
Dim player As String
Dim owner As String
Dim oldName As String
Dim oldNamesArray() As Variant
Dim currentName As String
Dim currentOldName As String
Sheets("Decklist").Select
Call dl_search_deck_hidden_reset
For i = 12 To 50
player = ActiveWorkbook.Worksheets("Decklist").range("A" & i).Value
owner = ActiveWorkbook.Worksheets("Decklist").range("B" & i).Value
currentName = ActiveWorkbook.Worksheets("Decklist").range("C" & i).Value
oldName = ActiveWorkbook.Worksheets("Decklist").range("D" & i).Value
oldNamesArray = Split(oldName, ",")
next
For Each oldName In oldNamesArray
currentOldName = Trim(CStr(oldName)) #not sure if CStr required#
Sheets("Game Logs").Select
ActiveWorkbook.Worksheets("Game Logs").range("E1:G1").Value = Array(player, owner, currentOldName)
Call gl_find_rename_deck
Call RenameInSpecialCells(currentOldName, currentName)
Next
Call gl_find_rename_deck_reset
' ENABLE EXCEL ANIMATIONS
Application.ScreenUpdating = True
End Sub
Sub RenameInSpecialCells(oldName As String, currentName As String)
For Each cell In ActiveWorkbook.Worksheets("Game Logs").AutoFilter.range.SpecialCells(xlCellTypeVisible)
If (StrComp(cell, oldName) = 0) Then
cell = currentName
Debug.Print ("Renamed " & oldName & " to " & currentName)
End If
Next cell
End Sub
如果我偏离了目标,我会道歉
编辑以添加:数组中每个
的循环不使用i
,因此可以按顺序运行for i
循环和for每个
循环,而不是嵌套它们。代码也作了相应的修改。我终于设法避开了储蓄。我找不到任何原因来解释为什么我不能通过SpecialCells编辑单元格,所以我抓起行号和列号,直接在工作表中编辑它。结果证明这是有效的
我也不需要像建议的那样使用变体,这很简单
Sub CleanOldDeckNames()
' DISABLE EXCEL ANIMATIONS
Application.ScreenUpdating = False
Dim player As String
Dim owner As String
Dim oldNames As String
Dim oldNamesArray() As String
Dim currentName As String
Dim currentOldName As String
Dim j As Integer
Sheets("Decklist").Select
Call dl_search_deck_hidden_reset
For i = 12 To 50
player = ActiveWorkbook.Worksheets("Decklist").range("A" & i).Value
owner = ActiveWorkbook.Worksheets("Decklist").range("B" & i).Value
currentName = ActiveWorkbook.Worksheets("Decklist").range("C" & i).Value
oldNames = ActiveWorkbook.Worksheets("Decklist").range("D" & i).Value
oldNamesArray = Split(oldNames, ",")
Dim name As Variant
For Each oldName In oldNamesArray
currentOldName = Trim(oldName)
Sheets("Game Logs").Select
ActiveWorkbook.Worksheets("Game Logs").range("E1:G1").Value = Array(player, owner, currentOldName)
Call gl_find_rename_deck
Call RenameInSpecialCells(currentOldName, currentName)
Next oldName
Next i
Call gl_find_rename_deck_reset
' ENABLE EXCEL ANIMATIONS
Application.ScreenUpdating = True
End Sub
Sub RenameInSpecialCells(oldName As String, currentName As String)
For Each cell In ActiveWorkbook.Worksheets("Game Logs").AutoFilter.range.SpecialCells(xlCellTypeVisible)
If (StrComp(cell, oldName) = 0) Then
Debug.Print ("Attemtping to rename: " & cell)
ActiveWorkbook.Worksheets("Game Logs").Cells(cell.row, cell.Column).Value = "Chulane"
Debug.Print ("New content: " & ActiveWorkbook.Worksheets("Game Logs").Cells(cell.row, cell.Column))
End If
Next cell
End Sub
嗨,佩芬贡。感谢您的输入,我注意到有时您似乎不必在为每个
块使用中的之前声明简单的实体类型。现在名称也应该正确了,我不怀疑upper方法的功能。它很好用。这是底部,实际的储蓄,并没有达到我所期望的效果。答案被修改,试图解决底部的子问题。不能真正测试,让我知道。只是在寻找其他东西时遇到的,看起来非常熟悉。出于尊重,在我发布自己的答案之前,我没有注意到你的新建议。我现在测试了它,它确实起了作用,所以不管怎么说,这都要归功于你的答案。我仍然怀疑实际问题与特殊细胞以及我用它穿过细胞的方式有关。我认为我必须改变方法。比如,并不是说我找到了行号,而是通过特殊单元格外的所有单元格。
Sub CleanOldDeckNames()
' DISABLE EXCEL ANIMATIONS
Application.ScreenUpdating = False
Dim player As String
Dim owner As String
Dim oldNames As String
Dim oldNamesArray() As String
Dim currentName As String
Dim currentOldName As String
Dim j As Integer
Sheets("Decklist").Select
Call dl_search_deck_hidden_reset
For i = 12 To 50
player = ActiveWorkbook.Worksheets("Decklist").range("A" & i).Value
owner = ActiveWorkbook.Worksheets("Decklist").range("B" & i).Value
currentName = ActiveWorkbook.Worksheets("Decklist").range("C" & i).Value
oldNames = ActiveWorkbook.Worksheets("Decklist").range("D" & i).Value
oldNamesArray = Split(oldNames, ",")
Dim name As Variant
For Each oldName In oldNamesArray
currentOldName = Trim(oldName)
Sheets("Game Logs").Select
ActiveWorkbook.Worksheets("Game Logs").range("E1:G1").Value = Array(player, owner, currentOldName)
Call gl_find_rename_deck
Call RenameInSpecialCells(currentOldName, currentName)
Next oldName
Next i
Call gl_find_rename_deck_reset
' ENABLE EXCEL ANIMATIONS
Application.ScreenUpdating = True
End Sub
Sub RenameInSpecialCells(oldName As String, currentName As String)
For Each cell In ActiveWorkbook.Worksheets("Game Logs").AutoFilter.range.SpecialCells(xlCellTypeVisible)
If (StrComp(cell, oldName) = 0) Then
Debug.Print ("Attemtping to rename: " & cell)
ActiveWorkbook.Worksheets("Game Logs").Cells(cell.row, cell.Column).Value = "Chulane"
Debug.Print ("New content: " & ActiveWorkbook.Worksheets("Game Logs").Cells(cell.row, cell.Column))
End If
Next cell
End Sub