ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

EXCEL VBAコミュの範囲設定の自動化

  • mixiチェック
  • このエントリーをはてなブックマークに追加
はじめまして、KENと申します。
マクロは初心者です。だから変な質問になってしまうのかどうか解りませんが・・・
もし、実行可能なことであれば知りたいと思い投稿しました。

宜しくお願いします。
やりたいことを以下に書きます。

    A    B    C
 1  
 2               {ボタン}
 3  A  項目01  a
 4             b
 5     項目02  a1
 6            b1
 7            c1
 8     項目03  a
 9            b
10            b1
11            x
12            y
13            z

という表をつくって、B列の項目に対する範囲をそれぞれ設定したいのですが、

具体的に言いますと、

C3:C4の範囲をB3のセルの中に記入されている文字列(この場合は「項目01」)の名前で定義して、

同様にして、その続きの C5:C7 の範囲をB5(項目02)、
               C8:C13の範囲をB8(項目03)
 
というように名前の定義をして、これをマクロに記憶させて{ボタン}で実行させようかと思い行ったところ、いくつか問題が出てきました。

(問題1) B列のセルの中身を変更しても、登録時に記入してあった名前に戻ってしまう。
      例えば「項目01」を「項目1」とかに変えても「項目01」になってしまう。

(問題2) 行を挿入したり、してB列のセルの位置が変わると違う範囲になってしまう。
      例えば、7行と8行の間に新しい行を挿入して、「項目02」の範囲(リスト)を増やしても、
      実行時は常にB8は「項目03」の中に入ってしまう。

 ※(問題2)に関しては後から挿入する分には範囲も自動的に変わってくれるので問題ないのですが、マクロ実行時に初めに設定した範囲で実行されてしまうのです。
実行前に、いちいち元のセル範囲に戻していたらせっかくの自動的に設定し直すという目的に反してしまい、どうしたのもかというところです。

以上ですが、これら2つの問題は解決可能なのか教えてください。もし可能ならどういうアレンジが必要なのかご教授頂ければ有り難いです。以下は実際動かしたVBAです。
宜しくお願いします。

Sub Macro7()
Range("B3").Select
ActiveCell.FormulaR1C1 = "項目01"
ActiveCell.Characters(1, 2).PhoneticCharacters = "コウモク"
Range("C3:C4").Select
ActiveWorkbook.Names.Add Name:="項目01", RefersToR1C1:="=Sheet1!R3C3:R4C3"
ActiveWorkbook.Names.Add Name:="項目01", RefersToR1C1:="=Sheet1!R3C3:R4C3"
Range("B5").Select
ActiveCell.FormulaR1C1 = "項目02"
ActiveCell.Characters(1, 2).PhoneticCharacters = "コウモク"
Range("C5:C7").Select
ActiveWorkbook.Names.Add Name:="項目02", RefersToR1C1:="=Sheet1!R5C3:R7C3"
ActiveWorkbook.Names.Add Name:="項目02", RefersToR1C1:="=Sheet1!R5C3:R7C3"
Range("B8").Select
ActiveCell.FormulaR1C1 = "項目03"
ActiveCell.Characters(1, 2).PhoneticCharacters = "コウモク"
Range("C8:C13").Select
ActiveWorkbook.Names.Add Name:="項目03", RefersToR1C1:="=Sheet1!R8C3:R13C3"
ActiveWorkbook.Names.Add Name:="項目03", RefersToR1C1:="=Sheet1!R8C3:R13C3"
End Sub

コメント(4)

>Sedvicious さま

良いアドバイス有り難うございます。

確かにこのコードはアレンジしていないものをそのままのせたもので、ほとんど理解できていないというのが正直なところです(^^;)

「・・・・・・="項目01"」の「””」の部分が変数にしなければならないというぐらいしか今のところ理解できません。(コピーをする動作を記録したんですがダメだったみたいです・・・)


確かにコードが理解できなければ具体的なアドバイスを頂いたところでこっちはちんぷんかんぷんなると思います。少し勉強してから具体的なアドバイスを頂こうかとは思っています。(なんせ、昨日初めてVBAというものを知ったばかりなので・・・質問の仕方も解っていないようでした)

とりあえず、自分がやろうとしていることが不可能ではないということが解っただけでも収穫です。やる気が出てまいりました。

また宜しくお願いします。
こんばんは。
基本的な考え方としてマクロの記録って言うのは
記録した時の手順、範囲等を記録するので後から範囲等を変更しても
その変更にマクロが付いてこれません。(絶対参照とか相対参照とか選べる機能もあるらしいですが)

正直、このような場合は記録に手を加えて望むような形にするのは
難しいのでは無いかと思います(私の力が足りないのかもしれませんが)
 
下記のコードは名前の定義をし直すコードです。
セルの記入の状態の関係で『項目03』から再定義を繰り返す処理をしています。
勉強初めて数日の方でしたら、中々解読は難しいかと思いますが
Sedviciousさんがおっしゃる通り、是非1語ずつ解読していってください。
完全に理解できれば、なぜ項目03から処理を始めたのか等わかると思います。
 頑張ってください。


Sub name_teigi()
Dim i As Integer 'ループカウンタ
Dim ken As Integer 'c列の行数
Dim str_ad As String '範囲開始アドレス
Dim end_ad As String '範囲終わりアドレス
Dim han_name As String '範囲名前

ken = ActiveSheet.Range("c3").CurrentRegion.Rows.Count '//C列の行数取得

'//str_ad をセルC10000から上に上り文字入力があるセルのアドレスと定義する
str_ad = ActiveSheet.Range("c10000").End(xlUp).Address


For i = 0 To ken '//ken回処理を繰り返す(nextまでの間)

'//もし指定のアドレス(項目名に記入があるならば)が空白で無いときには以下の処理を行う
If ActiveSheet.Range("c10000").End(xlUp).Offset(-i, -1).Value <> "" Then
'//範囲指定の端のアドレスをend_adと定義する
end_ad = ActiveSheet.Range("c10000").End(xlUp).Offset(-i).Address
'//範囲定義の名前をhan_nameと定義する
han_name = ActiveSheet.Range("c10000").End(xlUp).Offset(-i, -1).Value
'//セル範囲の名前定義
ActiveSheet.Range(str_ad & ":" & end_ad).Name = han_name
'//次範囲のstr_adの再定義
str_ad = ActiveSheet.Range("c10000").End(xlUp).Offset(-i - 1).Address
End If
Next i

End Sub

ちなみに、VBEのデバックツールバーでステップインと言うボタンを使用すると
1行ずつコードを動作させる事ができるので動きを理解するのに役にたちますよ

>LifeHackerさま

わー!ありがたいです!

確かに難しそうですが、自分がやりたいことを実現させるための勉強ならめげることもありませんし、これだけ具体例をだして頂けたら的を絞って勉強できるので希望の光が見えました。

どうも有り難うございます。

ログインすると、みんなのコメントがもっと見れるよ

mixiユーザー
ログインしてコメントしよう!

EXCEL VBA 更新情報

EXCEL VBAのメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。