Excel VBA質問箱 IV

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

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


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

【68891】関数間での構造体利用について VBA初心者 11/4/24(日) 15:18 質問[未読]
【68895】Re:関数間での構造体利用について UO3 11/4/24(日) 21:23 発言[未読]
【68897】Re:関数間での構造体利用について VBA初心者 11/4/24(日) 23:40 お礼[未読]
【68898】Re:関数間での構造体利用について ichinose 11/4/25(月) 7:07 発言[未読]
【68899】Re:関数間での構造体利用について VBA初心者 11/4/25(月) 22:37 お礼[未読]

【68891】関数間での構造体利用について
質問  VBA初心者  - 11/4/24(日) 15:18 -

引用なし
パスワード
   構造体を利用した関数を作成したのですが、文が長くて読みづらかったので関数を外出ししてコンパイルしたところ、「コンパイルエラー:オブジェクト モジュール内では、パブリック ユーザー定義型は定義できません。」というエラーメッセージが出てしまい、Typeの前にPrivateをくっつけると、今度は「コンパイルエラー:Private の列挙型およびユーザー定義型を、パブリックプロシージャの引数、戻り値、パブリック データ メンバ、またはパブリックの定義型のヨウ素として使用することはできません。」というエラーメッセージが出てしまいます。
お手数ですが、対処方法を教えていただけないでしょうか。


Type PartData
 ID As Variant
 Priority As Variant
End Type

Sub main()
 Dim wsQuery As Worksheet
 Dim rowEnd As Long
 Dim data() As PartData

 rowEnd = 20
 ReDim data(rowEnd)

 Set wsQuery = Worksheets("クエリ")
 Call LoadData(data, rowEnd, wsQuery)
End Sub

Sub LoadData(data As PartData, rowEnd As Long, wsQuery As Worksheet)
 Dim i As Long
 wsQuery.Activate

 For i = 2 To rowEnd
   data(i).ID = Cells(i, 1).Value
   data(i).Priority = Cells(i, 2).Value
 Next

End Sub

【68895】Re:関数間での構造体利用について
発言  UO3  - 11/4/24(日) 21:23 -

引用なし
パスワード
   ▼VBA初心者 さん:

いったんレスしましたが、エクセルのないモバイル環境で書き込みしていて
書き込みないように不安があったので削除しました。

今、自宅に戻ってきて、エクセルを動かして確認しましたので、あらためて。

・まず、アップされたエラーメッセージから推測して、このコードを
 オブジェクトモジュール(標準モジュール以外)に書かれたんだと思いますが
 このコードは標準モジュールに書きましょう。
・それでも、
> Call LoadData(data, rowEnd, wsQuery)
 ここでコンパイルエラーになると思います。

>Sub LoadData(data As PartData, rowEnd As Long, wsQuery As Worksheet)
これを
Sub LoadData(data() As PartData, rowEnd As Long, wsQuery As Worksheet)
このように変更してやればうまくいくと思います。

【68897】Re:関数間での構造体利用について
お礼  VBA初心者  - 11/4/24(日) 23:40 -

引用なし
パスワード
   >・まず、アップされたエラーメッセージから推測して、このコードを
> オブジェクトモジュール(標準モジュール以外)に書かれたんだと思いますが
> このコードは標準モジュールに書きましょう。
>・それでも、
>> Call LoadData(data, rowEnd, wsQuery)
> ここでコンパイルエラーになると思います。
>
>>Sub LoadData(data As PartData, rowEnd As Long, wsQuery As Worksheet)
>これを
>Sub LoadData(data() As PartData, rowEnd As Long, wsQuery As Worksheet)
>このように変更してやればうまくいくと思います。

UO3さん
ありがとうございます。

コードを標準モジュールに移動してご指摘の部分を修正しましたところコンパイルが通りました。

【68898】Re:関数間での構造体利用について
発言  ichinose  - 11/4/25(月) 7:07 -

引用なし
パスワード
   おはようございます。
コードをどのモジュールに書くべきかは、
仕様にもよりますが・・・。
今回の事象、オブジェクトモジュールでも


Private Type PartData
 ID As Variant
 Priority As Variant
End Type

Sub main()
 Dim wsQuery As Worksheet
 Dim rowEnd As Long
 Dim data() As PartData

 rowEnd = 20
 ReDim data(rowEnd)

 Set wsQuery = Worksheets("クエリ")
 Call LoadData(data, rowEnd, wsQuery)
End Sub

private Sub LoadData(data() As PartData, rowEnd As Long, wsQuery As Worksheet)
 Dim i As Long
 wsQuery.Activate

 For i = 2 To rowEnd
   data(i).ID = Cells(i, 1).Value
   data(i).Priority = Cells(i, 2).Value
 Next

End Sub


とすれば、コンパイルはとおりますよ!!
上記コードは、すべて同じオブジェクトモジュール上にあるとします。

【68899】Re:関数間での構造体利用について
お礼  VBA初心者  - 11/4/25(月) 22:37 -

引用なし
パスワード
   ichinose さん:

こちらでもコンパイルが通りました。
ありがとうございます。

U03さんに教えていただきましたコードを書き込む先の概念や、ichinoseさんに教えていただきましたPrivateについて調べてみようと思います。

もし分かりやすい解説のあるサイト等ありましたらご紹介いただけますと幸いです。

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