• ベストアンサー

VBA:空白の取得はできる?

Excel2003で、従業員データを管理する表を作成してます。 1行づつ従業員人のデータがあります。(従業員名、住所、連絡TEL、取引先、取引先担当者、取引先TEL) A列 従業員名、B列 住所、C列 連絡TEL、D列 取引先、E列 取引先担当者、F列 取引先TEL、です。 例えば、4行目の従業員が辞めた時A列からC列を削除します。 D列以降は取引先なので削除しません。 但し、その従業員が辞めた為、取引先とも取引を止めざるを得ない場合はD列以降も削除するので (例えば)4行目は(A4:F4)は空白になります。 空白の場合、以下(例えば5行目以降)のデータを繰上げたいのですが、その為に空白を取得したいのですが? (「A4~F4は空白である 」を取得出来ますか?) 一つのセルが空白か否かは取得出来たのですが・・・・ 複数のセルが空白か否か取得出来るんでしょうか? エクセル関係のサイトは探してみたんですが、わからなくて・・ ご教授願えたら嬉しいです。

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

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

#6です。 >A-F列にデータがない場合に表示はできますか? If WorksheetFunction.CountBlank(Range(s)) = 6 Then を If WorksheetFunction.CountBlank(Range(s)) <> 6 Then に変えるとどうですか。

starsip
質問者

お礼

返礼が遅くなりまして申し訳ありません。 >If WorksheetFunction.CountBlank(Range(s)) <> 6 Then ご回答のコードで、A-F列にデータがない場合を取得できました。 後は自分なりに修正してみます。お手数掛けました。 ありがとうございました。

その他の回答 (7)

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

こんにちは。 今回、サンプルコードを作ってみました。 何か、コードに癖をお持ちのようですので、なるべく早いうちに直したほうがよいです。どのような方法で作られたか分りませんが、imogasiさんのご指摘の「自分に合わせて」というのもごもっともな気がしますね。コードをみる限りは、一通りのVBAの勉強は終了したように読めますから。 それはともかく、気になった部分を指摘させていただきます。 -------------------------- On Error Goto の使い方は、エラートラップが発生した時に、飛ぶようにしますが、避けがたい(不可避)エラーを想定しますが、今回、エラーの発生する可能性はないはずですので使用しません。(私のサンプルをみてください) また、Goto ステートメント(Gotoメソッドは別)は、VBA/VBでは、基本的に使わないことになっています。使わないで作る方法を探したほうがよいです。 -------------------------- MsgBox を条件文にする時は、 ×If MsgBox("消去したデータは復活できません。本当に消去しますか?", vbOKCancel, "確認") Then End If If MsgBox("消去したデータは復活できません。本当に消去しますか?", vbOKCancel, "確認")=vbOk Then  Exit Sub End if -------------------------- もしかしたら、この目的が、書式や罫線を削除しない目的で、値を移し変えているのでしょうか? サンプルをみてください。 For j = i To LR Range(Cells(j, 1), Cells(j, 6)).Value = Range(Cells(j + 1, 1), Cells(j + 1, 6)).Value Next '============================== Private Sub CommandButton1_Click()   Dim i As Integer   Dim j As Integer   If TextBox1.Text = "" Then Exit Sub   i = CInt(TextBox1.Text)   If i < 11 Or i > 40 Then    MsgBox "入力した値に誤りがあります。" & Chr(13) & "11~40までの整数を入力してください。", vbOKOnly + vbCritical, "確認"    Exit Sub   End If     If MsgBox("消去したデータは復活できません。本当に消去しますか?", vbOKCancel, "確認") = vbCancel Then Exit Sub     'Wendy02の挿入行   If WorksheetFunction.CountA(Cells(i, 1).Resize(, 6)) = 0 Then      MsgBox Cells(i, 1).Resize(, 6).Address(0, 0) & "は、空白です。"        Cells(i, 1).Resize(, 6).ClearContents        j = Range("B41").End(xlUp).Row    Range(Cells(i, 1), Cells(j, 6)).Value = _    Range(Cells(i + 1, 1), Cells(j + 1, 6)).Value     End If     Unload Me   End Sub '------------------------------------ ただ、私がコードを書くのでしたら、目視で、A~F行が空なのは分りますから、わざわざ空白行を指定する必要がありません。VBA側で探させばよいわけです。 starsipさんのコードを元に、作ってみました。 Private Sub CommandButton2_Click() Dim c As Range Dim myRow As Range On Error GoTo ErrHandler  For Each c In Range(Cells(11, 1), Cells(Range("b65536").End(xlUp).Row, 6)).SpecialCells(xlCellTypeBlanks).Areas  If c.Columns.Count = 6 Then   If MsgBox(c.Address(0, 0) & "を削除してよろしいですか?", vbInformation + vbOKCancel) = vbOK Then         c.ClearContents     c.Resize(Range(c, Range("B65536").End(xlUp)).Rows.Count).Value = _     c.Offset(c.Rows.Count).Resize(Range(c, Range("B65536").End(xlUp)).Rows.Count).Value      End If  Else   '1部の行から空の場合  End If  Next  MsgBox "終了します。", vbInformation  On Error GoTo 0 Command2_Exit:  Unload Me  Exit Sub ErrHandler:  MsgBox "削除すべき行はありません。", vbInformation Err.Clear Resume Command2_Exit End Sub これは、2行に渡っていても削除できることなどが利点があります。 ただ、行の削除<.Deleteメソッド> を使って、書式・罫線を確保する方法は、PasteSpecial を使うことになるのですが、Copy する側の基準がややこしいそうな気がしましたので、やめました。

