Vba 对象未定义

Vba 对象未定义,vba,Vba,“频道”、“facebook”、“instagram”和“twitter”是“对象”数据类型 “i”、“j”和“k”是“整数”数据类型 “ws”是“工作表”数据类型 Set channel = CreateObject("Scripting.Dictionary") With channel .Add "facebook", facebook .Add "instagram", instagram .Add "twitter", twitter End With

“频道”、“facebook”、“instagram”和“twitter”是“对象”数据类型

“i”、“j”和“k”是“整数”数据类型

“ws”是“工作表”数据类型

Set channel = CreateObject("Scripting.Dictionary")

With channel

    .Add "facebook", facebook
    .Add "instagram", instagram
    .Add "twitter", twitter

End With

Set facebook = CreateObject("Scripting.Dictionary")

With facebook

    .Add "brand", 0
    .Add "post", 0
    .Add "likes", 0
    .Add "comments", 0
    .Add "boosted", 0
    .Add "shares", 0

End With

Set instagram = CreateObject("Scripting.Dictionary")

With instagram

    .Add "brand", 0
    .Add "post", 0
    .Add "likes", 0
    .Add "comments", 0

End With

Set twitter = CreateObject("Scripting.Dictionary")

With twitter

    .Add "brand", 0
    .Add "post", 0
    .Add "likes", 0
    .Add "retweets", 0
    .Add "is retweet", 0

End With

For Each ws In Sheets

    For i = 0 To channel.count - 1

        If channel.Keys()(i) = ws.name Then

            Sheets(ws.name).Activate
            emptyCol = WorksheetFunction.CountA(Range("1:1"))
            emptyRow = WorksheetFunction.CountA(Range("A:A"))

            For j = 1 To emptyCol

                For k = 0 To channel(channel.Keys()(i)).count - 1

                    If InStr(Cells(1, j), channel(channel.Keys()(i)).Keys()(k)) <> 0 Then

                        channel(channel.Keys()(i))(channel(channel.Keys()(i))) = j
                        MsgBox channel(channel.Keys()(i)) & "." & channel(channel.Keys()(i)) & "=" & j

                    End If

                Next k

            Next j

        End If

    Next i

Next ws
Set channel=CreateObject(“Scripting.Dictionary”)
带通道
.添加“脸谱网”,脸谱网
.添加“instagram”,instagram
.添加“推特”,推特
以
设置facebook=CreateObject(“Scripting.Dictionary”)
使用facebook
.添加“品牌”,0
。添加“post”,0
。添加“喜欢”,0
。添加“评论”,0
.添加“增强”,0
.添加“股份”,0
以
设置instagram=CreateObject(“Scripting.Dictionary”)
使用instagram
.添加“品牌”,0
。添加“post”,0
。添加“喜欢”,0
。添加“评论”,0
以
设置twitter=CreateObject(“Scripting.Dictionary”)
用推特
.添加“品牌”,0
。添加“post”,0
。添加“喜欢”,0
.添加“转发”,0
.添加“正在转发”,0
以
对于每个ws-In表单
对于i=0到channel.count-1
如果channel.Keys()(i)=ws.name,则
工作表(ws.name)。激活
emptyCol=WorksheetFunction.CountA(范围(“1:1”))
emptyRow=WorksheetFunction.CountA(范围(“A:A”))
对于j=1,清空ycol
对于k=0到通道(channel.Keys()(i))。计数-1
如果InStr(单元格(1,j),channel(channel.Keys()(i)).Keys()(k))为0,则
通道(channel.Keys()(i))(通道(channel.Keys()(i)))=j
MsgBox频道(channel.Keys()(i))&“&”频道(channel.Keys()(i))&“=”&j
如果结束
下一个k
下一个j
如果结束
接下来我
下一个ws
即将出现的错误是:


它突出显示了以下代码:
对于k=0到通道(channel.Keys()(i)).count-1
您正在以错误的顺序组装
字典
对象。当此代码运行时

With channel
    .Add "facebook", facebook
    .Add "instagram", instagram
    .Add "twitter", twitter
End With
facebook
instagram
twitter
都没有设置任何内容。我猜它们也没有声明,所以存储的是空的
Variant
,而不是对象。当您最终创建实际对象时,为时已晚,因为它们是按值存储在
字典中的,所以基础变量只是更改为指向新对象。看

最直接的解决办法是像这样重新排列代码的顶部部分

Set facebook = CreateObject("Scripting.Dictionary")
With facebook
    .Add "brand", 0
    .Add "post", 0
    .Add "likes", 0
    .Add "comments", 0
    .Add "boosted", 0
    .Add "shares", 0
End With

Set instagram = CreateObject("Scripting.Dictionary")
With instagram
    .Add "brand", 0
    .Add "post", 0
    .Add "likes", 0
    .Add "comments", 0
End With

Set twitter = CreateObject("Scripting.Dictionary")
With twitter
    .Add "brand", 0
    .Add "post", 0
    .Add "likes", 0
    .Add "retweets", 0
    .Add "is retweet", 0
End With

Set channel = CreateObject("Scripting.Dictionary")
With channel
    .Add "facebook", facebook
    .Add "instagram", instagram
    .Add "twitter", twitter
End With

解决方案是添加Option Explicit,以确保正确声明变量。

Hi,您是否尝试迭代字典的键?Hi,是的。迭代,用列标题检查它们,并将列号存储为它们的项。因为字典中只有3项,所以只使用数组可能更容易。有关迭代字典键的示例,请参见此答案。你是说使用数组而不是“通道”字典?是的,我的意思是当你有很多项时,字典通常用于快速查找。你有3个项目。您可以这样做,但是数组甚至集合可能更适合。