Excel VBA質問箱 IV

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

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


3735 / 13645 ツリー ←次へ | 前へ→

【60436】マクロを組んだ行に、列を挿入してもコードがずれないようにしたい ビタミン太郎 09/2/21(土) 13:39 質問[未読]
【60438】Re:マクロを組んだ行に、列を挿入してもコ... neptune 09/2/21(土) 16:59 回答[未読]
【60444】Re:マクロを組んだ行に、列を挿入してもコ... ビタミン太郎 09/2/22(日) 2:17 発言[未読]
【60446】Re:マクロを組んだ行に、列を挿入してもコ... SS 09/2/22(日) 10:34 発言[未読]
【60447】Re:マクロを組んだ行に、列を挿入してもコ... ビタミン太郎 09/2/22(日) 14:42 発言[未読]
【60448】Re:マクロを組んだ行に、列を挿入してもコ... SS 09/2/22(日) 19:55 発言[未読]
【60449】Re:マクロを組んだ行に、列を挿入してもコ... ビタミン太郎 09/2/22(日) 22:38 お礼[未読]
【60455】Re:マクロを組んだ行に、列を挿入してもコ... SS 09/2/23(月) 12:43 発言[未読]

【60436】マクロを組んだ行に、列を挿入してもコー...
質問  ビタミン太郎  - 09/2/21(土) 13:39 -

引用なし
パスワード
   こんにちは。
ネット上で検索をしましたがどうしても分からなかったため投稿させて頂きました。


A列の名前を「A入力」,B列の名前を「B入力」・・・、AA列の名前を「AA出力」,BB列の名前を「BB出力」・・・としたとき、A2:Z2までに入力するとAA2:BB2に計算結果を出力するマクロを作りました。

ここで、セルD2、セルQ2、セルAR2にそれぞれ列を挿入したとします。
セルを挿入したことでコード上に記述したセル範囲をすべて書き直す必要が出てきます。

このように一度作ったマクロがあるとき、列を挿入してもコードをコードを代えなくてもいい方法はありますか?
できればマクロ作成の初期段階で、列の挿入を想定したものを作りたいと思っています。

どうかよろしくお願いします。

【60438】Re:マクロを組んだ行に、列を挿入しても...
回答  neptune  - 09/2/21(土) 16:59 -

引用なし
パスワード
   ▼ビタミン太郎 さん:
こんにちは
>このように一度作ったマクロがあるとき、列を挿入してもコードをコードを代えなくてもいい方法はありますか?
>できればマクロ作成の初期段階で、列の挿入を想定したものを作りたいと思っています。
と、言う事で、まだソースは書いてないという事で書きます。

方法はいくらでもあると思います。
あるというよりその方法を考えるのですから、細かな事まで言えば
それを考える人の数だけあるかもしれません?

何に使うか知りませんが、列の挿入そのものを止めるのが一番簡単と思います。
ストリップデータと見せるためのデータを別に考えればよいだけです。

ストリップデータはデータ保管の為の物。
見せる為のデータは↑で必要なものだけ抜き取って整形してやれば
良いだけです。
このような考え方は多量のデータを扱う際の基本的な考え方と思います。

【60444】Re:マクロを組んだ行に、列を挿入しても...
発言  ビタミン太郎  - 09/2/22(日) 2:17 -

引用なし
パスワード
   ▼neptune さん:
お返事ありがとうございます!

>何に使うか知りませんが、列の挿入そのものを止めるのが一番簡単と思います。
>ストリップデータと見せるためのデータを別に考えればよいだけです。

実は今回質問したきっかけは、真の計算結果に必要な入力項目が今のところ完全に分かっておらず、新しい因子を見つけた時にその因子を入力項目に追加する必要が出てきてしまうからなんです。新たに入力しなければならない項目が増えたとき最終列に新項目を追加する必要が出てきてしまい、入力が面倒になったり表(ストリップデータ)が見づらくなってしまいます。
できれば入力項目の追加・変更がなくなるまでは、列挿入を想定したものを作りたいのですが・・なにかキーワードを教えていただけないでしょうか?

>ストリップデータはデータ保管の為の物。
>見せる為のデータは↑で必要なものだけ抜き取って整形してやれば
>良いだけです。
>このような考え方は多量のデータを扱う際の基本的な考え方と思います。

とても勉強になります。
入力項目に変更が無くなったときにストリップデータから見せるデータを抜き取る方法を使いたいと思います。今回はストリップデータの列の順番も入力項目→計算結果項目としたいと考えています。

