• ベストアンサー

エクセルで自動処理を行いたい

MicrosoftのExcel2000で質問です。 数字のみを入力するセル(A1)があります。 このセルの値が 1の時は右のセル(B1)に斜線をひく 2の時は右二つ(B1,C1)に斜線を引く … 5以上の時は行の挿入(AとBの間に) 5以上の数字から5以下の数字に変更の時は挿入した行を削除 と言う処理をやりたいのですが、マクロを使えば出来るというところまでしか分かりません。 どなたか教えていただけないでしょうか? [ツール]→[マクロ]→…で実行するやつではなく 勝手にやってくれるようにしたいです。

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

  • ベストアンサー
回答No.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)
回答No.7

うーむ。・・・ 無理ではないでしょうが、かなり複雑です。 どうしてもこういう処理でないといけないんでしょうか。 もういちど処理の内容自体を考え直したほうが、いいような気がします。 同じ結果を得るのにも、いろんな処理や解決方法があると思いますが、今回のご質問のような処理をするのが、最善(スマート・合理的)の方法だとは思えないです。 回答ではなくてごめんなさい。

kiku_kiku
質問者

お礼

いえいえ… ありがとうございます。 もう少し考えてみようと思います。 今までの回答がかなりヒントになると思っています。

  • happypoint
  • ベストアンサー率36% (521/1422)
回答No.6

お待たせしました。 セル「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

kiku_kiku
質問者

補足

おぉ~ こんな感じです!! こんなわけの分からん質問に真剣に回答していた出して本当に感謝です。(途中から連想ゲームになった?) しかも わざわざコメントまで・・・ ありがとうございます! あと・・・ こんな感じのセルがA1~A10まである場合1番目の数字が5以上のとき2番目以降のセルに斜線がはいってしまいます。出来れば、2番目の数字を3番目以降に移動させたいのですが・・・(行の挿入をして斜線を引く感じで挿入した行数を覚えておいて数字を変更したときに余計な行は削除する?) 説明が下手くそで申し訳ないのですが・・・

  • happypoint
  • ベストアンサー率36% (521/1422)
回答No.5

はあああ・・・なんとなく見えてきました。 なるほどねっ。 要するに、入力した数値の数だけ、斜線を引いたセルを作りたいと、そういうことですかね? で、各行につき、5個までセルを横に並べて、 6個以上になったときは次の行に送るようにしたいと。 そして、入力した値に応じて、リアルタイムに変化させたい、ということですね。 もう一つ質問していいですか? 何で斜線をひく必要があるんですか? 何かの目印? それとも紙に出力したりして、別の用途があるんですか?

kiku_kiku
質問者

補足

そうです。印刷する関係で次の行に移したいなぁって思ったんです。

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.4

>数字のみを入力するセル(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)
回答No.3

こんにちは。 変わった条件の処理ですね。 何のための処理なんでしょうか??? ゲームかなにかを作っているとか?! 教えていただけると興味深いです。 ちなみに3とか4が入力されたときは何もしないでいいんでしょうか?

kiku_kiku
質問者

補足

作ってるものはとちっちゃいお店の業務管理するものです。(ボランティアで作ることに…)(>_<;) 3以上の時も1・2と同様の動きをします。(ただし5以上の時は下に行く) 20の時は↓こんな感じ ///// ///// ///// ///// ついでに説明すると("~"は日付とかのデータ群、□は空) 5の時 ~~~~~///// 12の時 ~~~~~///// □□□□□///// □□□□□// ってしたい。

noname#11856
noname#11856
回答No.2

やりたいことがよくわからないので、なんだか不思議なものになってしまいました(^-^; が、一応、以下のコードで、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

kiku_kiku
質問者

お礼

回答ありがとうございます。 まだ、試してみてはいないのですが、これを元にがんばって見たいと思います。

  • arukamun
  • ベストアンサー率35% (842/2394)
回答No.1

こんにちは 間違いなくマクロでなくてはできない処理があります。 また、行と列を間違えて覚えていらっしゃいませんか? 5以上の時は行の挿入(AとBの間に) AやBは列ですので、列の挿入だと思われます。 こういった作業はワークシート関数では実現できませんのでマクロですね。

kiku_kiku
質問者

補足

行と列を間違えました…m(_ _)m

関連するQ&A