質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

2回答

2914閲覧

VBAのクラスモジュールへ配列格納&取り出し

SASAKI

総合スコア6

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2022/12/02 00:48

ここにより詳細な情報を記載してください。
VBAでクラスモジュール(Class1)を作成し
その中に配列を格納して、それを標準モジュールで取り出し、
新規シート1行目に1列目から順に入れていきたいのですがどのようなコードにすればよいでしょうか?

格納したい配列は以下になります
msh(0) = "作業工程"
msh(1) = "作業者"
msh(2) = "箇所数"
msh(3) = "管理番号"
msh(4) = "通しNo"
msh(5) = "仕様"
msh(6) = "口径"
msh(7) = "形状"
msh(8) = "管端1"
msh(9) = "管端2"
msh(10) = "作業時間"
msh(11) = "比率"
msh(12) = "前作業"
msh(13) = "設備稼働時間"
msh(14) = "後作業"
msh(15) = "インターバル"
msh(16) = "比率"
msh(17) = "総作業時間"
msh(18) = "開始時間"
msh(19) = "終了時間"

目指す形は以下のようになります。
クラスモジュールで使いまわす予定です。
イメージ説明

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

meg_

2022/12/02 02:02

> VBAでクラスモジュール(Class1)を作成し Class1のコードを掲載いただけないでしょうか?(コピペできると回答者が回答しやすくなります)
hatena19

2022/12/02 02:07 編集

配列の中身は固定値でしょうか。それとも、あとからユーザーが編集、追加、削除できるものでしょうか。 固定値なら、クラスにするメリットはないと思いますが、将来、データを格納するなど拡張する予定でしょうか。
guest

回答2

0

固定値の配列ならクラスモジュールにするメリットはないように思いますが、今後拡張して、データも格納できるようにする予定だとして、とりありず、下記のような感じでどうでしょう。

vba/Class1

1Option Explicit 2Private amsh As Variant 3 4Public Property Get msh() As Variant 5 msh = amsh 6End Property 7 8Private Sub Class_Initialize() 9 amsh = Split("作業工程 作業者 箇所数 管理番号 通しNo 仕様 口径 形 管端1 管端2 作業時間 比率 前作業 設備稼働時間 後作業 インターバル 比率 総作業時間 開始時間 終了時間") 10End Sub 11 12Public Sub SetHeader(Target As Range) 13 Target.Resize(1, UBound(amsh)).Value = amsh 14End Sub

せっかくのクラスなので、ヘッダータイトル出力のメソッドも追加してみました。

標準モジュールでは例えば下記のような感じでタイトルを出力できます。

vba/Module1

1Public Sub ヘッダータイトル挿入() 2 With New Class1 3 .SetHeader Range("A1") 4 End With 5End Sub

With を使うとEnd Withでインスタンスを破棄してくれます。

投稿2022/12/02 03:42

hatena19

総合スコア33620

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

正直この程度であればわざわざクラスにする必要性はないとは思いますが…

class1

1Option Explicit 2 3Private msh_ As Variant 4 5Private Sub Class_Initialize() 6 msh_ = Array( "作業工程", "作業者", "箇所数", "管理番号","通しNo", "仕様", "口径", "形状","管端1","管端2", "作業時間","比率", "前作業", "設備稼働時間", "後作業", "インターバル", "比率", "総作業時間","開始時間", "終了時間") 7 8End Sub 9Property Get msh() As Variant 10 msh = msh_ 11 12End Property 13

Module1

1Option Explicit 2 3Sub 列タイトル挿入() 4 5 Dim s As Variant 6 Dim col As Long 7 Dim ws As Worksheet: Set ws = ActiveSheet 8 9 Dim cls As Class1 10 Set cls = New Class1 クラス変数のインスタンス化 11 12 s = cls.msh() 13 14 For col = LBound(s) To UBound(s) 15 ws.Cells(1, col + 1).Value = s(col) 16 17 Next col 18 19 'クラス変数は最後にインスタンスの破棄が必要 20 Set cls = Nothing 21 22End Sub 23

投稿2022/12/02 02:04

pig_vba

総合スコア807

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

norisan

2024/01/25 03:10

メンバーの配列処理が非常によくわかります。 以下のような処理を載せている人もいますが 私はkyo_konanさんの例がしっくりきます。 ありがとうございます。 以下の例だと、配列ではなくメンバーが関数扱いになっているように思いしっくりきませんでした。 Public Property Let days(i As Integer, in_day As Variant) days_(i) = in_day End Property Public Property Get days(i As Integer) As Variant days = days_(i) End Property
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問