こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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

MicrosoftのExcel2000で質問です。

数字のみを入力するセル(A1)があります。
このセルの値が
1の時は右のセル(B1)に斜線をひく
2の時は右二つ(B1,C1)に斜線を引く

5以上の時は行の挿入(AとBの間に)
5以上の数字から5以下の数字に変更の時は挿入した行を削除
と言う処理をやりたいのですが、マクロを使えば出来るというところまでしか分かりません。

どなたか教えていただけないでしょうか?

[ツール]→[マクロ]→…で実行するやつではなく
勝手にやってくれるようにしたいです。

投稿日時 - 2003-06-11 16:22:26

QNo.572180

すぐに回答ほしいです

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

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

投稿日時 - 2003-06-13 11:45:09

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(8)

ANo.7

うーむ。・・・

無理ではないでしょうが、かなり複雑です。

どうしてもこういう処理でないといけないんでしょうか。
もういちど処理の内容自体を考え直したほうが、いいような気がします。

同じ結果を得るのにも、いろんな処理や解決方法があると思いますが、今回のご質問のような処理をするのが、最善(スマート・合理的)の方法だとは思えないです。

回答ではなくてごめんなさい。

投稿日時 - 2003-06-12 15:24:10

お礼

いえいえ…
ありがとうございます。

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

投稿日時 - 2003-06-12 15:52:43

ANo.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

投稿日時 - 2003-06-11 22:32:07

補足

おぉ~
こんな感じです!!
こんなわけの分からん質問に真剣に回答していた出して本当に感謝です。(途中から連想ゲームになった?)
しかも
わざわざコメントまで・・・
ありがとうございます!

あと・・・
こんな感じのセルがA1~A10まである場合1番目の数字が5以上のとき2番目以降のセルに斜線がはいってしまいます。出来れば、2番目の数字を3番目以降に移動させたいのですが・・・(行の挿入をして斜線を引く感じで挿入した行数を覚えておいて数字を変更したときに余計な行は削除する?)

説明が下手くそで申し訳ないのですが・・・

投稿日時 - 2003-06-12 01:19:01

ANo.5

はあああ・・・なんとなく見えてきました。

なるほどねっ。
要するに、入力した数値の数だけ、斜線を引いたセルを作りたいと、そういうことですかね?

で、各行につき、5個までセルを横に並べて、
6個以上になったときは次の行に送るようにしたいと。

そして、入力した値に応じて、リアルタイムに変化させたい、ということですね。


もう一つ質問していいですか?

何で斜線をひく必要があるんですか?
何かの目印?
それとも紙に出力したりして、別の用途があるんですか?

投稿日時 - 2003-06-11 21:11:32

補足

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

投稿日時 - 2003-06-12 01:14:04

ANo.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以下の数字に変更の時は挿入した行を削除と言う処理をやりたい・・・
これだとイベントプロセジュアを使わないと出来ないと思いますが、そこまで考えているのですか。
全体にあまり出くわすことのない特殊なニーズのような気がしますが。
もうすこし総合的なやりたい目的・趣旨でも書いていただければ、ハハンとくるものがあるでしょうが。

投稿日時 - 2003-06-11 21:01:29

ANo.3

こんにちは。

変わった条件の処理ですね。
何のための処理なんでしょうか???

ゲームかなにかを作っているとか?!
教えていただけると興味深いです。

ちなみに3とか4が入力されたときは何もしないでいいんでしょうか?

投稿日時 - 2003-06-11 17:39:23

補足

作ってるものはとちっちゃいお店の業務管理するものです。(ボランティアで作ることに…)(>_<;)


3以上の時も1・2と同様の動きをします。(ただし5以上の時は下に行く)
20の時は↓こんな感じ
/////
/////
/////
/////

ついでに説明すると("~"は日付とかのデータ群、□は空)
5の時
~~~~~/////
12の時
~~~~~/////
□□□□□/////
□□□□□//
ってしたい。

投稿日時 - 2003-06-11 18:25:56

ANo.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

投稿日時 - 2003-06-11 16:59:59

お礼

回答ありがとうございます。

まだ、試してみてはいないのですが、これを元にがんばって見たいと思います。

投稿日時 - 2003-06-11 18:25:49

ANo.1

こんにちは

間違いなくマクロでなくてはできない処理があります。

また、行と列を間違えて覚えていらっしゃいませんか?
5以上の時は行の挿入(AとBの間に)
AやBは列ですので、列の挿入だと思われます。

こういった作業はワークシート関数では実現できませんのでマクロですね。

投稿日時 - 2003-06-11 16:27:46

補足

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

投稿日時 - 2003-06-11 18:13:15

あなたにオススメの質問