質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

2回答

560閲覧

id要素の付いたnavタグをVBAマクロで範囲削除したい

natsu_777

総合スコア6

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2019/08/01 02:27

前提・実現したいこと

id要素の入ったnavタグをVBAマクロで範囲削除したいのですが、
一向にできません。
イメージとしましては、以下のようにnavタグの中にあるもの
全て削除されることを想定しております。

<header></header> <nav id="hogehoge"> <ul> <li></li> (中略) <li></li> </ul> </nav> <footer></footer>

<header></header> <footer></footer>

発生している問題・エラーメッセージ

以下のコードを書いているのですが、範囲削除がうまく出力されません。

該当のソースコード

' ---------------------------------------------- ' 概要: '  <開始タグ>~<終了タグ>の範囲を削除する ' ' @parm なし ' @return なし ' ' ---------------------------------------------- Sub 開始タグから終了タグの範囲削除() Dim buf As String ' 編集したhtml文の文字列 Dim fname As String ' ファイル名 Dim skip_flg As Boolean ' ファイル名 Dim folderPath As String ' フォルダパス Dim filePath As String ' ファイルパス(フルパス) Dim outPath As String ' ファイルパス(フルパス) Dim outFolderPath As String ' フォルダパス Dim row As Long ' 行 ' ---------------------------------------------- ' html出力フォルダを作成 ' ---------------------------------------------- folderPath = Cells(7, 3).MergeArea(1, 1).Value ' 結合セルのC7セルの値を取得し、変数に代入 If Dir(folderPath, vbDirectory) = "" Then MsgBox "指定された格納先パスが存在しません。処理を終了します。" GoTo ErrEnd End If outFolderPath = folderPath & "\output" If Dir(outFolderPath, vbDirectory) = "" Then MkDir outFolderPath End If ' ---------------------------------------------- ' 項番が空文字になるまでループ ' ---------------------------------------------- row = START_ROW Do While Cells(row + 1, 2) <> "" row = row + 1 folderPath = Cells(row, 3) ' フォルダパス取得 fname = Cells(row, 4) ' ファイル名取得 filePath = folderPath & "\" & fname 'ファイルパスを設定 starTagFlg = False Dim tobj As Object Set tobj = CreateObject("ADODB.Stream") tobj.Charset = "UTF-8" tobj.LineSeparator = 10 tobj.Open tobj.LoadFromFile filePath Do Until tobj.EOS tmp = tobj.ReadText(-2) ' htmlファイルから一行読み込む If starTagFlg = True Then If tmp Like "</nav>*" Then ' 複数行に最終タグがあるか判定 starTagFlg = False End If ElseIf tmp Like "<nav id=""hogehoge"">*" Then ' 削除対象の開始タグか判定 If Not tmp Like "<nav id=""hogehoge"">*</nav>*" Then ' 1行に最終タグがあるか判定 starTagFlg = True End If Else buf = buf & tmp End If Loop tobj.Close Set tobj = Nothing If starTagFlg = True Then Cells(row, 5) = "削除対象の終了タグが発見できませんでした。ファイル未出力です。" Else outPath = outFolderPath & "\" & fname '出力先のファイルパスを設定 Set tobj = CreateObject("ADODB.Stream") tobj.Charset = "UTF-8" tobj.LineSeparator = 10 tobj.Open tobj.WriteText buf tobj.SaveToFile outPath, 2 tobj.Close Set tobj = Nothing Cells(row, 5) = "ファイルを出力しました。" End If Loop ErrEnd: End Sub

VBA初心者なので、原因が全くわかりません。
大変恐れ入りますが、皆様のお知恵をお借りできればと存じます。
何卒よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

HTMLの解析なら、「Microsoft HTML Object Library」を使うと便利です。

エクセルVBAでIEを使わずにHTMLドキュメントを取得する方法

id属性が付いているなら、GetElementByIDメソッドで一発で取得できます。

正規表現が分かるならRegExpオブジェクトを使ってもいいでしょう。

今回のように単純に <nav id="hogehoge"> から </nav> までを削除したいのなら、
Splitを使うと比較的簡単に実現できます。

コード例

vba

1 Dim tmp As String 2 tmp = "HTML文書全文" 3 4 Dim a 5 a = Split(s, "<nav id=""hogehoge"">") 6 s = a(1) 7 Dim b 8 b = Split(a(1), "</nav>") 9 a(1) = b(1) 10 11 Debug.Print Join(a)

該当部分を削除する部分のロジックだけです。該当部分かない場合のエラー処理は必要に応じて追加してください。

投稿2019/08/02 01:55

hatena19

総合スコア33692

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

RegExpオブジェクトを使用した正規表現が良いと思います。(マッチした文字列を置き換える)

【追記】
Dim RE As Object
Dim str As String

RE = CreateObject(“VBScript.RegExp”)
RE.Pattern=“<nav.id=””hogehoge””(.|\n)</nav>

str = RE.Replace( htmlのソース , “”)

投稿2019/08/01 03:25

編集2019/08/02 02:09
meg_

総合スコア10579

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問