Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


1743 / 13646 ツリー ←次へ | 前へ→

【72230】excel ヴァージョン 山下 12/6/24(日) 6:57 質問[未読]
【72231】Re:excel ヴァージョン UO3 12/6/24(日) 7:40 発言[未読]
【72232】Re:excel ヴァージョン 山下 12/6/24(日) 8:14 発言[未読]
【72235】Re:excel ヴァージョン UO3 12/6/24(日) 8:44 発言[未読]
【72236】Re:excel ヴァージョン 山下 12/6/24(日) 8:57 お礼[未読]

【72230】excel ヴァージョン
質問  山下  - 12/6/24(日) 6:57 -

引用なし
パスワード
   マクロについてほとんど無知です。

2003で動いていたマクロが、2007で動かせません。2007で開発したものを旧ヴァージョンで開く方法は見つけられました。逆に2003で作られたマクロを2007で動かす方法に誘導してもらえますか。

無知ゆえ、的外れた質問をしているかも知れません。その際は、お許しを。

【72231】Re:excel ヴァージョン
発言  UO3  - 12/6/24(日) 7:40 -

引用なし
パスワード
   ▼山下 さん:

おはようございます。
通常のものなら、2003マクロを2007で動かすほうが、その逆よりスムーズにできるはずです。
もちろん、中には、2007以降、機能がなくなったもの(FileSearch等)もありますが。

実際に動かなくなったマクロをアップされてはいかがでしょう?

【72232】Re:excel ヴァージョン
発言  山下  - 12/6/24(日) 8:14 -

引用なし
パスワード
   UO3さん、さっそくありがとうございます。

Private Sub UserForm_Initialize()
  Dim p As Page
  Dim sz As Double
  Dim wk As String
  Dim idx As Long
  
  If Sheets("work").Range("A1").Value <> 1 Then
    ken = kenn(): Sheets("hinnmei").Range("A1").Select
  Else
    Sheets("zaiko").Range("C65536").End(xlUp).Select
    ken = ActiveCell.Row - 1
    Sheets("zaiko").Select: Sheets("zaiko").Range("C2").Select
  End If
  
  With Me
   .Height = 320
   .Width = 420
   End With
  With Controls.Add("Forms.MultiPage.1")
    .Top = 40
    .Left = 5
    .Height = 200
    .Width = (9.75 * 40 + 12) + 0.75
    .Pages.Remove 1
    With .Font
     .Name = "MS ゴシック"
     .Size = 10
     sz = Int(.Size / 0.75) * 0.75
     End With
    Set p = .Pages(0)
    p.Caption = String(Int((Int(.Width / 0.75) * 0.75 - 12.75) / sz), " ")
    wk = p.Caption
  
    Mid(wk, 1, 80) = "--------------------------------------------------------------------------------"
    p.Caption = wk
    p.ScrollBars = 2
    p.ScrollHeight = 5000
    For idx = 1 To ken
      Set c_lal(idx) = New Class1
      With c_lal(idx)
        .id = idx
        Set .lal = p.Controls.Add("Forms.Label.1")
        With .lal
          .Top = (idx - 1) * 20 + 5
          .Left = 30
          .Width = 50
        End With
      End With
      
      Set c_lbl(idx) = New Class1
      With c_lbl(idx)
        .id = idx
        Set .lbl = p.Controls.Add("Forms.Label.1")
        With .lbl
          .Top = (idx - 1) * 20 + 5
          .Left = 80
          .Width = 230
        End With
      End With
      
      Set c_txt(idx) = New Class1
      With c_txt(idx)
        .id = idx
        Set .txt = p.Controls.Add("Forms.TextBox.1")
        With .txt
          .Top = (idx - 1) * 20 + 5
          .Left = 280
          .Width = 80
          .TextAlign = fmTextAlignRight
        End With
      End With
    Next


    For idx = 1 To ken
      p.Controls(3 * (idx - 1)).Caption = ActiveCell.Offset(idx - 1, 1).Value
      p.Controls(3 * (idx - 1) + 1).Caption = ActiveCell.Offset(idx - 1, 2).Value
    Next
    End With
Set c_eve = New Class1
Set c_eve.p_obj = Me
End Sub

F8でステップごとに動かして行くと、
Set p = .Pages(0)

実行時エラー 13
型が一致しません
となります。

【72235】Re:excel ヴァージョン
発言  UO3  - 12/6/24(日) 8:44 -

引用なし
パスワード
   ▼山下 さん:

コードアップありがとうございました。

2010でも再現しました。
なぁるほどぉ です。

Dim Page As Page
これを
Dim Page As MsForms.Page
または
Dim Page As Object

このようにすればエラーは無くなると思います。
理由は以下のようなことかと。

2003と2010でオブジェクトブラウザを表示させますと(非表示メンバも表示)
2003ではPageがでてきません。
一方、2010では Page が2つでてきます。1つはMsFormsメンバーとしてのPage。
もう1つがExcelとしての、新しいオブジェクト(いわゆるエクセル上のページ関連)です。
2003で、MsFormsメンバのPageがオブジェクト裏得座になぜ表示されていないのかはおいておき
Page というオブジェクトが2007で追加になっていますね。

変数型を単に As Page とすると、VBAは、Excelオブジェクトを優先します。
2003では、Excelオブジェクトがなかったので、MsFormsオブジェクトと認識されましたけど
2007では、そうみてくれないんですね。

【72236】Re:excel ヴァージョン
お礼  山下  - 12/6/24(日) 8:57 -

引用なし
パスワード
   ▼UO3 さん:
>▼山下 さん:
>
>コードアップありがとうございました。
>
>2010でも再現しました。
>なぁるほどぉ です。
>
>Dim Page As Page
>これを
>Dim Page As MsForms.Page
>または
>Dim Page As Object
>
>このようにすればエラーは無くなると思います。
>理由は以下のようなことかと。
>
>2003と2010でオブジェクトブラウザを表示させますと(非表示メンバも表示)
>2003ではPageがでてきません。
>一方、2010では Page が2つでてきます。1つはMsFormsメンバーとしてのPage。
>もう1つがExcelとしての、新しいオブジェクト(いわゆるエクセル上のページ関連)です。
>2003で、MsFormsメンバのPageがオブジェクト裏得座になぜ表示されていないのかはおいておき
>Page というオブジェクトが2007で追加になっていますね。
>
>変数型を単に As Page とすると、VBAは、Excelオブジェクトを優先します。
>2003では、Excelオブジェクトがなかったので、MsFormsオブジェクトと認識されましたけど
>2007では、そうみてくれないんですね。

ありがとうございます。
Dim p As MsForms.Page
と書き換えてみたところ、動きました。
これで今日の作業がクリアできそうです。
また困ったらお願いしますね。

1743 / 13646 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free