Excel (VBA)

Excel VBAに関するフォーラムです。
  • 掲示板への投稿には会員登録(無料)が必要です。会員登録がまだの方はこちら
  • 掲示板ご利用上のお願い」に反するご記入はご遠慮ください。
  • Q&A掲示板の使い方はこちらをご覧ください
トピックに返信
質問

 
(Windows 7 Professional : Excel 2013)
列挙体 Enum の使い方について
投稿日時: 17/11/30 11:03:27
投稿者: punchlupin

-----------------------ブック1のモジュール(マスターデータ)
Enum 支店番号
  a支店 = 10
  b支店 = 15
  c支店 = 20
End Enum
-----------------------ブック2のモジュール(リスト作成用)
Enum 転記先の列位置
  A列 = 1
  B列 = 2
  C列 = 3
End Enum

Sub 質問1()
    Cells(1, 転記先の列位置.A列) = Workbooks("ブック1").Worksheets("Sheet1").支店番号.a支店
    Cells(1, 転記先の列位置.B列) = Workbooks("ブック1").Worksheets("Sheet1").支店番号.b支店
    Cells(1, 転記先の列位置.C列) = Workbooks("ブック1").Worksheets("Sheet1").支店番号.c支店
End Sub

Sub 質問2()
    Cells(1, "A") = Workbooks("ブック1").Worksheets("Sheet1").支店番号.a支店
    Cells(1, "B") = Workbooks("ブック1").Worksheets("Sheet1").支店番号.b支店
    Cells(1, "C") = Workbooks("ブック1").Worksheets("Sheet1").支店番号.c支店
End Sub

----------------------

異なるブックにそれぞれ列挙型を記述し、それを質問1や質問2のように
列挙型変数を利用して転記をする作業をしたいのですが、上記の方法では
できませんでした。
 
ブック1には列数が200ほどあり、ときどき列の挿入などで項目が増えたり
減ったりするので、列挙体を用いることができないかな?と考えたのですが
よく分からなくなってきました。
 
良い方法があれば教えて頂きたいです。
よろしくお願いいたします。

回答
投稿日時: 17/11/30 13:38:47
投稿者: sk

引用:
Enum 支店番号
  a支店 = 10
  b支店 = 15
  c支店 = 20
End Enum

・上記の列挙型[支店番号]と
 [ブック1]のワークシート[Sheet1]との関係性が不明瞭。
 
引用:
Workbooks("ブック1").Worksheets("Sheet1").支店番号.a支店

・[ブック1]のワークシート[Sheet1]の構造と各セルの値が不明。
 
・Excel.Worksheet オブジェクトに
 支店番号 というメンバは存在しないので
 上記のような指定は成り立たない。
 
・([ブック1]を[ブック2]のライブラリの 1 つとして追加していない限り)
 そのブックのプロジェクトで定義された列挙型は、
 それ以外のブックから見ればスコープの範囲外である。
 
引用:
ブック1には列数が200ほどあり、ときどき列の挿入などで項目が増えたり
減ったりするので、列挙体を用いることができないかな?と考えたのですが

[ブック1]の[Sheet1]の列の増減によって具体的にどのような問題が生じているのかと、
 「列挙型の利用」がその解決に役立つと考えたプロセスと根拠が不明。
 
・仮に列挙型[支店番号]の各定数が、[ブック1]のワークシート[Sheet1]の
 ある列の番号( 10 列目, 15 列目, 20 列目)を示しているとして、
 もし[Sheet1]の表構造の変更によって上記の列の位置が変わってしまえば、
 当然[支店番号]の各定数の値もその都度変更しなければならない。
 
・(列の数や位置の問題はともかくとして)そもそも
 [ブック1]のワークシート[Sheet1]の何行目のセルを
 転記時の参照元としているのかが明記されていない。

回答
投稿日時: 17/11/30 16:41:06
投稿者: baoo

skさんのおっしゃることももっともなんですが、
そもそも私が疑問に思うのは
支店番号.a支店ってのは=10なわけですよね。
すると、Workbooks("ブック1").Worksheets("Sheet1").支店番号.a支店ってのは
感覚的にWorkbooks("ブック1").Worksheets("Sheet1").10になると思うんですが、
この10って何ですか?
つまり、punchlupinさんはこれに何を想定されていたのでしょうか?

回答
投稿日時: 17/11/30 17:15:43
投稿者: mattuwan44

>良い方法があれば教えて頂きたいです。
列に名前の定義で名前を付けたらいいかもしれません。
途中に列が増えたり減ったりしても不都合はありませんが、
対象の列が削除されたら当然エラーになるので、コードのメンテナンスも必要になります。
事前に何か書いて置くなら、シートのないようが変わったら、
列挙体を使おうが、名前の定義を使おうが、
コードのメンテナンスが必要になります。
 
動的に列の位置を把握したいなら、
Match関数等で、マクロの実行その都度に列を検索したらいいのかなと思います。
そうしたら、無かったらなかったで処理が書けるので、
メンテナンスの必要性が少なくなるかも知れませんね。
(全くないかどうかは、ちょっと実際に運用してみないとなんとも?)

回答
投稿日時: 17/11/30 18:59:48
投稿者: 細雪

ご覧になったのは
http://excel-ubara.com/excelvba1/EXCELVBA409.html
ココかなと思うのですが、どうでしょう?
 
Constで定数宣言するモノたちを、
ある程度のグループに分けて列挙した方が見易くない?
というのがEnumの使い方ですね。
要するに、「定数の集合体」と言えば解り易いでしょうか。
  ※余計にこんがらがったらごめんなさい。
 
 
そんなわけで、
    Cells(1, 転記先の列位置.A列) = Workbooks("ブック1").Worksheets("Sheet1").支店番号.a支店
この中の「支店番号.a支店」にはEnumの宣言により、
定数(=10)が入っているわけです。
なので
  Workbooks("ブック1").Worksheets("Sheet1").10
これじゃ、VBAは意味を理解してくれません。
例えば
    Cells(1, 転記先の列位置.A列) = Workbooks("ブック1").Worksheets("Sheet1").Cells([何行目?], 支店番号.a支店)
としてやると、「1行目,転記先の列位置.A列(=1)列目」の位置に、
「ブック1のSheet1の、?行目の10列目」を転記したら良いんだな、とVBAも理解できるわけです。
 
で、きっとこの「ブック1のSheet1」について列の増減があって、メンテナンスが面倒・・
ってことで、例えば12列目に列挿入されちゃったりしたら
Enum 支店番号
  a支店 = 10
  b支店 = 16
  c支店 = 21
End Enum
とかできたら後のメンテナンスも少しは楽だね、という発想ですよね?
 
・・・と勝手に想像。
 
 
まぁ、200列もあるなら、コレでも面倒でしょうけれど・・・ね。
個人的にはサッサとDB管理ソフトに移行すべきだと思ってしまいますね。

回答
投稿日時: 17/12/01 11:11:04
投稿者: WinArrow
投稿者のウェブサイトに移動

私は、次の方法で列を認識しています。
 
方法、項目タイトル行を取得し、項目タイトルの中の文字列で列位置を習得します。
項目数が多いと面倒ですが、列位置が変更されてもコードを修正することが無いので、
手間いらすの方法として使っています。
 
With Sheets("●●")
    TopRow = WorksheetFunction.Match("番号", .Columns("A"),0)
    支店A = WorksheetFunction.Match("支店A", .Rows(TopRow),0)
    支店B = WorksheetFunction.Match("支店B", .Rows(TopRow),0)
    支店C = WorksheetFunction.Match("支店C", .Rows(TopRow),0)
End With
 

トピックに返信