Excel VBAで最終行の文字列を消したい

このQ&Aのポイント
  • Excel VBAを使用して最終行の文字列を削除する方法についてアドバイスをお願いします。
  • Yahoo Financeのダウ工業株30種平均のヒストリカルデータのダウンロードマクロを作成していますが、最終行の文字列を削除する方法が分かりません。
  • 作成中のExcel VBAのマクロで、ダウンロードしたデータの最終行の文字列を削除するコードを追加しているのですが、うまく動作しません。どなたか解決策を教えてください。
回答を見る
  • ベストアンサー

Excel VBAで最終行の文字列を消したい

Yahoo Financeのダウ工業株30種平均のヒストリカルデータのダウンロードマクロを作成しています。 http://finance.yahoo.com/q/hp?s=^DJI Yahooファイナンス(Japan)にて日経平均のマクロは出来ているのでほとんど出来ており1ページ分はダウンロードできていますが、最終行(Excelに取り込んだときA列の一番下の文字列をマクロで削除したい。 Date Open High Low Close Volume Adj Close* 11-Jul-11 12,655.77 12,655.77 12,443.40 12,505.76 3,879,130,000 12,505.76 8-Jul-11 12,717.90 12,717.90 12,541.33 12,657.20 3,594,360,000 12,657.20 : : : : : : : : : : : : : : * Close price adjusted for dividends and splits. ←これを削除したい 以下のようなマクロを追加しているのですが、 : Dim Lastrow As Variant Dim Mojiretsu As String     : '最終セルの行を取得 Mojiretsu = "* Close price adjusted for dividends and splits." Worksheets("Sheet2").Activate Lastrow = ActiveSheet.Range("$A$1").End(xlDown).Row If Rows(Lastrow).String = Mojiretsu Then ActiveSheet.Rows(Lastrow).Delete End If どうもうまく動きません。 どなたか、アドバイスよろしくお願いいたします。

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

  • ベストアンサー
  • mu2011
  • ベストアンサー率38% (1910/4994)
回答No.2

ご例示のコードを変更してみました。 Mojiretsu = "* Close price adjusted for dividends and splits." With Worksheets("sheet2") lastrow = .Range("A1").End(xlDown).Row If .Range("A" & lastrow).Value = Mojiretsu Then .Rows(lastrow).Delete End If End With 一般的に最終行は、途中に空白行がある場合を想定でシート最終行から上方向に求めるのが定石です。 Range("A65536").End(xlup).Row、又はCells(Rows.Count,"A").END(Xlup).Row

tateyokoking
質問者

補足

一応、以下のコードで解決いたしました。 Worksheets("Sheet2").Activate Lastrow = ActiveSheet.Range("$A$1").End(xlDown).Row ActiveSheet.Rows(Lastrow).Delete "* Close price adjusted for dividends and splits."の文字列に関しては、ページをめくるごとに最後の一行に挿入され、Excelに取り込むとA列の一番最後(66~68行目)に必ず挿入されることがわかりました。 ですので、上記コードの様に、A列の最後の行を無条件に消すことにより問題ないことを確認しました。 keithinさん、mu2011さんご回答ありがとうございました。 回答例のコードは、VBA初心者の私には心強いです。 どうもありがとうございました。

その他の回答 (1)

  • keithin
  • ベストアンサー率66% (5278/7940)
回答No.1

方法1: range("A65536").end(xlup).entirerow.delete #ただし,あなたのマクロが当該のページのどこまでのデータをどんな具合に取り込んでいるのか不明なので,これでもダメかもしれません。 ##今のアナタのマクロで単に「だめでした」じゃなく,アナタのマクロのLastRowが具体的に何行目を取得しているのか事実を確認してみる(こういう作業を「デバッグ」といいます)と,どこで何を失敗しているのか(=具体的にどう直せば良いのか)もっとはっきり調べが付きます。ご自分で試してみてください。 方法2: dim h as range set h = cells.find(what:="Close price adjusted for dividends and splits", lookin:=xlvalues, lookat:=xlpart) if not h is nothing then h.entirerow.delete end if