【60446】Re:マクロを組んだ行に、列を挿入しても...
発言  SS  - 09/2/22(日) 10:34 -

引用なし
パスワード
   ▼ビタミン太郎 さん:

先ず一番簡単なのは出力データをAA列からはじめるのをBA列からはじめるように変更することだと思います。入力項目が増えることが予想されるのに入力欄に余裕を残さないのは解せません。
後は1行目にでも項目欄を作りこの項目名で検索して対応すると言うのはいかがですか?
たとえば項目名を数字にしておいて
  For i = 1 To Range("A1").End(xlToRight).Column
    MyArray(Cells(1,i).Value) = i
  Next i

  Cells(MyRow,MyArray(27)).Value=Cells(MyRow,MyArray(1)).Value * 3

※追加した列にはダブらない数字を入力する

>▼neptune さん:
>お返事ありがとうございます!
>
>>何に使うか知りませんが、列の挿入そのものを止めるのが一番簡単と思います。
>>ストリップデータと見せるためのデータを別に考えればよいだけです。
>
>実は今回質問したきっかけは、真の計算結果に必要な入力項目が今のところ完全に分かっておらず、新しい因子を見つけた時にその因子を入力項目に追加する必要が出てきてしまうからなんです。新たに入力しなければならない項目が増えたとき最終列に新項目を追加する必要が出てきてしまい、入力が面倒になったり表(ストリップデータ)が見づらくなってしまいます。
>できれば入力項目の追加・変更がなくなるまでは、列挿入を想定したものを作りたいのですが・・なにかキーワードを教えていただけないでしょうか?
>
>>ストリップデータはデータ保管の為の物。
>>見せる為のデータは↑で必要なものだけ抜き取って整形してやれば
>>良いだけです。
>>このような考え方は多量のデータを扱う際の基本的な考え方と思います。
>
>とても勉強になります。
>入力項目に変更が無くなったときにストリップデータから見せるデータを抜き取る方法を使いたいと思います。今回はストリップデータの列の順番も入力項目→計算結果項目としたいと考えています。

【60447】Re:マクロを組んだ行に、列を挿入しても...
発言  ビタミン太郎  - 09/2/22(日) 14:42 -

引用なし
パスワード
   ▼SS さん:
>先ず一番簡単なのは出力データをAA列からはじめるのをBA列からはじめるように変更することだと思います。入力項目が増えることが予想されるのに入力欄に余裕を残さないのは解せません。

なるほど。その通りだと思いました。拡張性のあるものを作ろうと思いすぎたばかりに入力欄に余裕を持たせるということにまったく気がつくことができませんでした。

>後は1行目にでも項目欄を作りこの項目名で検索して対応すると言うのはいかがですか?
>たとえば項目名を数字にしておいて
>  For i = 1 To Range("A1").End(xlToRight).Column
>    MyArray(Cells(1,i).Value) = i
>  Next i
>  Cells(MyRow,MyArray(27)).Value=Cells(MyRow,MyArray(1)).Value * 3
>
>※追加した列にはダブらない数字を入力する

上記コードを入力してみたのですが上手くいきませんでした。myarrayは変数という認識でよろしいんでしょうか?
とりあえずarray関数を調べていけば理解できると思うので頑張ってみます。
ご回答ありがとうございました。

【60448】Re:マクロを組んだ行に、列を挿入しても...
発言  SS  - 09/2/22(日) 19:55 -

引用なし
パスワード
   ▼ビタミン太郎 さん:

先ず上手く動かなかったのは変数の宣言がされていなかったからだと思います。
MyArrayについては配列で調べてください。
ひとつの案を示しただけで他にもっと良い方法もあると思いますのでこだわる必要は無いと思いますがちょっと書き足してみました。
先ずA1〜T1まで1〜20を、A2〜J2までA〜Jを入力する。
test()を実行するとH2〜T2に記号が出力されます。
次にH2〜T2をクリアした後A〜Hのどこかに列を挿入して
test()を実行してみてください。

Option Explicit

Sub test()
  Dim i As Long
  Dim MyArray(100) As Variant
  
  For i = 1 To Range("IV1").End(xlToLeft).Column
    MyArray(Cells(1, i).Value) = i
  Next i

  For i = 11 To 20
    Cells(2, MyArray(i)).Value = Cells(2, MyArray(i - 10)).Value & _
                    Cells(2, MyArray(i - 10)).Value
  Next i
End Sub

