プロが教えるわが家の防犯対策術!

2000行、13列のエクセルの表があります。数値を列の右から左の方へ入力しています。
時たま、行を上下に間違えてしまうことがあります。そこで今入力している行に A:M 列の範囲のセルを塗りつぶせないかと思いました。アクティブセルが別の行に移動したら、塗りつぶしを解除し、新しい行を塗りつぶす。こんなことVBAでできないでしょうか。
質問の意図が伝わっているか心配です。不明な点は補足要求をお願いします。

A 回答 (7件)

>エラーメッセージは「アプリケーション定義またはオブジェクト定義エラーです」なぜでしょうか。


これは、同一名称の変数が定義されている為に出るエラーです。

#1と#4を見比べてもらうとわかると思うのですが、
Public変数(svRow)は、Sheet1からModule1へ移動しています。
たぶん、まだSheet1に定義が残っていませんか?
それを削除してもらえば、エラー無く動作すると思います。
急な変更で、わかりづらくしてしまって申し訳ないです。
※#4の記述は、#1を上書きしてくださいね。(Sheet1)


Sheet1
'************************************************************
Option Explicit

Public svRow As Integer ← ※この行は、Module1に移動してます。

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  Dim actCol As Integer
  Dim actRow As Integer


    • good
    • 0
この回答へのお礼

たびたび、ありがとうございます。
Public svRow As Integer を Sheet1 から削除してうまく動作しました。
一度ブックを閉じて、再度開いても前回の選択行の塗りつぶしが消えました。書式も変更されることもありません。
★★★完璧です。どうもありがとうございました。

お礼日時:2003/01/21 11:12

#2のものです。


Okwebでの強制改行を考えて継続行にしたのが仇になったようです。
コピーした後、下記のように修正してください。
私がやったら、上手く動きます。
-----
ツール-マクロ-VBA
ProjectのSheet1をダブルクリック
(General)側をSheet1,(Declaration)側をSelectionChangeを選ぶ
Private Subの外にDim maerowを置く
Private SubからEndSubまでコピー
-----但しOKWEBで改行されるかも知れぬので
If maerow <> "" Then       --このままOK
ActiveSheet.Range("a1:m100").Rows --次ぎの行が
                     右に続く
(maerow).ClearFormats ----上の行の右につけて
                1行にする。  
End If          ----このまま
ActiveSheet.Range("a1:m100").Rows--次ぎの行が右
                    に続く