関連するQ&A

  • VBA 最終行を選んだシートにコピーする。

    VBAど初心者です。どうしても最終行のデータを選んだシートにコピーできません。 LastRow.Selectのところで、止まってしまいます。どのように行を設定していいのかさっぱりわかりません。どなたか、ご指導のほどよろしくお願いします。 Sub copy_last_line() Dim LastRow As Long Sheets("Sheet1").Select LastRow = Cells(Rows.Count, 1).End(xlUp).Row LastRow.Select Selection.Copy Sheets("Sheet2").Select Range("A1").Select ActiveSheet.Paste Sheets("Sheet1").Select Range("A1").Select End Sub

  • EXCEL VBA4行毎に枠で囲みたい

    お世話になります。 添付の様な表1があります。 これを表2のようにA1から順に4行毎に枠で囲みたいのです。 下記のようなコードを見よう見まねで書いてみましたがうまく動きません。 ごなたかご教授いただけませんでしょうか? よろしくお願い致します。 Dim i As Long Dim j As Long Dim lngYCnt As Long Dim intXCnt As Long Dim LastRow As Long ingYCnt = Worksheets("Sheet1").UsedRange.Rows.Count intXCnt = Worksheets("Sheet1").UsedRange.Columns.Count LastRow = Cells(Rows.Count, 1).End(xlUp).Row With Selection For i = 5 To LastRow Range("A" & i & ":F" & j).Select Selection.BorderAround Weight:=xlMedium j = j + 5 i = i + 5 Next End With どなたかご教授いただけませんでしょうか? よろしくお願い致します。 環境 EXCEL2003 WINDOWS XP SP3

  • マクロ 入力する文字に色を付けたい

    Sub CountUp(ByVal mCol1 As String, mCol2 As String) Dim LastRow1 As Long Dim LastRow2 As Long Dim mRow As Long With Sheets("プレーヤー") LastRow1 = .Cells(Rows.Count, mCol1).End(xlUp).Row LastRow2 = .Cells(Rows.Count, mCol2).End(xlUp).Row If LastRow1 > LastRow2 Then mRow = LastRow1 Else mRow = LastRow2 End If If LastRow1 = 1 Then LastRow1 = 2 End If .Cells(mRow + 1, mCol1).Value = .Cells(LastRow1, mCol1) + 1 End With End Sub このコードに文字の色の指定をしたいです Selection.Font.ColorIndex = 3を入れたら赤色文字で入力できるかなと思ったのですがうまくいきませんでした(エラーにはならないのですが、色が付かなかったです)

  • エクセルVBA  どうしても動きません。

    お世話になります。 なかなか上達しない超初心者です。 ↓↓ですが、Activesheetにすると動くのに、シート名を元々存在するシート”実験"に指定すると動きません(データ内容はまったく同じで、A列に色んな名前が入っていて、重複しているとC列に重複と入力します)。 2日間試行錯誤したのですが、やっぱり動かず・・・ ちなみに、Activateにするとアクティブになるし、CurrentRegionも選択できるのに なんでうごかないんでしょうか・・・ 何卒ご指導くださいませ。よろしくお願いいたします!!!!!! Sub Test2() With Sheets("実験").Range("A1").CurrentRegion Dim i As Long Dim LastRow As Long LastRow = Range("A" & Rows.Count).End(xlUp).Row For i = 1 To LastRow If WorksheetFunction.CountIf(Range("A:A"), Cells(i, 1)) > 1 Then Cells(i, 3) = "重複" End If Next i End With End Sub Sheets("実験")をActivesheetに変えると別のシートがしっかり動いてくれます・・・が、なんとしてでも”実験”シートに動いていただきたいです・・・。

  • EXCELマクロデータのある行より下の行削除の構文

    EXCELマクロ構文について教えてください。 データのある行のひとつ下の行全体選択し、 Ctrl+Shift+↓で下部行全て選択し、右クリックで削除する 操作をマクロにしたいのでですが、 マクロ記録では上の操作は Rows("189:189").Select Range(Selection, Selection.End(xlDown)).Select Selection.Delete Shift:=xlU  になります。 この 189 という数字は 下記の変数定義で「lastRow」として取得できるのですが Dim lastRow As Long lastRow = Sheets("2CVS関西").Cells(Rows.Count, 2).End(xlUp).Row + 1 189にlastRow に置き換える方法お教えください。

  • EXCEL VBAでHPageBreaks

    いつもお世話様です。 こちらで教えていただいたマクロでフッダーの前に自動で罫線を引こうとしています。 前の質問は→http://okweb.jp/kotaeru.php3?q=1310420 下記のマクロを動かすと、1ページだけの時はちゃんとフッダーの上に罫線が引けますが、2ページ目になると「インデックスが有効範囲にありません」という実行時エラーが出てしまいます。 どこがいけないのでしょうか? Sub 自動罫線TEST() Dim BreakSu As Integer Dim BreakSu2 As Integer Dim B As Integer Dim Rw As Long Dim LastRow As Long For N = 1 To 3 With Cells .ClearContents .Borders(xlEdgeTop).LineStyle = xlNone .Borders(xlEdgeBottom).LineStyle = xlNone .Borders(xlInsideHorizontal).LineStyle = xlNone End With Range("A1:D" & N * 30) = N & N & N 'TESTデータ挿入 LastRow = Range("A65536").End(xlUp).Row '最終行取得 BreakSu = ActiveSheet.HPageBreaks.Count '改ページ数取得 Range(Cells(LastRow + 1, "A"), Cells(LastRow + 100, "A")) = "ABC" '改ページ数を増やすダミー BreakSu2 = ActiveSheet.HPageBreaks.Count '増えた改ページ数取得 For B = 1 To BreakSu + 1 ' MsgBox B & "-" & BreakSu + 1 & "-" & BreakSu2 Rw = ActiveSheet.HPageBreaks(B).Location.Row - 1 '改ページ前行取得(ここでエラー!) With Range(Cells(Rw, "A"), Cells(Rw, "D")).Borders(xlEdgeBottom) '改ページ前罫線挿入 .LineStyle = xlContinuous End With Next B Range(Cells(LastRow + 1, "A"), Cells(LastRow + 100, "A")) = ClearContents 'ダミー消去 ActiveSheet.PrintPreview Next End Sub

  • これのおかしいところはありますか?エクセル B列

    Option Explicit Sub ExtractColumnB() Dim FolderPath As String Dim FileName As String Dim SourceWorkbook As Workbook Dim TargetWorkbook As Workbook Dim SourceWorksheet As Worksheet Dim TargetWorksheet As Worksheet Dim LastRow As Long Dim TargetLastRow As Long ' 対象フォルダの選択 With Application.FileDialog(msoFileDialogFolderPicker) .Title = "フォルダを選択してください" .AllowMultiSelect = False If .Show <> -1 Then Exit Sub FolderPath = .SelectedItems(1) End With ' 出力用ワークブックとワークシートを作成 Set TargetWorkbook = Workbooks.Add Set TargetWorksheet = TargetWorkbook.Worksheets(1) ' 対象フォルダ内のExcelファイルを順次処理 FileName = Dir(FolderPath & "\*.xls*") Do While FileName <> "" ' ソースファイルを開く Set SourceWorkbook = Workbooks.Open(FolderPath & "\" & FileName) Set SourceWorksheet = SourceWorkbook.Worksheets(1) ' B列のデータを抽出 LastRow = SourceWorksheet.Cells(Rows.Count, 2).End(xlUp).Row ' 抽出したデータを出力用ワークシートにコピー TargetLastRow = TargetWorksheet.Cells(Rows.Count, 2).End(xlUp).Row + 1 SourceWorksheet.Range("B1:B" & LastRow).Copy TargetWorksheet.Range("B" & TargetLastRow) ' ソースファイルを閉じる SourceWorkbook.Close SaveChanges:=False ' 次のファイルへ FileName = Dir Loop ' 確認メッセージ MsgBox "B列のデータ抽出が完了しました。", vbInformation End Sub

  • エクセルVBAでデータ最終行取得方法

    エクセルVBAでデータ最終行取得方法で良い方法を教えてください。 データの行数、列数は不定。 最多のデータ行の列も不定。 この条件で、データ最終行を取得するにはどうすればよいでしょうか? lastrow = ActiveSheet.Cells(ActiveSheet.Rows.Count, "A").End(xlUp).Row では、A列の最終行に限定されます。 lastrow = ActiveSheet.Cells(1, "A").SpecialCells(xlLastCell).Row では、列の限定はありませんが、一旦データ入力後、削除した部分まで入ってしまいます。 lastrow = ActiveSheet.UsedRange.Rows.Count では、データ入力後、削除した部分まで入ってしまい、かつ、1行目など上部が空白の場合、不正確になります。

  • Excel VBAの質問。行のコピーと削除について

    Excel VBAでSheet1のD列に「処分」という文字が入力されていたら、その行を Sheet2へコピーし、Sheet1のその行を削除するというマクロを作成したいのですが、 削除をさせる位置が悪いのか件数が合いません。 下の例では、Sheet1のD列には「処分」という文字が入力されている行が3行あります。 Sheet1の1,3,4行目をSheet2へコピーした後にSheet1の1,3,4行目を削除して 行を上に詰めたいのです。 ネットで検索したり、書籍を読みながらここまで作成したのですが、どうしてもうまくいきません。 大変困っております。どうか、間違えている箇所を教えてください。よろしくお願いします。 A B C D E F -|----------------------------------------- 1| 1 03/01 時計 処分 倉庫 特になし 2| 2 03/05 電話 保留  倉庫 連絡済 3| 3 03/10 紙袋 処分 売店  使用済み 4| 4 03/11 電池 処分  倉庫 空白 5| 5 03/12 時計 保留  売店  空白 Private Sub cmdmSyobun_Click() Dim SyobunWord As String Dim gyou As Long Dim word As String Dim LastRow As Long Dim hantei As Integer Dim count As Integer Dim baseB As Workbook Dim baseS As Worksheet SyobunWord = "処分" Set baseB = ThisWorkbook Set baseS = baseB.Worksheets("Sheet1") baseS.Activate With Worksheets("Sheet1") hantei = MsgBox("「処分」データを移動しますか?", vbYesNo) Select Case hantei Case vbYes count = 0 gyou = 2 LastRow = baseS.Cells(Rows.count, 1).End(xlUp).Row Do While Cells(gyou, 4) <> "" word = Cells(gyou, 4) If InStr(word, MoveWord) >= 1 Then count = count + 1 Rows(gyou).Copy Worksheets("Sheet2").Cells(Rows.count, 1).End(xlUp).Offset(1, 0) Rows(gyou).Delete Shift:=xlShiftUp End If gyou = gyou + 1 Loop Case vbNo MsgBox "「処分」データは移動されませんでした。" End Select End With MsgBox MoveWord & "は、" & count & "件でした。" End Sub

  • マクロでファイルを読み込み、重複行を削除したい。

    35万件以上あるエクセルデータに対して、マクロを使って以下のような処理で重複業を削除したいと思っています。 Sub DeleteOldRow() Dim lastRow As Integer Dim i As Integer Dim j As Integer Dim strVal As String 'B列の最終行を求めます。 lastRow = ActiveSheet.Cells(ActiveSheet.Rows.Count, 2).End(xlUp).Row '1行目から最終行の前まで繰り返します。 For i = 1 To lastRow - 1 'チェックする値を、strValに代入します。 strVal = ActiveSheet.Cells(i, 2).Value '今見てる行から、下をチェックします。 For j = i + 1 To lastRow 'もし、値が同じであれば、 If strVal = ActiveSheet.Cells(j, 2).Value Then '元の行を削除します ActiveSheet.Rows(i).Delete '最終行が1行減ったのでlastRowの値を減らします。 lastRow = lastRow - 1 'チェックしている行を1行前に戻します。 j = j - 1 End If Next j Next i End Sub 上記処理を35万件あるファイル上でマクロの実行すると、オーバーフローしてしまいました。マクロ側で対象ファイルを読み込むなどして、処理を軽くするやり方はありますでしょうか。上記処理にどのような処理を加えればスムーズに処理されるでしょうか。

専門家に質問してみよう