• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:エクセルの列に関して)

エクセルの列に関して自動で列挿入する方法を教えてください

このQ&Aのポイント
  • エクセルの列について、自動で列が挿入されるよう設定したいです。例えば、C列に数字を入れた場合、列CとDの間に自動で新しい列を挿入できるようにしたいです。
  • また、C列には数式を使って計算を行いたいです。

質問者が選んだベストアンサー

  • ベストアンサー
  • m_and_dmp
  • ベストアンサー率54% (987/1817)
回答No.2

こんなに複雑で危ないことをマクロでやるより、初めからC2~C5列を用意しておいた方が良いとは思いますが、興味があったので作ってみました。 C列をC5まで増やすには、つぎのようなマクロでできると思います。 A,B,C,D,E,F,G...のタイトルが一行目(列はどこから始まっていてもOK)に記述されているものとします。 このサンプルマクロは自動起動ではありませんので、数値入力作業を開始する前にマクロを起動します。 起動すると、C5が作成されるまで(その条件を満足するまで)マクロが停止しません。停止しなくても別に害はないようですが、C5まで作成されないうちに数値入力作業が終了した時は、ブックをセーブして閉じます。つぎに開いたときはCのいくつまで作成されているかチェックされますので、例えばC2まで作成されていたならC2の行に数値が入力されるとC3が作成されます。 このマクロをシートに関連付けられたイベントプロシージャ「Private Sub Worksheet_Activate()」に記述しておけば、シートを開いたとき自動的に実行され、手動でマクロを起動する必要がなく、すぐに数値入力に進むことができます。 サンプルは想定外の操作をしたときどのような動作をするか検証をしていません。実際に業務でつかうときは、マクロが暴走しないようにエラー処理を工夫してください。 なお、Cの合計のみを求めるにはSUMIF関数が使えると思います。 Sub InsertColmn() LOA = Application.Match("A", Rows(1), 1)  i = Application.Match("D", Range(Cells(1, LOA + 3), Cells(1, LOA + 7)), 1) If i >= 5 Then GoTo EP IV = Application.Sum(Columns(LOA + i + 1)) If IV <> 0 Then GoTo EP RPT: DoEvents CV = Application.Sum(Columns(LOA + i + 1)) If CV <> IV Then Columns(LOA + i + 2).Insert: Cells(1, LOA + i + 2) = "C" & i + 1: i = i + 1 If i >= 5 Then GoTo EP GoTo RPT EP: End Sub

tm-mt
質問者

補足

わざわざありがとうございます。 コピーしてやってはみたものの、i = Application.Match("D", Range(Cells(1, LOA + 3), Cells(1, LOA + 7)), 1)の部分が『一致しません』となりできませんでした。 やり方が違うのでしょうか?

その他の回答 (2)

  • m_and_dmp
  • ベストアンサー率54% (987/1817)
回答No.3

i = Application.Match("D", Range(Cells(1, LOA + 3), Cells(1, LOA + 7)), 1) の部分が『一致しません』... ということでしたので、オリジナルではなく、OKWAVEからの通知のメールに含まれるマクロコードをそのままコピーして、マクロシートにペーストし、実行してみました。(ただし、長いコードの場合、適当なところで改行されていましたので、それは直しました。) その結果、オリジナルと同様に正常に動きました。 私の環境は、Excel2003です。 そこで、少々確認したいのですが、 ・マクロシートにコピーしたとき、文法が誤っていると赤く表示されますが、それはありませんでしたか? ・メニューバーのデバッグを選択して、ステップインで頭から実行してみて下さい。(ステップインボタンがツールバー上に出ているならそれで実行) ステップインボタンを押してすぐに『一致しません』エラーになりますか? もし、エラーになるなら、i=の式に使われている変数 LOAに問題がある可能性があります。Sub...のつぎの行で、Dim LOA as Integerと宣言してみてください。 またはLOAを別の名前に変更してみてください。 ・変数に問題があるのか、数式に問題があるのか切り分けるために、 i = Application.Match("D", Range(Cells(1, LOA + 3), Cells(1, LOA + 7)), 1) を単純な式に置き換えてみてください。 たとえば、i = Application.Match("D", Range(Cells(1, 4), Cells(1, 8)), 1) ・1行目に横方向に連続して、A B C D E F G ....とあらかじめ入力されていますか? LOA = Application.Match("A", Rows(1), 1) により、Aの位置を見つけます。 ステップインが可能であれば(即エラーにならなければ)、ステップインで頭からLOA=まで実行し、LOA上にマウスカーソルを載せて、LOAの値を確認してください。Aが1列目に記述されていれば、LOA=1となります。 ・つぎに、つぎの式でDの位置を見つけることによってCがいくつあるか判断するのですが、 i = Application.Match("D", Range(Cells(1, LOA + 3), Cells(1, LOA + 7)), 1) ステップインが可能になったら、実行してみてください。 Dの位置はCが一つなら、i=1となります。 Cが、C, C2, C3, C4, C5と、5つあれば、i=5となります。

tm-mt
質問者

お礼

ありがとうございました。 なんとか前回教えて頂いたやり方でできました。 ただこれを自動で列の挿入をするにはもうちょっと初心者でもわかるように説明してもらえるとありがたいです。

  • KURUMITO
  • ベストアンサー率42% (1835/4283)
回答No.1

目的はなんでしょう。1行でも数値が入ったら新しい列が追加されるとしたらその列では一つのセルにデータがあるのみですね。なんのためにそんなことをするのでしょう。目的がはっきりすれば別の対応も考えられると思うのですが?

tm-mt
質問者

補足

そうですね。簡単に例えるならば一日に一人につき必ず一個…ならいんですが、日によっては全くゼロかもしれないし、一人の人が何個も…てなった場合、何個もとなった場合を想定して常に予備の分のセルも用意しておかないとだし、sheet全体として納まりも良くないので。。。 以前に似たようなシステムをエクセルで作った人がいたんですが、それを見て自分もそういう風にできたらと思い聞いてみました。 ちなみに休日以外は毎日使うものなので一つのsheetに対し一日です。