[[20170529211845]] 『コンパイルエラー』(らら) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『コンパイルエラー』(らら)

大変お世話になっております

[[20170528223055]]
既存マクロ変更のやり方

日曜日に質問させていただきましてその節はありがとうございました

2010で試したところ正常に動いているのですが
2013で試すと
Private Sub ComboBox1_Click()のdicの所で
コンパイルエラー  sub 又はfunctionが定義されてません
というエラーが出てしまいます

どのように修正すればいいのでしょうか
よろしくお願いいたします
Private Sub ComboBox1_Click()のdicの所です

 If .ComboBox1.ListIndex > -1 Then .ComboBox2.List = dic(.ComboBox1.Value).Keys

Private Sub CommandButton4_Click()

  Dim a, i As Long, ii As Long
     Set dic = CreateObject("Scripting.Dictionary")
     dic.CompareMode = 1
    a = Sheets("aaa").Cells(1).CurrentRegion.Resize(, 3).Value
     For i = 2 To UBound(a, 1)
         For ii = 1 To UBound(a, 2)
             a(i, ii) = CStr(a(i, ii))
         Next
         If Not dic.Exists(a(i, 1)) Then
             Set dic(a(i, 1)) = CreateObject("Scripting.Dictionary")
             dic(a(i, 1)).CompareMode = 1
         End If
         If Not dic(a(i, 1)).Exists(a(i, 2)) Then
             Set dic(a(i, 1))(a(i, 2)) = CreateObject("Scripting.Dictionary")
             dic(a(i, 1))(a(i, 2)).CompareMode = 1
         End If

     Next
     Me.ComboBox1.List = dic.Keys

       Application.ScreenUpdating = True
       Worksheets("aaa").Select
End Sub

  Private Sub ComboBox1_Click()
   Dim W As Worksheet
    For Each W In Worksheets
        If W.AutoFilterMode Then W.AutoFilterMode = False
    Next W
    With Me
        .ComboBox2.Clear

        If .ComboBox1.ListIndex > -1 Then .ComboBox2.List = dic(.ComboBox1.Value).Keys
    End With
End Sub

 Private Sub ComboBox2_Change()
 On Error Resume Next
    Dim i As Long
     If Me.ComboBox2.ListIndex <> -1 Then
         With Sheets("aaa").Cells(1).CurrentRegion
             .Parent.AutoFilterMode = False
             For i = 1 To 2
                 .AutoFilter i, Me.Controls("ComboBox" & i).Value
             Next
         End With
         End If

      Dim frng As Range
Set frng = Worksheets("aaa").AutoFilter.Range
Set frng = frng.Offset(1).Resize(frng.Rows.Count - 1)
With frng.Columns("B:B")

   End With

 End Sub

< 使用 Excel:Excel2013、使用 OS:Windows10 >


 dicの変数宣言がされてないからじゃないでしょうか?

 2010の方は変数宣言の強制がされてなくて
 変数宣言がされてなくてスルーしてしまい、
 2013の方は変数宣言の強制がされていて
 Option Explicit
 が自動的に付き、変数宣言が無いのでコンパイルエラーになってるとか。

 ※2010も2013も持ってないので違っていたらすみません。
(カリーニン) 2017/05/29(月) 21:53

カリーニン様

Dim で強制宣言したら

.ComboBox2.List = dic(.ComboBox1.Value).Keys

型が違いますって言われてしまいました
(らら) 2017/05/29(月) 22:05


 変数の型は何にしましたか
(カリーニン) 2017/05/29(月) 22:06

 参考HPです。

 Excel(エクセル) VBA入門:Dictionaryオブジェクトを利用する
http://www.eurus.dti.ne.jp/yoneyama/Excel/vba/vba_dictionary.html
(カリーニン) 2017/05/29(月) 22:09

カリーニン様

変数はもよくわかってないので

As Variant

で逃げてみました

紹介して頂いたページ
参考にしてみます
(らら) 2017/05/29(月) 22:19


 変数宣言  As Object, myKey
オブジェクト変数 with ブロック変数が設定されてません
.ComboBox2.List = dic(.ComboBox1.Value).Keys

この部分ででしまいます

対象シートをアクティブにしないとダメなのでしょうか

2013だと  アクティブにしないとエラーが出るのでしょうか
本当にわからなくなってきました   笑い

(らら) 2017/05/29(月) 22:32


 書き換えた後のコード全体は提示できませんか?
(カリーニン) 2017/05/29(月) 23:06

