- ベストアンサー
エクセルのVBの変数設定の仕方について
- エクセルのVBについて質問です。変数を設定する作業が何回もあるため、関数化できないかと考えています。
- 最後の列の数字を求め、そこから「○列前の列の数」という設定をしたいです。
- For文を使用して変数名に値を設定する方法について教えてください。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
ご質問のままだと、 ------------ Dim last_retu As Long Dim i As Integer Dim retu(1 To 8) As Long last_retu = Range("K5").End(xlToRight).Column For i = 1 To 8 retu(i) = last_retu - (9 - i) Next ------------ のように変数を宣言し、配列に格納すると、 ------------ retu(1) = last_retu - 8 retu(2) = last_retu - 7 retu(3) = last_retu - 6 retu(4) = last_retu - 5 retu(5) = last_retu - 4 retu(6) = last_retu - 3 retu(7) = last_retu - 2 retu(8) = last_retu - 1 ------------ となります。 使い方は、 ・「retu(5)」列目(「last_retu - 4」列目)の4行目を選択する場合 Cells(4, retu(5)).Select みたいなことになって、とても煩雑で分かりにくいですねぇ。 ======================== 「Range("K5").End(xlToRight)」の8つ左の列番号を「retu1」としたいということは、その列を基準にして、何かをしたいということかと存じますが、そのような意味合いでしたら、最初から >「Range("K5").End(xlToRight)」の8つ左の列 または、その列の何行目かの セル を「基準」にする考え方が普通かと存じます。 例えば、「Range("K5").End(xlToRight)」が「Range("T5")」とすると、その8つ左のセルは「Range("L5")」になります。つまり、「retu1」は「L列の列番号」=「12」ということになりますので、この「12 という列番号」または「Range("L5") という セル」を基準にします。 ------------------------ 前者の(列番号を変数にする)場合は、 Dim kijun As Long kijun = Range("K5").End(xlToRight).Offset(, -8).Column Cells(5, kijun).Select のようにすると、「Range("L5") という セル」が選択されます。 ------------------------ 後者の(Range オブジェクト を変数にする)場合は、 Dim kijun As Range Set kijun = Range("K5").End(xlToRight).Offset(, -8) kijun.Resize(4, 8).Select のようにすると、「retu1」~「retu8」の5行目~8行目、上記の例なら「L5:S8」が選択されます。 ======================== 今回のご質問は、「変数設定の仕方」の問題ではなくて、「セル範囲の指定の仕方」の問題ではないかと存じますので、下記をじっくりとお読みになって、ご理解を深められることをお薦めいたします。 初心者の方には、かなり難しい内容ですが、一行一行をよく理解しながら読み進めていかれれば、きっと、目が覚めるような理解が得られることと存じます。 ●RangeオブジェクトとRangeを返すプロパティ http://www.asahi-net.or.jp/~ef2o-inue/vba_k/sub04_070_10.html
その他の回答 (3)
- imogasi
- ベストアンサー率27% (4737/17069)
アイデアそのものが質問者の思いつきで、袋古小路にはいりかかっていて、回答者がそれにつき合わされている気がする。エクセルVBAのことを十分知らないからそんなアイデアが浮かぶのでは。 ーーー 直面しているニーズの全貌(何をやりたいときに、こういうことを考え付いたのか)を、全体的に実例を挙げて説明して、質問すべきでしょう。 変数って変化するごとに名前を別にしなくても良いものだし、変化にルール性があれば、それをコードに組み込めば仕舞いだと思う。 >エクセルのVB エクセルVBAという。 ーー RETUなど言っているので、エクセルのシートの処理に関することらしいが。 列名など問題にするのでなく、列番号を指定することを変数化(相対化)するのが普通ではないか。 ーー または例えば、第4行に名前retu1をつけて Sub test01() Worksheets("Sheet1").Range("retu1").Delete End Sub で第4行を抹消できる。 こういうのも応用できるかも。
お礼
回答ありがとうございます。 >エクセルVBAのことを十分知らないからそんなアイデアが浮かぶのでは。 その通りです。最近調べながら見よう見まねで作成しているので、 こんなアイデアしか浮かびませんでした。申し訳ありません>< 全貌を説明すると長いので、やりたいことをわかってくださった方からの返事を期待してました! >列名など問題にするのでなく、列番号を指定することを変数化(相対化)するのが普通ではないか。 考えてみます。 ありがとうございました。
- buraigasho
- ベストアンサー率78% (32/41)
列数が決まっているのでしたら、配列にしたほうが良いかと・・・ Dim retu() As Integer 'かな? ReDim retu(Range("K5").End(xlToRight).Column) Dim I As Integer For I = 1 To Range("K5").End(xlToRight).Column retu(I) = I - 1 Next でも、そもそも変数名を変化させるのはいかがなもでしょう~? っというか、変数は作れないです。。。 変数ではなく、Functionで戻ってくる値で使用した方がよいような・・・ そもそも変数をなぜ頻繁に作成しなければ????? 変数を設定するという作業が頻繁に行なわれるのは変ですしね。
お礼
回答ありがとうございます。 なるほど!配列を使用するのですね! 変数を作るというか、同じ変数を使いまわしたいと思ったのですが、 みなさんの意見を見てそもそも考え方が間違っている気がしてきました。 VB初心者なので申し訳ありません。 Functionで戻ってくる値を使用するというのも、考えてみます。 ありがとうございました!!
- NMZ1985
- ベストアンサー率30% (41/136)
retu_name = CStr(last_retu - 8) とすることでString型に型変更することができます。
お礼
回答ありがとうございます。 型変更という意味ではなくて・・・>< 説明が下手で申し訳ありません。 でもありがとうございました。
お礼
丁寧なご説明、誠にありがとうございます!! 質問の日本語さえ間違っていたとは・・・本当にすみません。 >「Range("K5").End(xlToRight)」の8つ左の列番号を「retu1」としたいということは、 >その列を基準にして、何かをしたいということかと存じますが、 その通りです。しかしながら、シートごとに基準にしたい列が違うため、 関数で変数を設定し直せたら・・、という趣旨でした。 やはりやりたいことを明確に記載すべきでした。申し訳ありません。 > 前者の(列番号を変数にする)場合は、・・・ この方法で解決できそうです。 このような記述方法があったのですね。。無知ですみません。 参考資料のURLもじっくり読みたいと思います。 本当にありがとうございました。