• ベストアンサー

選択範囲の空白セルに0を入れるマクロ

Private Sub CommandButton1_Click() If Cells("選択範囲").SpecialCells(xlcellTypeblank).Select Then Range("選択範囲").Value = 0 End If End Sub このマクロを作成したのですが、動きません。 どこが、おかしいのでしょうか?

  • dadao
  • お礼率79% (85/107)

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

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.5

こんばんは。 実際にやってみましたが、考えていたよりも遥かにむつかしいですね。 このSpecialCells のコードのレベルは、意外にも、かなり上級になってしまうかもしれません。今回は、便宜的に使います。 確かに、記録マクロで作れるレベルですが、思わぬ落とし穴が一杯あります。 私が、最初に考えていたコード(BlankToZero) ・VBAでは、本来は、なるべく、ワークシートの「名前-定義」は、あまり使わないほうがよいです。「名前-定義」がエラーでもぐりこんでしまうと、VBAでは触れられなくなってしまいます。 ・SpecialCells(xlCellTypeBlanks)は、以下のような、エラートラップ必要です。 (1) Sub BlankToZero() Dim r As Range 'SpecialCells のブランク探しは、エラートラップが必要です On Error Resume Next '名前-定義でつけられたもの,オブジェクトの中にシート情報があるので、芳しくない Set r = Range("選択範囲").SpecialCells(xlCellTypeBlanks) On Error GoTo 0 If Not r Is Nothing Then   r.Value = 0 End If 'オブジェクトの開放 Set r = Nothing End Sub しかし、これでは、本当に成功はしません。それは、SpecialCells は、あくまでも、UsedRange の範囲しか受けつけてくれませんので、いくら、「名前-定義」があっても、正しく、「0」は入らない時があります。 したがって、どうやら、.SpecialCells(xlCellTypeBlanks) は、万能ではなさそうです。(うまくいく場合は、あくまでも、UsedRangeに、その範囲が入っている場合のみです) 以下のようなものからやってみてください。なるべく、ワークシートで使われるメソッドは、ミスやトラブルが多いので、実践を何度も積んでからのほうがよいです。私は、今回は、たまたま気がついただけです。 次が改良型(BlankToZeroRvs) '標準モジュールのみ Sub BlankToZeroRvs() Dim c As Variant '画面を更新させないと、処理スピードが劇的に速くなります Application.ScreenUpdating = False For Each c In Range("選択範囲")  If IsEmpty(c) Then    c.Value = 0  End If Next c Application.ScreenUpdating = True End Sub

dadao
質問者

お礼

実際やってみました。 違いがまだわかりませんが、どちらでもうまくいきました。 もっと経験を積んで失礼にならないくらいになりたいです。 こんな骨なしに時間を無駄にしたと思われないようにがんばります。

その他の回答 (5)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.6

#5 の訂正です #今回は、便宜的に使います。 は、 ・VBAでは、本来は、・・・・ の末尾につけてください。便宜的に「名前-定義」を使います。 ということでした。そのままでは、意味が通りません。

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

Cells("選択範囲").SpecialCells(xlcellTypeblank) すなわち指定範囲の空白セルを Selectしてセル群のオブジェクト(Range)を掴み、 それのValueプロパティに対して、値0を代入する。 -- xlcellTypeblank はxlcellTypeblanksのミス -- Cells("選択範囲")はRange(選択範囲)が正しい RangeとCellsの関係を勉強すること ーー 例えば Sub test01() Range("A1:C10").Select Selection.SpecialCells(xlCellTypeBlanks).Select Selection.Value = 0 End Sub ーー 以下は参考に IFは不要ということに関連して SpecialCells(xlcellTypeblank)を使うことにより、IF文的な選択は内部的に行われるので、VBAのスクリプト上はIF文は要りません。 この機能がVBAなどスクリプトを使えば、IF文の繰り回しを表現せずに、実質IFを多数回数繰り回ししたのと同じになります。 それでコードがすっきりします。 For Each Cl In Rande(範囲) If Cl="" Then ・・ と言ったコードに比べれば、すっきりします。 ですから (1)VB的コード法(他言語のプログラム経験あり、エクセルVBAの 本を余り読んでないタイプの人に多い) (2)エクセル固有のプロパティを使うコード法 (3)もっと凝ったやり方(いつもあるとは限らないが有るかも) もうひとつ例を挙げると、Findメソッドを使うと(2)にあたり 各セルをIF文で同じか聞いて、全行走査するのが(1)です。 エクセルの関数をVBAで使うのも(2)です。例えば平均で、合計をだし、データ数で割って出すのは(1)です。