starsip
質問者

お礼

返礼が遅れまして申し訳ありません。 コードをご教授頂き、とても参考になりました。 まだまだ、勉強不足ですが頑張ってみます。 これからも宜しくお願いします。 ありがとうございました。

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

#2です。#2を修正してみました。 Private Sub CommandButton1_Click() If Val(TextBox1.Text) < 11 Or Val(TextBox1.Text) > 40 Then MsgBox "行指定範囲エラー" Else i = Val(TextBox1.Text) s = "A" & i & ":" & "F" & i If WorksheetFunction.CountBlank(Range(s)) = 6 Then If MsgBox("消去したデータは復活できません。本当に消去しますか?", vbOKCancel, "確認") Then Rows(i).Delete (xlUp) End If Else MsgBox "A-F列にデータあり" End If End If Unload UserForm1 End Sub (#2で If WorksheetFunction.CountBlank(Range(s)) = 4 は=6のミスでした。A-D列でテストやっていたため) 当初質問にUserFormなんて出ていなかったし、皆さんの回答を 自分に(UserFormありに)合わせて、質問者が修正できるようでないと回答を出しても意味がないと思いますが。 #2の回答のポイントは WorksheetFunction.CountBlank(Range(s)) の利用を示唆することしかないです。

starsip
質問者

お礼

再度のご回答ありがとうございます。 皆さんの意見を参考に修正はしているつもりなのですが・・ 実力がなくて、ご迷惑を掛けます。 imogasiさんのコードですとA-F列にデータかある時にメッセージが表示されます。 確かに参考になりまして、ありがとうございます。 A-F列にデータがない場合に表示はできますか? 「他人に聞かないで自分で考えなさい」と言われれば、確かにそうなのですが・・

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

#4 の訂正です。 #入力してあるセルはいくつ数えても、0 ですから、以下のようにすればよいのでは(^^;    ↓ 入力していないセルはいくつ数えても、     ~~~~~~

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