>▼SS さん:
>>先ず一番簡単なのは出力データをAA列からはじめるのをBA列からはじめるように変更することだと思います。入力項目が増えることが予想されるのに入力欄に余裕を残さないのは解せません。
>
>なるほど。その通りだと思いました。拡張性のあるものを作ろうと思いすぎたばかりに入力欄に余裕を持たせるということにまったく気がつくことができませんでした。
>
>>後は1行目にでも項目欄を作りこの項目名で検索して対応すると言うのはいかがですか?
>>たとえば項目名を数字にしておいて
>>  For i = 1 To Range("A1").End(xlToRight).Column
>>    MyArray(Cells(1,i).Value) = i
>>  Next i
>>  Cells(MyRow,MyArray(27)).Value=Cells(MyRow,MyArray(1)).Value * 3
>>
>>※追加した列にはダブらない数字を入力する
>
>上記コードを入力してみたのですが上手くいきませんでした。myarrayは変数という認識でよろしいんでしょうか?
>とりあえずarray関数を調べていけば理解できると思うので頑張ってみます。
>ご回答ありがとうございました。

【60449】Re:マクロを組んだ行に、列を挿入しても...
お礼  ビタミン太郎  - 09/2/22(日) 22:38 -

引用なし
パスワード
   ▼SS さん:
>先ず上手く動かなかったのは変数の宣言がされていなかったからだと思います。
>MyArrayについては配列で調べてください。
>ひとつの案を示しただけで他にもっと良い方法もあると思いますのでこだわる必要は無いと思いますがちょっと書き足してみました。
>先ずA1〜T1まで1〜20を、A2〜J2までA〜Jを入力する。
>test()を実行するとH2〜T2に記号が出力されます。
>次にH2〜T2をクリアした後A〜Hのどこかに列を挿入して
>test()を実行してみてください。
>
>Option Explicit
>
>Sub test()
>  Dim i As Long
>  Dim MyArray(100) As Variant
>  
>  For i = 1 To Range("IV1").End(xlToLeft).Column
>    MyArray(Cells(1, i).Value) = i
>  Next i
>
>  For i = 11 To 20
>    Cells(2, MyArray(i)).Value = Cells(2, MyArray(i - 10)).Value & _
>                    Cells(2, MyArray(i - 10)).Value
>  Next i
>End Sub

上記の方法で実行できました。一回目の実行で1行目と2行目の関係がmyarrayに記録されたため、2回目の実行をしても1行目と2行目の対応関係がくずれないんですね。参考にさせていただきます。
とても親切な回答で、もやもやがとれました。本当にありがとうございました。

【60455】Re:マクロを組んだ行に、列を挿入しても...
発言  SS  - 09/2/23(月) 12:43 -

引用なし
パスワード
   ▼ビタミン太郎 さん:

こんにちは、勘違いがあるので説明しておきます。
2度実行してもらったのは挿入しても計算が崩れないということを確認しただけで
最初に挿入してから計算しても計算結果は同じとなります。
MyArrayは実行のたびに毎回読み込み直し目的の値が何列目のセルに入っているかを格納します。
Cells(2, MyArray(1)).Valueは2行目かつ1行目のセルの値が1の列にある値となります。

>▼SS さん:
>>先ず上手く動かなかったのは変数の宣言がされていなかったからだと思います。
>>MyArrayについては配列で調べてください。
>>ひとつの案を示しただけで他にもっと良い方法もあると思いますのでこだわる必要は無いと思いますがちょっと書き足してみました。
>>先ずA1〜T1まで1〜20を、A2〜J2までA〜Jを入力する。
>>test()を実行するとH2〜T2に記号が出力されます。
>>次にH2〜T2をクリアした後A〜Hのどこかに列を挿入して
>>test()を実行してみてください。
>>
>>Option Explicit
>>
>>Sub test()
>>  Dim i As Long
>>  Dim MyArray(100) As Variant
>>  
>>  For i = 1 To Range("IV1").End(xlToLeft).Column
>>    MyArray(Cells(1, i).Value) = i
>>  Next i
>>
>>  For i = 11 To 20
>>    Cells(2, MyArray(i)).Value = Cells(2, MyArray(i - 10)).Value & _
>>                    Cells(2, MyArray(i - 10)).Value
>>  Next i
>>End Sub
>
>上記の方法で実行できました。一回目の実行で1行目と2行目の関係がmyarrayに記録されたため、2回目の実行をしても1行目と2行目の対応関係がくずれないんですね。参考にさせていただきます。
>とても親切な回答で、もやもやがとれました。本当にありがとうございました。

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