- ベストアンサー
エクセルで自動処理を行いたい
MicrosoftのExcel2000で質問です。 数字のみを入力するセル(A1)があります。 このセルの値が 1の時は右のセル(B1)に斜線をひく 2の時は右二つ(B1,C1)に斜線を引く … 5以上の時は行の挿入(AとBの間に) 5以上の数字から5以下の数字に変更の時は挿入した行を削除 と言う処理をやりたいのですが、マクロを使えば出来るというところまでしか分かりません。 どなたか教えていただけないでしょうか? [ツール]→[マクロ]→…で実行するやつではなく 勝手にやってくれるようにしたいです。
- みんなの回答 (8)
- 専門家の回答
質問者が選んだベストアンサー
happypointさんのプログラムをベースにして作り変えて見ました。 行の追加と削除についてちょっと気になったんですが A1の値が 5未満の時(つまり4以下の時)なにもせず 5以上10未満の時(つまり5,6,7,8,9のとき)一行追加でいいんでしょうか? Option Explicit Private Sub Worksheet_Change(ByVal Target As Range) Dim varValue As Variant Dim myRow As Long Dim myCol As Long Dim befRow As Long Dim i As Integer Const kaigyouNum = 5 'セルA1の値の取得 If Target.Address <> "$A$1" Then Exit Sub 'A1以外のイベントは無視 varValue = Range("A1").Value '数値変換 If IsNumeric(varValue) = False Then Exit Sub '数値以外の時は処理を抜ける varValue = Int(CLng(varValue)) '強制的に整数に変換しています。 '行数の取得 myRow = Int(varValue / kaigyouNum) '5行未満は「0」。5行以上で「1」。10行以上で「2」。 myCol = varValue - myRow * kaigyouNum '5で割った端数 '現在の挿入行数を調査 befRow = 0 Do While cells(befRow + 1, kaigyouNum + 1).Borders(xlDiagonalDown).LineStyle = xlContinuous befRow = befRow + 1 Loop If befRow > 0 Then Call GyouSakujyo(befRow) End If '罫線クリア Range("B:F").Borders(xlDiagonalDown).LineStyle = xlLineStyleNone '罫線を引く(5個セット) If myRow > 0 Then Call GyouTsuika(myRow) Range(cells(1, 2), cells(myRow, kaigyouNum + 1)).Borders(xlDiagonalDown).LineStyle = xlContinuous End If '罫線を引く(端数) If myCol > 0 Then Range(cells(myRow + 1, 2), cells(myRow + 1, myCol + 1)).Borders(xlDiagonalDown).LineStyle = xlContinuous End If End Sub '新しい行を追加する Private Sub GyouTsuika(sounyugyou) Rows(2 & ":" & sounyugyou + 1).Select Selection.Insert Shift:=xlDown End Sub '行を削除する Private Sub GyouSakujyo(sakujogyou) Rows(2 & ":" & sakujogyou + 1).Select Selection.Delete Shift:=xlUp End Sub
その他の回答 (7)
- happypoint
- ベストアンサー率36% (521/1422)
うーむ。・・・ 無理ではないでしょうが、かなり複雑です。 どうしてもこういう処理でないといけないんでしょうか。 もういちど処理の内容自体を考え直したほうが、いいような気がします。 同じ結果を得るのにも、いろんな処理や解決方法があると思いますが、今回のご質問のような処理をするのが、最善(スマート・合理的)の方法だとは思えないです。 回答ではなくてごめんなさい。
- happypoint
- ベストアンサー率36% (521/1422)
お待たせしました。 セル「A1」の値に連動して、列B~Fまでに罫線を引く処理を行うサンプルです。 次のコードを、VBEのシートモジュール(処理を行いたいシートのシートモジュール)に貼り付けてみてください。 Option Explicit Private Sub Worksheet_Change(ByVal Target As Range) Dim varValue As Variant Dim myRow As Long Dim myCol As Long Dim i As Integer 'セルA1の値の取得 If Target.Address <> "$A$1" Then Exit Sub 'A1以外のイベントは無視 varValue = Range("A1").Value '数値変換 If IsNumeric(varValue) = False Then Exit Sub '数値以外の時は処理を抜ける varValue = Int(CLng(varValue)) '強制的に整数に変換しています。 '行数の取得 myRow = Int(varValue / 5) '5行未満は「0」。5行以上で「1」。10行以上で「2」。 myCol = varValue - myRow * 5 '5で割った端数 '罫線クリア Range("B:F").Borders(xlDiagonalDown).LineStyle = xlLineStyleNone '罫線を引く(5個セット) If myRow > 0 Then Range(Cells(1, 2), Cells(myRow, 6)).Borders(xlDiagonalDown).LineStyle = xlContinuous End If '罫線を引く(端数) If myCol > 0 Then Range(Cells(myRow + 1, 2), Cells(myRow + 1, myCol + 1)).Borders(xlDiagonalDown).LineStyle = xlContinuous End If End Sub
補足
おぉ~ こんな感じです!! こんなわけの分からん質問に真剣に回答していた出して本当に感謝です。(途中から連想ゲームになった?) しかも わざわざコメントまで・・・ ありがとうございます! あと・・・ こんな感じのセルがA1~A10まである場合1番目の数字が5以上のとき2番目以降のセルに斜線がはいってしまいます。出来れば、2番目の数字を3番目以降に移動させたいのですが・・・(行の挿入をして斜線を引く感じで挿入した行数を覚えておいて数字を変更したときに余計な行は削除する?) 説明が下手くそで申し訳ないのですが・・・
- happypoint
- ベストアンサー率36% (521/1422)
はあああ・・・なんとなく見えてきました。 なるほどねっ。 要するに、入力した数値の数だけ、斜線を引いたセルを作りたいと、そういうことですかね? で、各行につき、5個までセルを横に並べて、 6個以上になったときは次の行に送るようにしたいと。 そして、入力した値に応じて、リアルタイムに変化させたい、ということですね。 もう一つ質問していいですか? 何で斜線をひく必要があるんですか? 何かの目印? それとも紙に出力したりして、別の用途があるんですか?
補足
そうです。印刷する関係で次の行に移したいなぁって思ったんです。
- imogasi
- ベストアンサー率27% (4737/17069)
>数字のみを入力するセル(A1)があります。 このセルの値が 第1行はA1の値で 第2行はA2の値で 第3行はA3の値で 斜線を引くと言う風に「解釈しました。」 >1の時は右のセル(B1)に斜線をひく 2の時は右二つ(B1,C1)に斜線を引く … この部分は下記で良いですか。 Sub test01() d = Range("a1").CurrentRegion.Rows.Count ' MsgBox d For i = 1 To d n = Cells(i, "A") If n < 5 Then For j = 2 To n + 1 Cells(i, j).Borders(xlDiagonalUp) _ .LineStyle = xlContinuous Next j End If Next i End Sub >5以上の時は行の挿入(AとBの間に) AがA列を表すなら、意味不明。質問の表現は正確に。 >5以上の数字から5以下の数字に変更の時は挿入した行を削除と言う処理をやりたい・・・ これだとイベントプロセジュアを使わないと出来ないと思いますが、そこまで考えているのですか。 全体にあまり出くわすことのない特殊なニーズのような気がしますが。 もうすこし総合的なやりたい目的・趣旨でも書いていただければ、ハハンとくるものがあるでしょうが。
- happypoint
- ベストアンサー率36% (521/1422)
こんにちは。 変わった条件の処理ですね。 何のための処理なんでしょうか??? ゲームかなにかを作っているとか?! 教えていただけると興味深いです。 ちなみに3とか4が入力されたときは何もしないでいいんでしょうか?
補足
作ってるものはとちっちゃいお店の業務管理するものです。(ボランティアで作ることに…)(>_<;) 3以上の時も1・2と同様の動きをします。(ただし5以上の時は下に行く) 20の時は↓こんな感じ ///// ///// ///// ///// ついでに説明すると("~"は日付とかのデータ群、□は空) 5の時 ~~~~~///// 12の時 ~~~~~///// □□□□□///// □□□□□// ってしたい。
やりたいことがよくわからないので、なんだか不思議なものになってしまいました(^-^; が、一応、以下のコードで、A1が変われば動作するようになっています。 答えよりもヒントを出したほうが後々のためにはいいと思うんですが どうも説明が下手なもので。。。 でも、簡素な作りにしたつもりなので、わかっていただけると・・・いいなぁ。 Private Sub Worksheet_Change(ByVal Target As Range) Static intA1 As Integer If Target.Address <> "$A$1" Then Exit Sub If intA1 >= 5 And Cells(1, 1) < 5 Then Columns(2).Delete Shift:=xlToLeft intA1 = Cells(1, 1) Select Case intA1 Case 1 Cells(1, 2).Borders(xlDiagonalDown).LineStyle = xlContinuous Case 2 Cells(1, 2).Borders(xlDiagonalDown).LineStyle = xlContinuous Cells(1, 3).Borders(xlDiagonalDown).LineStyle = xlContinuous Case Is >= 5 Columns(2).Insert Shift:=xlToRight End Select End Sub
お礼
回答ありがとうございます。 まだ、試してみてはいないのですが、これを元にがんばって見たいと思います。
- arukamun
- ベストアンサー率35% (842/2394)
こんにちは 間違いなくマクロでなくてはできない処理があります。 また、行と列を間違えて覚えていらっしゃいませんか? 5以上の時は行の挿入(AとBの間に) AやBは列ですので、列の挿入だと思われます。 こういった作業はワークシート関数では実現できませんのでマクロですね。
補足
行と列を間違えました…m(_ _)m
お礼
いえいえ… ありがとうございます。 もう少し考えてみようと思います。 今までの回答がかなりヒントになると思っています。