• ベストアンサー

ExcelのVBAについて教えてください

ワークシートの1行目から、任意の行数(行数は毎回違う)を削除する方法を教えてください。 E1から下に見にいって空白でないセルが現れたら、 そのひとつ上の行までを削除する。 Range("E1").Select Do Until ActiveCell = "" If ActiveCell = "" Then Selection.Offset(-1).Select Loop ここまでできましたが、続きがわかりません。 よろしくお願いします。 あとVBAのコードについて詳しく載っているURLを ご存知でしたら教えてください。 よろしくお願いします。

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

  • ベストアンサー
  • urk
  • ベストアンサー率33% (18/53)
回答No.3

>E1から下に見にいって空白でないセルが現れたら、 >そのひとつ上の行までを削除する。 だったら、CTRL+↓と同じなので、次のようにすれば LOOPは使わずに一発で消せます。 Range("E1").Select   'CTRL+↓ Selection.End(xlDown).Select   '一行上に上げる ActiveCell.Offset(-1, 0).Activate 'E1から、現在の行までを一気に消す Range("e1", ActiveCell.Address).EntireRow.Delete   'E1へ移動 Range("E1").Select

noname#2528
質問者

お礼

urkさん、こんにちは お礼が遅くなりすみません。 一行ずつ削除する方法をとっていたのですが、 行数が膨大なので時間がかかっていましたが、 urkさんの方法は、とても速いですね。 採用させていただきました。ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

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

先日も似たような質問があり載せたのですが 一番幼稚に易しくやるとすれば下記です。難しく考える 事なし。第1行目をDeleteしてれば良いのです。 繰り上がってくるから。 99と””で聞いている点は完璧ではないがFor Nextに対し Do Until Loopなどはお好みの方を。テスト済み。 Sub test01() For i = 1 To 99 If Cells(1, 5) <> "" Then Exit For Rows(1).Delete ' MsgBox i Next i End Sub

noname#2528
質問者

お礼

imogasiさん、こんにちは お礼が遅くなり申し訳ありません。 99以下とわかっているときは使えそうですね。 'Msgbox i が何を表したコメントかわかりませんでした。 VBA初心者なので、勉強していこうと思います。 ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
  • nishi6
  • ベストアンサー率67% (869/1280)
回答No.1

書き方を少し変えましたが処理例です。 While~Wend で入力があるE列の行を探しています。 E1に入力があったら何もしないようにしています。 Sub RowsDelete()   Dim rw As Long '行カウンタ   While Cells(rw + 1, 5) = "" 'E列は5番目だからCells( ,5)     rw = rw + 1   Wend   If rw <> 0 Then Rows("1:" & rw).Delete 'E1に何か入力があれば何もしない End Sub

noname#2528
質問者

お礼