(Target.Row).Interior.ColorIndex = 8 --上の行の               右につけて1行にする。  
maerow = Target.Row ---このままOK
全体で5行です。(Sub とEnd Subを含め7行。
Private Subも含め8行。
手数ですがよろしく。
    • good
    • 0
この回答へのお礼

何度もありがとうございます。
今度はうまくいきました。スペース_ を改行と気がつかない私の落ち度でした。申し訳ありません。
#1,#3,#4,#5 と何度もご回答いただいた方のご見解を承った後、締め切りたいと思います。

お礼日時:2003/01/20 23:47

#1と#4の違いです。



#1では、EXCELを使っているのには何の問題もありません。
しかし、一度EXCELを再起動して現在と別な行をクリックすると
保存していた時の行の塗りつぶしが消えないのです。
これを消えるように修正したのが#4です。

>No.4は if ~ Then と End If は要らないのでしょうか。勝手に・・・
有っても無くても、動作上は問題ないですが無駄になるので消しました。

結論
塗りつぶしされたままで、保存しEXCELを再起動した時の処理の違いですので
EXCEL動作中には、何も違いは有りません。

この回答への補足

しつこくてすみません。No.4はうまく動作しません。
エラーメッセージは「アプリケーション定義またはオブジェクト定義エラーです」なぜでしょうか。

補足日時:2003/01/20 19:36
    • good
    • 0

まだ、少しばかり甘い所があるので追加&修正します。



選択状態(塗りつぶし済)で、エクセルを終了し起動し直すと初回のみ
塗りつぶしを解除しないので、それも解除するようにしました。
よって、多少コーディングが変更されたので全てコピペし直してください。

Sheet1は、動作的にはほとんど変わりありません。
ThisWorkbookは、起動時に現在選択されているセルの行を保存しています。
Module1は、svRowがPublicで使用できるように定義しています。


まず、「挿入」→「標準モジュール」で標準モジュールを追加。

以下のソースをSheet1,ThisWorkbook,Module1(標準モジュール)にコピペして下さい。

Sheet1
'******************** ここから ********************
Option Explicit

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  Dim actCol As Integer
  Dim actRow As Integer
 
  actCol = Target.Column
  actRow = Target.Row
 
  'With Range(svRow & ":" & svRow).Interior        '// 全列
  With Range(Cells(svRow, 1), Cells(svRow, 13)).Interior '// 列範囲(A:M)
    .ColorIndex = xlNone
  End With
 
  'With Range(actRow & ":" & actRow).Interior         '// 全列
  With Range(Cells(actRow, 1), Cells(actRow, 13)).Interior  '// 列範囲(A:M)
    .ColorIndex = 36
    .Pattern = xlSolid
  End With
 
  svRow = actRow
End Sub
'******************** ここまで ********************

ThisWorkbook
'******************** ここから ********************
Private Sub Workbook_Open()
svRow = ActiveCell.Row
End Sub
'******************** ここまで ********************

Module1
'******************** ここから ********************
Option Explicit
Public svRow As Integer
'******************** ここまで ********************

この回答への補足

すみません。質問しておきながら所用で外出してしまいました。
No.3の解説で cvRow は現在選択した行を覚えておくための変数(入れ物)なんですね。少し分かったような気がします。
No.4は if ~ Then と End If は要らないのでしょうか。勝手に付け足して動作を試みましたが、No.1と違いが分かりませんでした。

補足日時:2003/01/20 18:31
    • good
    • 0

質問のsvRowですがプログラムの最後に、以下の一行があります。


svRow = actRow
これは、現在選択した行を覚えておく為に現在の行を保存しています。
次回には、前回選択した行を覚えておく必要があるので。

エクセルを起動した直後は、プログラムが一度も動いてないのでsvRow=0となります。
というのは、前回選択した行が無いと言う事なのでここでは、塗りつぶし解除を
しなくてもいいので、svRow>0と言う風にしています。

解説がわかりずらくなったのでまとめます。

svRowは、前回選択されている行の塗りつぶし解除の為の行記憶変数。
svRow>0は、起動直後は塗りつぶし解除処理は必要ない為。
と言う事です。
    • good
    • 0

例えばSheet1のSelectioChangeイベントに


下記を貼りつけてください。maerowと言うPublic
変数を使っています。
ColorIndex値は適当に淡い色を選んでください。
今はライトブルー。Range("a1:m100")は適当に
変えてしてください(2箇所)。
Dim maerow
'-----
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If maerow <> "" Then
ActiveSheet.Range("a1:m100").Rows _(maerow).ClearFormats
End If
ActiveSheet.Range("a1:m100").Rows _(Target.Row).Interior.ColorIndex = 8
maerow = Target.Row
End Sub

この回答への補足

ご回答ありがとうございます。
教えていただいたコードを Sheet1のSelectionChange イベントにコピペしましたがうまく動作しませんでした。構文エラーでした。コピペだけではダメなんでしょうか。もし、注意事項がありましたら教えてください。

補足日時:2003/01/20 18:39
    • good
    • 0

>A:M 列の範囲のセルを塗りつぶせないかと


列範囲(A:M)で色をつけています。
※コメント化している部分に変更すれば、全列を色付け対象にします。

(1)Excelの「ツール」→「マクロ」→「Visual Basic Editor」を実行してVBEを起動する。
(2)VBE左上の「プロジェクトエクスプローラ」で「Sheet1」をダブルクリックする。

以下のソースをコピペで貼り付けてください。

'******************** ここから ********************
Option Explicit

Public svRow As Integer

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  Dim actCol As Integer
  Dim actRow As Integer
  
  actCol = ActiveCell.Column
  actRow = ActiveCell.Row
  
  If svRow > 0 Then
    'With Range(svRow & ":" & svRow).Interior        '// 全列
    With Range(Cells(svRow, 1), Cells(svRow, 13)).Interior '// 列範囲(A:M)
      .ColorIndex = xlNone
    End With
  End If
  
  'With Range(actRow & ":" & actRow).Interior         '// 全列
  With Range(Cells(actRow, 1), Cells(actRow, 13)).Interior  '// 列範囲(A:M)
    .ColorIndex = 36
    .Pattern = xlSolid
  End With
  
  svRow = actRow
End Sub
'******************** ここまで ********************

この回答への補足

早速のご回答感謝いたします。
当方の意図したとおりです。完璧でした。ところで後学のために教えて欲しいのですが、svRow というのは何を指しているのでしょうか。svRow > 0 というのが良く分かりません。お手数をおかけしますがよろしくお願いします。

補足日時:2003/01/20 13:54
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!