「ツール」-「参照設定」で、「Microsoft Scripting Runtime」にチェックを入れるとどうなるでしょうか?
レイトバインドだと、Keysプロパティの参照が失敗しますが、アーリーバインドならプロパティの存在を正しく認識できますので。
(???) 2017/05/30(火) 09:57

追記。
参照設定した場合、Dictionary型が使えるようになるので、変数宣言は Variant型ではなく、Dim DIC As New Dictionary として、CreateObjectを外しましょう。
DICの内側のDictionaryをどうすれば良いかは、いろいろ試してみてください。(そんな難しい使い方はしないもので…)
(???) 2017/05/30(火) 10:05

 Private Sub UserForm_Initialize()
  Dim a, i As Long, ii As Long
     Set dic = CreateObject("Scripting.Dictionary")
     dic.CompareMode = 1
    a = Sheets("aaa").Cells(1).CurrentRegion.Resize(, 3).Value
     For i = 2 To UBound(a, 1)
         For ii = 1 To UBound(a, 2)
             a(i, ii) = CStr(a(i, ii))
         Next
         If Not dic.Exists(a(i, 1)) Then
             Set dic(a(i, 1)) = CreateObject("Scripting.Dictionary")
             dic(a(i, 1)).CompareMode = 1
         End If
         If Not dic(a(i, 1)).Exists(a(i, 2)) Then
             Set dic(a(i, 1))(a(i, 2)) = CreateObject("Scripting.Dictionary")
             dic(a(i, 1))(a(i, 2)).CompareMode = 1
         End If

     Next
     Me.ComboBox1.List = dic.Keys

       Application.ScreenUpdating = True
       Worksheets("aaa").Activate

 End Sub

  Private Sub ComboBox1_click()
   Dim dic As Object, myKey

   Dim W As Worksheet
    For Each W In Worksheets
        If W.AutoFilterMode Then W.AutoFilterMode = False
    Next W
    With Me
        .ComboBox2.Clear

        If .ComboBox1.ListIndex > -1 Then .ComboBox2.List = dic(.ComboBox1.Value).Keys
    End With
End Sub

 Private Sub ComboBox2_Change()
 On Error Resume Next
    Dim i As Long
     If Me.ComboBox2.ListIndex <> -1 Then
         With Sheets("aaa").Cells(1).CurrentRegion
             .Parent.AutoFilterMode = False
             For i = 1 To 2
                 .AutoFilter i, Me.Controls("ComboBox" & i).Value
             Next
         End With
         End If

      Dim frng As Range
Set frng = Worksheets("aaa").AutoFilter.Range
Set frng = frng.Offset(1).Resize(frng.Rows.Count - 1)
With frng.Columns("B:B")

   End With

 End Sub

 Private Sub ClearComb(myStart, myEnd)
     Dim i As Long
     For i = myStart To myEnd
         Me.Controls("ComboBox" & i).Clear
     Next
 End Sub

(らら) 2017/05/30(火) 22:10


???様カリーニン様
有難う御座います

???様のご指導の下
「ツール」-「参照設定」で、「Microsoft Scripting Runtime」にチェックを入れるとどうなるでしょうか?

ComboBox1にリストは表示されるようになりました
しかしComboBox1を選択すると
実行エラー91  オブジェクト変数または withブロック変数が設定されてません
というエラーがでしまいます
どのようにすればいいのでしょうか
よろしくお願いいたします

 Private Sub ComboBox1_click()の下記の部分が黄色くなってエラーになっています

 .ComboBox2.List = dic(.ComboBox1.Value).Keys

(らら) 2017/05/30(火) 22:17


 >2010で試したところ正常に動いているのですが 
 >2013で試すと ・・コンパイルエラー

 多分、バージョンとは関係ない気がします。
 つまり、(失礼ながら)ららさんの勘違いであろうと思います。

 >Dim で強制宣言したら 
 >.ComboBox2.List = dic(.ComboBox1.Value).Keys 
 >型が違いますって言われてしまいました

 dicを宣言する場所が間違っているのでは、と推測します。

 最上段に Option Explicit と書かれていると思いますが、
 その直下に Dim dic As Object と書く、そして
 その他の場所にある Dim dic と定義したものは全て消去すれば正常化する(のではないか)。

(半平太) 2017/05/31(水) 16:31


半平太様

この件で悩んでOption Explicit   外したんですよ実は
でも言われた通り Dim dic As Object 宣言したら

出来ました

しかし2010  だとつかえてたSelectは
2013では全てActivateに変更を余儀なくされました

結果できましたけど  ちょい腑に落ちなくてしょうがありません

笑い

結果出来ましたから

本当にありがとうございます
(らら) 2017/05/31(水) 21:27


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.