dadao
質問者

お礼

すいません。丁寧な解説ありがとうございます。 とにかく、VBAを覚えようと思って、何でもかんでも自動化を試しています。 経験を積むことが大事かなと思って。

  • merlionXX
  • ベストアンサー率48% (1930/4007)
回答No.3

#1です。 If Cells("選択範囲").SpecialCells(xlcellTypeblank).Select Then と End If の2行はいりません。念のため。

  • bonaron
  • ベストアンサー率64% (482/745)
回答No.2

Private Sub CommandButton1_Click()   Range("選択範囲").SpecialCells(xlCellTypeBlanks).Value = 0 End Sub 単純にこれでよろしいのでは?

dadao
質問者

お礼

確かにこれで行きました。 ありがとうございます。

  • merlionXX
  • ベストアンサー率48% (1930/4007)
回答No.1

構文が変です。 Range("選択範囲").SpecialCells(xlCellTypeBlanks).Value = 0

関連するQ&A

  • 実行時エラー1004空白セルを上に詰める

    よろしくお願いします いろいろ試しましたが解決できませんでした。 Private Sub CommandButton1_Click() With Worksheets("Sheet1") For r = 2 To .Cells(Rows.Count, "C").End(xlUp).Row If .Cells(r, "C").Value = 提出先.Value Then Me.提出先.Value = "" .Cells(r, "C").Value = "" Else End If Next r .Range("J3").Value = "" ’下記の構文でエラーが出ます ’実行時エラー1004 ’アプリケーション定義またはオブジェクト定義のエラーです .Range(Range("C2"), Cells.SpecialCells(xlCellTypeLastCell)).SpecialCells (xlCellTypeBlanks).Delete Shift:=xlUp End With End Sub

  • セルの選択について

    <Sheet2のコード> Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Not UserForm3.Visible Then UserForm3.Show 0 UserForm3.TextBox1.Text = Selection.Count End Sub *********************************************** <UserForm3のコード> Private Sub CommandButton1_Click() With Selection .MergeCells = True .WrapText = True .Value = TextBox2.Text & ComboBox1.Text End With UserForm3.Hide End Sub ---------------------------------------------- Private Sub UserForm_Initialize() Dim lastrw As Integer, lastrw2 As Integer, i As Integer lastrw = Sheet3.Range("A1").End(xlDown).Row lastrw2 = Sheet3.Range("B1").End(xlDown).Row If Sheet2.Range(Cells(5, 4), Cells(5, 100)).Select Then ・・・(1) For i = 1 To lastrw - 1 ComboBox1.AddItem Sheet3.Cells(i + 1, 1).Value Next i End If If Sheet2.Range(Cells(6, 4), Cells(6, 100)).Select Then ・・・(2) For i = 1 To lastrw2 - 1 ComboBox1.AddItem Sheet3.Cells(i + 1, 2).Value Next i End If End Sub ************************************************* ワークシート上でマウスで選択されたセルの行ごとにUserForm3のComboBox1で表示させる文字を変えたいのですが、どのようにすればよいのでしょうか。 上の(1)(2)だととマウスで選択されたセルではなく(1)(2)の範囲のセルが結合されてしまいます。。。 また、今はワークシート上でマウスを左クリックする度にUserForm3が表示されてしまいます。 これをワークシート上でマウスでセルを選択して右クリックするとUserForm3が表示される ようにしたりすることは可能なのでしょうか。

  • シートを選択した時に実行するマクロについて

    今下記のようにボタンを押したらマクロが実行されるようにしていますが、"退出"というシートを選択した時に実行するようにするにはどの様に書けばいいでしょうか? Private Sub CommandButton1_Click() With Range("A4").CurrentRegion .Cells(.Rows.Count + 1, 1).Select End With End Sub よろしくお願い致します。

  • エクセルマクロで特定の範囲が空白という条件

    いつもお世話になっております。 今回の質問は、マクロである範囲が空白であるという条件を記載するのはどうすればよいかということです。 例えば、下のマクロはA1からB2までの矩形の範囲が全くの空白であるときに、C3に3を入力するというつもりで作りましたが、 If a.Value = "" Then の行でエラーになるようです。 この空白の条件はどのように記載すればよろしいでしょうか。 Sub a() Dim a As Range Set a = Range(Cells(1, 1), Cells(2, 2)) If a.Value = "" Then Cells(3, 3) = 3 End If

  • このマクロの説明をお願いします

    Dim buf As String Private Sub CommandButton1_Click() End Sub Private Sub Worksheet_Change(ByVal Target As Excel.Range) Dim tmp As Variant Application.EnableEvents = False tmp = InStr(2, buf, "$", vbTextCompare) tmp = Right(buf, Len(buf) - tmp) If buf = "$B$" & tmp Then Range("C" & tmp).Value = Range("C" & tmp).Value + Range("B" & tmp).Value Range(buf).Select End If Application.EnableEvents = True End Sub Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range) buf = ActiveCell.Address End Sub どうやらB列の各セルに入力がされた場合、隣接するC列のセルに加算していくマクロのようです。 なんですが、 InStr関数、Right関数、Len関数あたりでやっていることがよくわかりません。 Private Sub CommandButton1_Click()は必要なのでしょうか? あと、 もっとシンプルなマクロができるようでしたらご教授ねがいます。

  • 実行中のマクロを中断したい

    過日、「マクロの中断」について質問し適切な回答をいただき無事解決したものです。 ところが、初心者の悲しさ、少し変わると全く応用がききません。 Range("A1:B10")を読み上げている途中で中断したいのです。前回ご教示いただいたところにより 「DoEvents」や「Me.Repaint」「Sleep」などをあちこち挿入してみましたがうまくいきません。理屈、理論を理解できていないので仕方ないのでしょうがよろしかったら又ご指導のほどお願いします。Excel2003です。 Dim c As Range Dim CancelFlg As Integer Private Sub CommandButton1_Click() Range("A1:B10").Select CancelFlg = 0 For Each c In Selection   ’ DoEvents Application.Speech.Speak c.Value  ’ DoEvents If CancelFlg = 1 Then Exit For  ’ DoEvents Next c Range("A1").Select End Sub Private Sub CommandButton2_Click() CancelFlg = 1 End Sub 前回のご教示いただいたもの Private Sub CommandButton1_Click() Dim i As Integer CancelFlg = 0 For i = 1 To 100 DoEvents ActiveCell.Value = 1 ActiveCell.Offset(1, 0).Activate Application.Wait (Now + TimeValue("0:0:01")) If CancelFlg = 1 Then Exit For Next i End Sub Private Sub CommandButton2_Click() CancelFlg = 1 End Sub

  • 12個のCommandbuttonをスマートに

    はじめまして 2003 XP UserFormにCommandbuttonが12個あります。 Private Sub CommandButton1_Click() If Me.MultiPage1.Value = 0 Then TextBox3.Value = TextBox3 & "1" Else: TextBox1.Value = TextBox1 & "1" End If End Sub Private Sub CommandButton2_Click() If Me.MultiPage1.Value = 0 Then TextBox3.Value = TextBox3 & "2" Else: TextBox1.Value = TextBox1 & "2" End If End Sub Private Sub CommandButton3_Click() If Me.MultiPage1.Value = 0 Then TextBox3.Value = TextBox3 & "3" Else: TextBox1.Value = TextBox1 & "3" End If End Sub Private Sub CommandButton4_Click() If Me.MultiPage1.Value = 0 Then TextBox3.Value = TextBox3 & "4" Else: TextBox1.Value = TextBox1 & "4" End If End Sub Private Sub CommandButton5_Click() If Me.MultiPage1.Value = 0 Then TextBox3.Value = TextBox3 & "5" Else: TextBox1.Value = TextBox1 & "5" End If End Sub Private Sub CommandButton6_Click() If Me.MultiPage1.Value = 0 Then TextBox3.Value = TextBox3 & "6" Else: TextBox1.Value = TextBox1 & "6" End If End Sub Private Sub CommandButton7_Click() If Me.MultiPage1.Value = 0 Then TextBox3.Value = TextBox3 & "7" Else: TextBox1.Value = TextBox1 & "7" End If End Sub Private Sub CommandButton8_Click() If Me.MultiPage1.Value = 0 Then TextBox3.Value = TextBox3 & "8" Else: TextBox1.Value = TextBox1 & "8" End If End Sub Private Sub CommandButton9_Click() If Me.MultiPage1.Value = 0 Then TextBox3.Value = TextBox3 & "9" Else: TextBox1.Value = TextBox1 & "9" End If End Sub Private Sub CommandButton10_Click() If Me.MultiPage1.Value = 0 Then TextBox3.Value = TextBox3 & "0" Else: TextBox1.Value = TextBox1 & "0" End If End Sub Private Sub CommandButton11_Click() If Me.MultiPage1.Value = 0 Then TextBox3.Value = TextBox3 & "00" Else: TextBox1.Value = TextBox1 & "00" End If End Sub Private Sub CommandButton12_Click() If Me.MultiPage1.Value = 0 Then TextBox3.Value = TextBox3 & "000" Else: TextBox1.Value = TextBox1 & "000" End If End Sub  これをもっとスマートに出来ないでしょうか? 宜しくお願いします。

  • Excelマクロ ○印図形を消したい

    ○印図形を消したい Private Sub CommandButton2_Click() ' ○印をつける Dim a As Range If TypeName(Selection) = "Range" Then Set a = Selection ActiveSheet.Shapes.AddShape(msoShapeOval, a.Left, _ a.Top, a.Width, a.Height).Select Selection.ShapeRange.Fill.Visible = msoFalse a.Select End If End Sub Private Sub CommandButton3_Click() 上記のマクロでつけた○印を下記のようなマクロで(指定の範囲のセルにつけた○印を全て)消したいのですが、上記のマクロは問題なく動作するのですが、下記のマクロがうまく動きません、どこをどのように変更したらよいのでしょうか?、どなたかご教示ください。 ' 指定したセル範囲にある図形を削除する() ' ○印の削除 指定セル範囲 = "U32:X41" With ActiveSheet Set セル範囲 = .Range(指定セル範囲) For Each 図形 In .Shapes If 図形.Type = msomsoPicture Then Set 共有セル範囲 = Intersect(Range(図形.TopLeftCell, _ 図形.BottomRightCell), セル範囲) If Not (共有セル範囲 Is Nothing) Then 図形.Delete End If End If Next End With End Sub

  • リストボックスから項目を選択してセルに入力したいのです

    EXcel2003でマクロ作成中です。エクセルシートのN列を右クリックすると、ユーザーォームが現れ、その中のリストボックスから項目を選択すると選択文字が白色に反転します。 ユーザーホームの下方に設置した「入力する」ボタンをクリックする、アクティブセルにテキスト文字列が挿入されます。 Option Explicit Private Sub CommandButton1_Click() With ListBox1 If .ListIndex = -1 Then MsgBox "項目を選択してくだい" Else ActiveCell.Value = ListBox1.list(ListBox1.ListIndex) End If End With Unload UserForm1 End Sub --------------------------- Private Sub CommandButton2_Click() Unload UserForm1 End Sub ------------------------------ これと同じものをB列につくりました。エクセルシートのB列を右クリックすると、リストボックスが表示されますが、その中の項目を選択しようとすると、一瞬にしてユーザーフォーム自体が消えてしまい項目を 選択できません。 Private Sub CommandButton1_Click() With ListBox2 If .ListIndex = -1 Then MsgBox "項目を選択してくだい" Else ActiveCell.Value = ListBox2.list(ListBox2.ListIndex) End If End With Unload UserForm2 End Sub ----------------------------- Private Sub CommandButton2_Click() Unload UserForm2 End Sub ------------------------------------------ まったく同じものを作って内容だけかえたのですが、できません。 どうしてでしょうか?ご教授おねがいします。

  • 下記の式の意味が解りません、どなたか解る方がいらっしゃれば訳していただ

    下記の式の意味が解りません、どなたか解る方がいらっしゃれば訳していただけると大変ありがたいです。 当方、初心者なので宜しくお願い致します。 Private Sub CommandButton1_Click() Dim WCnt As Long Dim WIdx As Long Dim WChk As Integer WIdx = 2 WChk = 0 Do While Not WIdx > 65535 If Cells(WIdx, 4) = 1 And Cells(WIdx, 6) = 1 Then WChk = 1 ElseIf Cells(WIdx, 4) = "" And Cells(WIdx, 6) = 1 Then WChk = 0 End If If WChk = 1 Then Cells(WIdx, 3) = 5 End If WIdx = WIdx + 1 Loop Range("C2").Select End Sub Private Sub CommandButton2_Click() Selection.AutoFilter Field:=1 Range("C2:G65536").ClearContents Range("G2").Select End Sub

専門家に質問してみよう