Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 编辑特殊单元格中的单元格值失败?_Vba - Fatal编程技术网

Vba 编辑特殊单元格中的单元格值失败?

Vba 编辑特殊单元格中的单元格值失败?,vba,Vba,我有两张表,一张是关于玩家玩的牌组的信息,谁拥有它,牌组名称是什么,以及更早的名字。然后另一个地方,我有比赛信息的球员,所有者和甲板名称 我的目标是将匹配信息组名称更新为最新的。我有这两个子过程。首先查找我们需要更新的内容,然后使用筛选子过程筛选匹配列表,以便只显示包含玩家、所有者和牌组组合的匹配 然后它调用另一个方法,我尝试在其中更新名称。它运行得很好,调试日志中愉快地说,它已从oldname重命名为new name,但完成后,deck name单元格中的值保持不变 我做错了什么 编辑:我试用

我有两张表,一张是关于玩家玩的牌组的信息,谁拥有它,牌组名称是什么,以及更早的名字。然后另一个地方,我有比赛信息的球员,所有者和甲板名称

我的目标是将匹配信息组名称更新为最新的。我有这两个子过程。首先查找我们需要更新的内容,然后使用筛选子过程筛选匹配列表,以便只显示包含玩家、所有者和牌组组合的匹配

然后它调用另一个方法,我尝试在其中更新名称。它运行得很好,调试日志中愉快地说,它已从oldname重命名为new name,但完成后,deck name单元格中的值保持不变

我做错了什么

编辑:我试用了你的脚本Pefington,并修改了for I和for each循环的拆分。我还使用了您建议的变体方法。现在它再次运行,并说它试图将“chulane PRECO”更新为“chulane”,但该更改没有反映在excel表中

不得不用一种相当丑陋的方式,从字符串数组中填充变量数组

我还添加了一个rownumber,以便在调试器中检查它是否确实使用chulane precon遍历该行,确实如此,但仍然无法实际将chulane保存到单元格中。这是我需要帮助的事情。:)


编辑以在反馈后添加:

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