こんばんは。 もう、回答がいくつかでていますし、まだ他に方法はあるのですが、入力してあるセルはいくつ数えても、0 ですから、以下のようにすればよいのでは(^^; Sub BlankMovingUpRow() Dim i As Long i = 4 '実際は、For i = 最初の行 To 最後の行で、ループしてくださいね。  If WorksheetFunction.CountA(Cells(i, 1).Resize(, 6)) = 0 Then   MsgBox Cells(i, 1).Resize(, 6).Address(0, 0) & "は、空です"   Cells(i, 1).EntireRow.Delete  End If End Sub

starsip
質問者

補足

ご回答ありがとうござます。 質問の仕方が悪かったかもしれません。 UserForm1で削除する行を指定します。 UserForm1で指定した行のA列からF列が全て空白の場合、メッセージを表示したかったのです。 以下現在のコードを記載します。 Private Sub CommandButton1_Click() On Error GoTo case1 Dim RN As Integer Dim i As Integer Dim j As Integer Dim LR As Integer i = TextBox1.Text If i < 11 Then GoTo case1 End If If i > 40 Then GoTo case1 End If If MsgBox("消去したデータは復活できません。本当に消去しますか?", vbOKCancel, "確認") Then End If Range(Cells(i, 1), Cells(i, 6)).ClearContents LR = Range("b65536").End(xlUp).Row For j = i To LR Range(Cells(j, 1), Cells(j, 6)).Value = Range(Cells(j + 1, 1), Cells(j + 1, 6)).Value Next Unload UserForm1 Exit Sub case1: If MsgBox("入力した値に誤りがあります。" & Chr(13) & "11~40までの整数を入力してください。", vbOKOnly + vbCritical, "確認") Then End If End Sub 11行目から40行目にデータがあります。 UserForm1で指定した行のA列からF列が全て空白の場合、メッセージを表示できますか?

noname#187541
noname#187541
回答No.3

こんばんは。 COUNTBLANKを使うのはどうでしょうか。 A4:F4がすべて空白の場合は、 If WorksheetFunction.CountBlank(Range("A4:F4") = 6 Then Rows(4).Delete (xlUp) End If

starsip
質問者

お礼

ご回答ありがとうございます。 検討しましたが、今ひとつうまくいきません。 #4の方に補足しました。 宜しくお願い致します。

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

A-F列が全て空白(DELキーを押したと同じ値)行を探す。 Sub test02() For i = 2 To 10 s = "A" & i & ":" & "F" & i If WorksheetFunction.CountBlank(Range(s)) = 4 Then MsgBox i End If Next i End Sub 少数例ではうまくいくが、質問者のケースでうまくいくかやってみてください。 Andなしで済ましたところがミソです。 実際はMsgBoxのところへ行削除のコードを入れます。

starsip
質問者

お礼

ご回答ありがとうございます。 検討しましたが、今ひとつうまくいきません。 #4の方に補足しました。 宜しくお願い致します。

  • fortranxp
  • ベストアンサー率26% (181/684)
回答No.1

それって例えばこういうことですか? Private Sub CommandButton1_Click() Dim i As Integer For i = 1 To 200 If (Cells(i, 1).Value = "" And Cells(i, 2).Value = "" And Cells(i, 3).Value = "" And Cells(i, 4).Value = "") _ Then Rows(i).Delete Next End Sub

starsip
質問者

お礼

ご回答ありがとうございます。 検討しましたが、今ひとつうまくいきません。 #4の方に補足しました。 宜しくお願い致します。

関連するQ&A

  • エクセルVBAで不一致に空白セルを挿入

    エクセル2010です。 A、B列ともソートされています。 ごく少数ですが同一列内に重複するデータもあります。 そして A列に、1行目からA、B、C、E、F、F、H B列に、1行目からA、B、D、E、F、G、I (カンマは実際にはありません。) というような文字列データがある場合 別シートに A列に、1行目からA、B、C、空、E、F、F、空、H、空、 B列に、1行目からA、B、空、D、E、F、空、G、空、I、 (空は空白セルの意味です。) というように、お互いが一致しない場合は空白で飛ばし、一致するものは同じ行にするにはどのような方法がよろしいでしょうか? 例のように少ないデータなら目で見て手作業でできますが、実際は千件以上のデータです。 VBAでも関数でも結構です。よろしくお願いします。

  • VBAで最終行を取得する方法

    最終行を取得する方法について教えていただきたいです。 例えば以下のようなデータがあった場合 (A列~D列、3行までデータがある状態) -------------------------------- 田中 24歳 生命保険 営業 山口 47歳 銀行   営業 大野 36歳 IT    SE -------------------------------- ここで最終行を取得する際に、 Range("A1").End(xlDown).Rowをすれば取得できました。 しかしデータが以下のような場合 (A列が空白) -------------------------------- 田中 24歳 生命保険 営業    47歳 銀行   営業    36歳 IT    SE -------------------------------- この場合に上記と同じ取得方法をすると、オーバーフローになります。 そこで他の取得方法を調べたのですが、 ActiveSheet.UsedRange.Rowを試したところ、最終行として取得できたのは「1」でした。 A列が空白の状態でも、今回の場合だと「3」という最終行を取得するにはどうすれば良いでしょうか。

  • EXCEL VBA 条件による空白挿入

    EXCEL2003を使っています。 以下のように列FGHが空白の行については列ABCを空白を挿入したいのですが数万行あり処理をVBAで自動化したいです。どなたかお力をお貸し下さい。お願いします。 A B C D E F G H 1 1 2 3 4 5 6 7 8 2 1 2 3 4 5 _ _ _ 3 1 2 3 4 5 6 7 8 4 1 2 3 4 5 _ _ _ 5 1 2 3 4 5 6 7 8 ↓ A B C D E F G H 1 1 2 3 4 5 6 7 8 2 _ _ _ 1 2 3 4 5 3 1 2 3 4 5 6 7 8 4 _ _ _ 1 2 3 4 5 5 1 2 3 4 5 6 7 8

  • 行内で空白、重複を除いた結果を別セルに表示したい

    A~D列に言葉が入っているのを、F列以降に空白、重複を除いて、結果を表示したいのですが、やり方がわかりません。(別シートではなく、同じシート内で処理したいです。) A~D列に入る言葉は200個程の種類があります。 行は4万行くらいのデーターがあるので行列を入れ替えた表には出来ません。 ジャンプで空白セル選択→まとめて削除をすると、データー数が多いので、パソコンが固まってしまいました。 なので、行ごとに処理をしたいのです。 よろしくお願いします。  A     B   C    D        F     G    H    I みかん ぶどう りんご みかん → みかん りんご ぶどう みかん (空白) (空白) みかん → みかん (空白) ぶどう りんご みかん → ぶどう  りんご みかん みかん ぶどう りんご すいか → みかん ぶどう りんご すいか

  • EXCEL VBAでワークブックのデータ取得

    コードを実行するブックがあるホルダー内の全てのブック(10個程度)からSheet1のA列~E列のデータ(行数はブックにより異なりますが大体2000行程度)の2行目以降を取得し、コードを実行するブックのSheet("DATA")の2行目以降にデータを貼り付け、F列に取得したブック名を記載したいのです。 残念ながら最初でつまずいています。 なにとぞご教示お願いします。

  • Excel VBA 空白セル以下のデータを繰り上げるには?

    Excel2003で、従業員データを管理する表を作成してます。 B列~AC列まで、1行づつ個人のデータがあります。 例えば、4(任意)行目の人が退社した場合、4(任意)行目のデータのみデータクリア(B4~AC4)するVBAを組みましたが、自動的に5行目~のデータを繰り上げるのは可能でしょうか。 A列やAD列以降に管理番号などが入力されている(そのままにする)のと このシートを他のシートが参照しているので Rows.Delete で行ごと削除して繰り上げるわけにいかず悩んでます。   A   B   C   D・・ AC   AD  AF・・ 1 業者(1) 氏名 住所 TEL 入社年 部署 担当 2 001   阿部 東京 03- 2000  営業 A社 3 002   和田 千葉 04- 1990  営業 A社 4 003   佐藤 秋田 01- 1995  営業 B社 5 004   前田 富山 07- 1998  営業 B社 6 005   今井 新潟 02- 1985  財務 財務 7 006   青柳 東京 03- 1980  財務 財務 8 007   鈴木 千葉 01- 1990  工事 工事  ・  ・ 20 業者(2) 氏名 住所 TEL  入社年 部署 担当 21 001   内藤 東京 03- 2000  営業 A社  ・  ・  こういった表です。よい案がありましたら、宜しくお願いします。

  • VBA 最終行列の取得(空白混み)

    VBA 最終行列の取得(空白混み) 例えば以下のような場合正しくカウントするにはどの様にしたら良いでしょうか □→空白セル ■→データあり □ABCDEFGH 1□□□□□□□□ 2■■■■■■■■ 3■■■■■■■■ 4■■■■■■■■ 5□□□□□□□□ 6■■■■■■■■ 期待する戻り値 maxRow→6 maxColumn→8 行は最終行から特定可能ですが その方法だと列は1か0を返してくると思います。 最大値を求める手法はどんな物が考えられるでしょうか

  • EXCEL2010 VBAで空白行以外をコピー

    EXCEL2010を使用しています。 シートAではセルA1からA10に順にデータを入力していきます。 A1からA10のすべてにデータを入力する場合やA1からA4のみデータを入力する場合等があります。 このA1からA10のデータをシートBのA1からJ1にコピーしたいと思っています。 空白以外のデータをコピーして、コピー後はシートBのA1:J10で空白の列は削除したいと 思っています。 (例) シートA A1 ○ A2 ○ A3 × A4以降すべて空白 シートB A1 ○ B1 ○ C1 × D1からJ1までは列ごと削除 これをVBAで作成したいのですがどなたか詳しい方押してください。

  • 入力された●から●迄の空白をカウントする方法

    どなたかご存じでしたらご回答よろしくお願いします。 【質問】  各列毎に●や▲が任意の数がある8行のセルがあります。  8行目の任意列に●を入力した場合、  そこから上に遡って●までの間の空白のセルを数える方法が知りたいです。  但し、▲も”空白の1つ”として数えます。 【入力】    A  B  C  D  E  F  G …  1 ●  ●         2        ●  ▲ ● ▲   3     ▲ ●       ▲  4                5  6  7   8 ●  ● ●               【結果】  A B C D E F G・・・   6 6 4 0 0 0 0 ※結果の説明 A:8行目の●から上に数えて●迄の空白は6個。 B:8行目の●から上に数えて▲がありその上に空白と●があるが、▲を空白とみなして6個。 C:8行目の●から上に数えて最初の●迄の空白迄は4個。 D:8行目に●は無いため、空白は0個。 E:8行目に●は無いため、空白は0個。 F:8行目に●は無いため、空白は0個。 G:8行目に●は無いため、空白は0個。 使用するエクセルは2010です。 以上、よろしくお願いします。

  • エクセルVBAでのまとめ計算

     初めまして、よろしくお願いします。 データーで    A      B     C     D      E ・・・ 1              5     7      2 2              3     7      0 3 4              6     3      6 5              2     8      3 6              0     3      4 ・     ・      ・      ・      ・ ・     ・      ・      ・      ・ 100             3     4      5 という表がありますA列には(C列の値/(D列以降の平均値))をB列には(C列の値-(D列以降の平均値))を表示させたいと思います。たまに3行のような空白の行があります。関数式ではなく、VBAで解る方、よろしくお願いします。

専門家に質問してみよう