ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

Excel(エクセル)活用コミュのVBAで空白を示す

  • mixiチェック
  • このエントリーをはてなブックマークに追加
 
VBAに関していくつか質問があります

まずVBAで
“A1セルが空白でないなら”という条件式を作りたいなら

If Not Range("A1")=Empty Then

という式を組めばいいんですかね?

If Not Range("A1")="" Then

ではダメなんでしょうか?



またマクロをブック起動時から実行させるには
Workbook_Open を入力

シートアクティブ時に実行させるには
〔シート名〕!auto_activate を入力すればいいと聞きましたが
それぞれ具体的にどこに入力すればいいのでしょうか?

Subの後ろに入力すればいいと聞きましたが
実際にはSubの後ろには

Sub 文字のクリア()

みたいな感じで、Subの後ろになんらかの文字が入っています。
なので、どこに入力していいのやら分からずに困っています。
 
また'07バージョンと以前のバージョンではやり方が違うそうなのですが
自分の会社では両方のバージョンが混在していて
旧バージョンのエクセルでは実行できないなんてことも考えられて心配です。
 
 


コメント(19)

>A1セルが空白でないなら”という条件式を作りたいなら
↓このトピックが参考になると思います。

http://mixi.jp/view_bbs.pl?id=31668557&comm_id=2106
Book、Sheetのイベントは、
↓このサイトが参考になります。
標準モジュールに記述してもダメですよ。

http://excelvba.pc-users.net/fol3/3_6.html
1の補足です

If Not IsEmpty(Range("A1")) Then
  'Emptyでない場合の処理
Else
  'Emptyだった場合の処理
End If
>>1〜3
IsEmpty()なんてあるんですね〜
いい物教えてもらいました、ありがとうございます!

それとイベントはコードから付けるんですね

コードから付けるとして
形として

Sub 文字のクリア()  

Pribate Sub Worksheet_Active

………
……

End Sub

というふうになればいいんですかね?
 