nishi6さん、こんにちは お礼が遅くなり申し訳ありません。 VBA初心者なので、理解するのに時間がかかりましたが、試してみるととても速いですね。 ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • エクセルで行を非表示にするとアクティブなセルが・・・

    エクセルで行を非表示にするとアクティブなセル?行?がどこかわからなくなり、マクロでアクティブなセルを移動するときにエラーが出ます。 Sub example() ActiveSheet.Range("D3").Select Do Until ActiveCell = 23 If ActiveCell <> "" Then ActiveCell.Offset(1, 0).Select ElseIf ActiveCell <> "" Then ActiveCell.Offset(1, -3).Select ElseIf ActiveCell <> "" Then ActiveCell.Offset(1, -6).Select Else: ActiveCell.EntireRow.Select Selection.EntireRow.Hidden = True ActiveCell.Offset(0, -6).Select End If Loop End Sub 一番下のActiveCell.Offset(0, -6).Select にエラーが出るのですが、どうすればセルを移動できるでしょうか?

  • VBA Do Until内で値の貼り付けができない

    Excel2003を使用しております。 コピー&値のペースト作業をやってくれるマクロを作成しております。 具体的には、名簿に公がついていれば、その3つ左の名前をD27へ値のみコピペし、 D27がすでに値があれば、D28に書くことを、D37までループするようにしております。 しかし困ったことに、Do Untilコードを使用しておりますが、このコードではなぜか値の貼り付けが出来なくなります。 Sub Ns公() Dim work As Range Set work = Selection If Selection.Value = "公" Then ActiveCell.Offset(0, -3).Select Selection.Copy Do Until Range("D37").Select Range("D27").Select If Selection.Value = "" Then Selection.PasteSpecial paste:=xlPasteValues work.Select Else ActiveCell.Offset(1).Select End If Loop If Range("D36").Value <> "" Then Do Until Range("I37").Select Range("I27").Select If Selection.Value = "" Then Selection.PasteSpecial paste:=xlPasteValues work.Select Else ActiveCell.Offset(1).Select End If Loop work.Select End If work.Select End If work.Select ActiveCell.Offset(1).Select End Sub 原因や対策をご教授いただけるとうれしいです。よろしくお願いします。

  • VBA withの使い方

    VBAの参考書で勉強をしていますが、withの使い方で引っかかっているので、どなたかご教授ください。Excel2002 よくある見積書の表で、横方向の掛け算を行方向下に連続して行おうとしています。 C列-数量 D列-単価  E列に、C列の数量×D列の単価 をVBAで行の先頭から下方向に順番に計算する。 その際に、C列の数量のセルが空白だったら何もせず終了という下記のループの方法が 参考書に書いてあります。(セルE14がE列の計算する最初のセル) Range("e14").Select Do Until ActiveCell.Offset(0, -2).Value = "" With ActiveCell .Value = .Offset(0, -2).Value * .Offset(0, -1).Value .Offset(1, 0).Select End With Loop 上記のwithの位置をDo~Loopの外に出して以下のように書き換えたら、 Range("e14").Select With ActiveCell Do Until .Offset(0, -2).Value = "" .Value = .Offset(0, -2).Value * .Offset(0, -1).Value .Offset(1, 0).Select Loop End With 最初のセルE14は正しく計算処理をするが、1つしたのセルにアクティブセルが移動した後、永久ループに入ってしまいます。 「デバック」ボタンをクリックすると[.Offset(1, 0).Select]の行が黄色くなっているのですが、どこに問題があるのかが分からない状態です。 お手数ですが、よろしくお願いします。

  • Excel VBA のDo Until Loopについて

    こんばんは Excel VBAの初心者です。 Do Until Loopを使って B列の値が変わるところ(下記の表だと、空白からコスモスに変わる、4行目。コスモスからチューリップに変わる6行目。チューリップから菊に変わる8行目。)に行を挿入させたいと思い、下記のマクロを組んだのですが、Do Until Loopが理解できませんでした。 どうしたら良いのか教えて頂けないでしょうか。 宜しくお願い致します。 Excelのシート B1  項目 B2  空白 B3  空白 B4  コスモス B5  コスモス B6  チューリップ B7  チューリップ B8  菊 Sub 行の挿入() Dim y As String Cells(2, 2).Select y = Cells(2, 2).Value Do Until Cells(2, 2).Value <> y ActiveCell.Offset(1).Select Selection.EntireRow.Select Selection.Insert shift:=xlDown Loop End Sub

  • いい方法を教えてください(VBAについての質問)

    よろしくお願いします。 ある処理についてプロシージャを作成しました。 それは「毎回データの行数・列数の異なるデータから必要な列のデータだけを取り出して別のシートにコピーして貼り付ける」処理です。 具体的にはセルのA2以下にデータを貼り付けて必要な列の1行目空白セルに1を、不要な列は0を入れ、必要なデータ(1を入れた列にあるデータ)だけ取り出すという処理です。  Do Until ActiveCell.Value = ""   If Selection.Value = "1" Then   Selection.Offset(1, 0).Select   Range(Selection, Selection.End(xlDown)).Copy _   Destination:=mySht.Range("IV1").End(xlToLeft).Offset(0, 1)   Selection.End(xlUp).Offset(0, 1).Select   Else   Selection.Offset(0, 1).Select   End If  Loop ↑こんな感じで書きました。 myShtは変数で、必要データ貼り付け用に作成したシートです。 使ってみて穴に気付きました。 データに空白があった時に、空白以後のデータがコピーされないのです。そういう書き方なので当然ですが・・・。 範囲の指定をその列のデータの最初から空白関係なくデータのある最終行までにしようとあれこれと試しましたがことごとくうまくいきません。 これが1つ目の悩みです。 もう1つは   Range(Selection, Selection.End(xlDown)).Copy _   Destination:=mySht.Range("IV1").End(xlToLeft).Offset(0, 1) の部分、取り出した列のコピーを別のシート(mySht)に左寄せで順番に詰めてコピーしていくようにしたのですが、この記述だと1列目が空いてしまいます。 ですから実際はこの後1列目を削除する処理をしています。 この1列目の削除というのが本来不要な作業なので、なんだかイヤなのです。 何かいい方法を教えてください。 ヒントみたいなものでもうれしいです。

  • エクセルVBAでの関数

    下記、コードでセルに関数を入れるようにしてるのですが 関数で得られた値をセルに反映されるようにしたいのですが Dimを使用してもどう指定してよいのかわからず苦戦しております。 宜しくお願い致します。 Range("F1").Select Do Until ActiveCell.Offset(0, -1).Value = ""       With ActiveCell .FormulaR1C1 = "=MID(RC[-1],2,3)" .Offset(1, 0).Select End With Loop Range("A1").Select Do Until ActiveCell.Offset(0, 2).Value = "" With ActiveCell .FormulaR1C1 = "=RC[11]&RC[5]&Rc[8]&rc[9]&rc[3]" .Offset(1, 0).Select End With Loop

  • vba  

    VBAはじめたばかりで、躓きました。 下記を実行すると、”Nextに対するForがありません。”とでます。 なぜこうなるのか教えてください。  G2~列2000の間が空白になるまで、  下記の処理を続けるようにしたいと思っています。  Dim i As Integer For i = 7 To 2000 Do If Cells(2, i) = "" Then Range("G2").End(xlToRight).Select ActiveCell.CurrentRegion.Resize(6, 5).Select Selection.Cut Range("B2").End(xlDown).Select ActiveCell.Offset(1).Select ActiveSheet.Paste Exit Do End If Next i Loop  よろしくお願いします。

  • エクセルVBAでボタンを作ったシートとVBAを実行するシートを変えたい

    シート1にボタンを作成し、 そのボタンを押すと実行するVBAを作成しました。 そこで、VBAを実行するシートの指定はできるのでしょうか。 例えば、ボタンを押すと、 10行から20行まではシート2で実行させ、 30行から40行まではシート3で実行させたいと考えています。 可能でしょうか。 どうぞ宜しくお願いします。 *********************************************** 作成したVBA。ボタンはシート1にあります。 *********************************************** Private Sub CommandButton1_Click() *********************************************** ここからはシート2で実行させたい *********************************************** Range("E2").Select ActiveCell.FormulaR1C1 = "10" Range("E2").Select Selection.AutoFill Destination:=Range("E2:E101"), Type:=xlFillDefault Range("E2:E101").Select *********************************************** ここからはシート3で実行させたい *********************************************** Range("A2").Select ActiveCell.FormulaR1C1 = "100" Range("A2").Select Selection.AutoFill Destination:=Range("E2:E101"), Type:=xlFillDefault Range("A2:A101").Select End Sub

  • エクセルVBAでグラフの範囲を設定する方法

    お世話になっています。 グラフ自体は、作成済みのものを使用して、データの範囲だけを 変更させる方法を考えています。 A列に、データが入っている範囲を選択して、選択したセル範囲を グラフのデータ範囲としたいと思います。 現在、作成したプログラムは以下のものです。 当たり前なんでしょうが、以下のものではエラーになります。 Loopコマンドで、アクティブになったセルをグラフのデータ範囲に 設定する方法を教えてください。 よろしくお願いします。 Sub グラフ作成() ' Dim 範囲 As String Range("A1").Select Do Until ActiveCell = "" ActiveCell.Offset(1, 0).Activate Loop ActiveCell.Offset(-1, 0).Activate Range(Selection, Selection.End(xlToRight)).Select Range(Selection, Selection.End(xlUp)).Select   範囲 = ActiveCell ActiveSheet.ChartObjects("グラフ 1").Activate ActiveChart.SetSourceData Source:=Range(範囲) End Sub

  • エクセルxpのVBA

    VBA初心者です。下記を実行すると、「elseに対応するifがありません」と出ます。なぜかわからず困っています。 For hiniti = DateSerial(Range("A3"), Range("A4"), 21) To DateAdd("m", 1, DateSerial(Range("A3"), Range("a4"), 20)) ActiveCell.Value = hiniti ActiveCell.Offset(0, 1).Select If ActiveCell.Column = 7 Then ActiveCell.Offset(1, -7).Select Else: ActiveCell.Offset(0, 1).Select End If next end sub

専門家に質問してみよう