…うまく伝わらなかった様で(^^;

シートが画面に表示されたら(アクティブになったら)
セルの文字を消したい(文字のクリア()を実行したい)ということでしょうか?
であれば、下記のようにしてください。

Private Sub Worksheet_Activate()
 '文字のクリア()の中のコード
End Sub

たとえば、こんな感じです
Private Sub Worksheet_Activate()
 Range("A1","D1").ClearContents
End Sub
はい、シートを選択した時点から常に
条件に合わせてある文字を消したいんです

Private Sub Worksheet_Activate()
 
If Not IsEmpty(Range("A1")) Then
  Range("D1").ClearContents

End If

End Sub

といった感じです。

Activate()の( )内にはシートの名前を入れればいいんですかね?
 
>Activate()の( )内にはシートの名前を入れればいいんですかね?
ダメです。以下の手順を踏んでください。

http://mixi.jp/view_bbs.pl?id=31973839&comm_id=2106
↑の4のコメントにある手順14でたかじさんの6のコードをはりつけます。
>>7
教えてもらった方法でなんとかいけました!
ワークシート内におけるマクロの組み方や仕組みもわかりました、どうもです!


これでなんとか起動時のマクロは組めたんですけど
実はこれ、セル内の内容が変わるたびに常に作動させたいんです

↓というも実際にやりたいのが以下の流れだからです

・A1セルとD1セルにそれぞれ入力規則をセット

・A1セルに何か(空白以外)を入力するとD1セルが空白になる

・D1セルに何か(空白以外)を入力するとA1セルが空白になる

・A1セルとD1セルの両方に文字列が入ってることはない

ってな具合なんですけど
上の一連の動作を作動させるために
>>6のプログラムをWorksheet_Change()に変えてやってみたんですが
これだと、A1セルが空白、D1セルが入力有りって状態で
A1セルに何か入力しようとしても強制的に入力が消されて
空白に戻ってしまいます。
 
どうすればいいですかね?
 
> たかじさん
昨日、飲み過ぎ(飲まされた)で返信の書き込みが遅れました…すみません。
>> A1セルに何か入力しようとしても強制的に入力が消されて
なぜかといいますと、Range("A1").ClearContentsするときにイベントが発生してしまうからです。
なのでカウンタiを設けて、奇数の時に実行させ、偶数はSubを終了させます。
もっといい方法があればいいのですが・・・。

Option Explicit
  Dim i As Integer
Private Sub Worksheet_Change(ByVal Target As Range)
  Dim n As Integer
  If Intersect(Target, Range("A1,D1")) Is Nothing Then Exit Sub
  i = i + 1
  n = Target.Column
  If (i Mod 2) = 1 Then
    If n = 4 Then
      Range("A1").ClearContents
    ElseIf n = 1 Then
      Range("D1").ClearContents
    End If
    i = 0
  ElseIf (i Mod 2) = 0 Then
    Exit Sub
  End If
End Sub
9の補足:
Dim i As Integerは、Dim i As Byteとした方がいいですね。
変数のデータ定義型については下記を参考にしてみてください。
http://home.att.ne.jp/zeta/gen/excel/c04p16.htm
9のコード修正します(^^; …空白でも実行されちゃった
11の削除わたしです …ごめんね。

Option Explicit
  Dim i As Byte
Private Sub Worksheet_Change(ByVal Target As Range)
  If Intersect(Target, Range("A1,D1")) Is Nothing Then Exit Sub
  Dim n As Integer: n = Target.Column
  i = i + 1
  If (i Mod 2) = 1 Then
    i = 0
    If n = 4 Then
      If IsEmpty(Range("D1")) Then Exit Sub
      Range("A1").ClearContents
    ElseIf n = 1 Then
      If IsEmpty(Range("A1")) Then Exit Sub
      Range("D1").ClearContents
    End If
  ElseIf (i Mod 2) = 0 Then
    Exit Sub
  End If
End Sub
5も修正 orz
誤: Range("A1","D1").ClearContents
正: Range("A1,D1").ClearContents
Changeイベントプロシージャ内で、セルの値を変えるときは
Application.EnableEvents で、イベント連鎖を防ぐのがセオリーです。
また、Target のセル数が1であることを前提としたプロパティは使うべきではありません。

今回の件では、ごくごく単純に
・A1に何か入力されたら、D1をクリアする
・D1に何か入力されたら、A1をクリアする
をくっつけるだけでいいのではないかと思います。
Private Sub Worksheet_Change(ByVal Target As Range)
  Dim rngA1 As Range
  Dim rngD1 As Range

  Set rngA1 = Application.Intersect(Target, Me.Range("A1"))
  If Not rngA1 Is Nothing Then
    If Not IsEmpty(rngA1.Value) Then
      Application.EnableEvents = False
      Me.Range("D1").ClearContents
      Application.EnableEvents = True
    End If
  End If

  Set rngD1 = Application.Intersect(Target, Me.Range("D1"))
  If Not rngD1 Is Nothing Then
    If Not IsEmpty(rngD1.Value) Then
      Application.EnableEvents = False
      Me.Range("A1").ClearContents
      Application.EnableEvents = True
    End If
  End If
End Sub

なお、コピペを使えば、A1,D1の両方が同時に空白でない状態は起こりえますが、今回は考慮しませんでした。
>ビリーさん
Application.EnableEvents 勉強になりました。ありがとうございます。
これで無限ループに陥らずに済みます。

あの、Application.EnableEvents = TrueにしないでExcel閉じても、また開きなおせばイベントは発生しますか?
>>ビリーさん、GOLDENさん

お二方すごいですね!
ちょっと自分の理解の範囲を超えているので
また勉強してから出直してきます。
> あの、Application.EnableEvents = TrueにしないでExcel閉じても、
> また開きなおせばイベントは発生しますか?

それは試せば分かることなので、コメントしません。
しかし、それを知ることにあまり意味はないと思います。
>>14

今日それを貼り付けてやってみたのですが

Set rngA1 = Application.Intersect(Target, Me.Range("A1"))

のIntersectのところで
「因数は省略できません」といったエラーメッセージが出てしまいます

これってどんなエラーなんですかね??
 
ちゃんとコピーペーストできてますか?
ワークシートモジュールの画像添付しますので比較してみてください。


http://msdn.microsoft.com/ja-jp/library/102s19ky(VS.80).aspx

ログインすると、残り1件のコメントが見れるよ

mixiユーザー
ログインしてコメントしよう!

Excel(エクセル)活用 更新情報

Excel(エクセル)活用のメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。