
VBAで読み込んだテキストファイルからURL部分だけを抽出するにはどうしたらよいでしょうか?
InStr関数とMid関数を使って、先頭:http~終わり:空白 or Chr(13)をURLとして切り取っているのですがうまく行きません。
どうも終わり部分の判定が甘いようです。
Sub GetURL(myText) 'テキストからURLを抽出
Dim myText As String
Dim myURL As String 'URL取り込み用
Dim str_pt As Long '文字列用ポインタ
str_pt = 1 '最初は1文字目から
Do While 1
str_pt = InStr(str_pt, myText, "http")
If str_pt = 0 Then Exit Do
Do While 1
letter = Mid(myText, str_pt, 1)
If letter = Chr(20) Or letter = Chr(13) Then Exit Do
myURL = myURL & letter
str_pt = str_pt + 1
Loop
Debug.Print myURL
myURL = ""
Loop
End Sub
アドバイスをお願いします!
No.3ベストアンサー
- 回答日時:
#2さんの答えを引き継いで正規表現でやってみました。
使えるかどうかは環境によります(IE5.0以降かな?)以下のコードは読みやすいように行頭に全角スペースが入っています。実際に動かすときは半角にしてください。
Sub test()
Dim teststr As String
teststr = "URL抽出のテスト" & vbCrLf & _
"URLは http://example.com/aaa/bbb/ccc/index.html です。" & vbCrLf & _
"URLは https://example.com/xxx/yyy/zzz/index.php" & _
" または https://example.com/XXX/yyy/zzz/ です。" & vbCrLf & _
"URLはhttpまたはhttps で始まります。"
GetUrl teststr
End Sub
Sub GetUrl(str)
Dim reg, matches, match
Dim strPat As String
Set reg = CreateObject("VBScript.RegExp")
strPat = "https?:\/\/[0-9a-zA-Z,;:~&=@_'%?+\-/$.!*()]+" ' (1) これが正規表現の検索パターン
reg.Pattern = strPat
reg.Global = True
Set matches = reg.Execute(str) ' マッチしたコレクション
For Each match In matches ' マッチした文字列を一つずつ取り出す
Debug.Print match.Value
Next
Set matches = Nothing
Set reg = Nothing
End Sub
==== 結果 ===================================
http://example.com/aaa/bbb/ccc/index.html
https://example.com/xxx/yyy/zzz/index.php
https://example.com/xxx/yyy/zzz/
正規表現を使ったことないとややこしく見えるかもしれませんが、検索パターンが変わっても(1)を書き換えるだけで済みます。例えばURLには ftp:// とかもあるわけですが、必要になっても(1)を書き換えるだけです。あとの行はまあお決まりなので、この際覚えておくと楽ですよ。正規表現はVB系の話だけではないのでこれから他の言語を覚えるときも役に立ちますしね。
詳しいことは「VBA 正規表現」で検索するといろいろ出てくるので見てください。とりあえず一つだけURL挙げときます。
参考URL:http://www.officetanaka.net/excel/vba/tips/tips3 …
丁寧にサンプルまで作成していただき感謝!!
やはり正規表現を勉強しないと駄目なんですね。
なんとなく面倒で避けてました。
なぜ上記のプログラムで動くのか読みきれていませんが、とりあえずは大助かりです!
ありがとうございました。
No.2
- 回答日時:
VBAではVB Scriptって呼び出せたかな?
VBからはやったことがあるが
VB Scriptを呼び出せるなら
正規表現が手っ取り早いですね。
$main_text =~ s/(http:\/\/[\w\d\/%#$\&?()~_\.:=+\-!]+)/<A HREF=\"$1\" target=\"_blank\" class=\"main_link\">[リンク]<\/A>/g;
$main_text =~ s/(https:\/\/[\w\d\/%#$\&?()~_\.:=+\-!]+)/<A HREF=\"$1\" target=\"_blank\" class=\"main_link\">[リンク]<\/A>/g;
自分が以前Perlで使ったURLをリンクに置換する正規表現です。
VB Scriptは詳しくないのでわかりませんが
一応説明すると正規表現でマッチしたものが
$1(特殊変数)に格納される形です。
VB Scriptではそこの所をどう表現して書くのか
わかりませんが
VB Scriptというのはやったことがないので、ちょっと・・・?Perlも同じく・・・
我ながら不勉強を痛感します。HTMLのような表記なんですね。
残念ながら理解できませんでしたが、やはり正規表現は避けて通れないらしい・・・?
ちょっと勉強してみます。ありがとうございました!
No.1
- 回答日時:
Chr(32) Or Chr(10) じゃないですか?
あと、最後まで見つからない時は Do を抜ける必要があると思います。
2つめの Do のところを
Do While str_pt <= Len(myText)
letter = Mid(myText, str_pt, 1)
Select Case letter
Case " ", " ", vbCr, vbLf, vbCrLf: Exit Do
End Select
のようにしたら如何でしょう?
早速のアドバイスありがとうございます。
>Chr(32) Or Chr(10) じゃないですか?
Chr(13)はvbCrのつもりです。Chr(20)は半角スペースですね・・・・この2種類でURLのお尻と判断させています。Chr(10)=vbLfは無視しました。URLの終わりが曖昧なので、抽出が完璧ではありませんでした。(90%以上はOKなのですが)
サンプルで書いていただいたように全角のスペースもありえますね!確かに教えていただいたプログラムの方が安全かもしれません。(私のはいかにもアマっぽい・・・)
ただ、下記のような書き方のURLが抽出できない点は同じです。
例:下記のURL(http://www.goo.ne.jp)を御参照ください。
このようにURLに続けて文章が来ていると切れ目が判別不能な訳です。ですから「URLには含まれないはずの文字」が知りたいという質問です。
何か一発で抽出するような関数があってもいいように思うのですが・・・・
最近では漢字(2バイト文字)のURLもありのようですし、決まりごとはないのでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) 2つのVBAを一緒にしたら機能しなくなりました(エクセル) 7 2022/06/02 12:41
- Visual Basic(VBA) サブフォルダ(データ)にある複数の.xlsxファイルのSheet3のA2セルの値で01から左側をB2 2 2022/08/14 15:46
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- Visual Basic(VBA) VBAのユーザーフォームのテキストボックスに入力制限をしたい 6 2022/11/15 08:28
- Visual Basic(VBA) Excelで下記のようにマクロを作ったところ、一回目は実行できたのですが、二回目以降「実行時エラー1 1 2022/03/25 08:08
- Visual Basic(VBA) 別シートから年齢別の件数をカウントしたいの続き 5 2023/01/24 00:16
- Visual Basic(VBA) ExcelVBAに関する質問 3 2023/02/17 10:47
- Excel(エクセル) Excel VBAどこが間違ってますか? 4 2023/07/17 10:04
- Visual Basic(VBA) 集めたシートのシート名を変更したい。 下記のコードでサブフォルダにあるファイルのSheet3を集めて 6 2022/08/23 10:38
- Visual Basic(VBA) ExcelVBA No.を自動連番で設定をしながらデータ入力をしたい 2 2022/08/03 18:19
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
vba クリップボードクリアにつ...
-
pip --versionがエラーになる
-
数学、プログラミング、物理、...
-
画像生成AIのプロンプトの作り...
-
pythonの実行に関する質問
-
初心者powershellのPS1ファイル...
-
OS入ってる機器のソフト・アプ...
-
pythonについて(初心者です)
-
Python... 環境設定 初心者です...
-
マイクロソフトがvbを捨てたの...
-
PythonのTkinter詳しい方へ。画...
-
パイソンのソースコードをChatG...
-
Python 3.12.2 か一番最新のパ...
-
CSVファイルの複数行削除
-
COPYコマンドで、最後に1文字...
-
以下の技能を無料で受講できる...
-
ネットワークフォルダの中身を...
-
VBAでパワーシェルを実行したい...
-
HTMLソースが表示のページのも...
-
uwscでPauseキーが押されたら、...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
vba クリップボードクリアにつ...
-
趣味がプログラミングだと言っ...
-
pythonについて(初心者です)
-
プログラミング言語のバージョ...
-
AIがプログラムする時代のプロ...
-
MOVEコマンドでサブフォルダー...
-
画像生成AIのプロンプトの作り...
-
Google ColaboでGUI作成
-
VBAでパワーシェルを実行したい...
-
Python... 環境設定 初心者です...
-
COPYコマンドで、最後に1文字...
-
10進数から2進数に変換 例 185 ...
-
FILMORAを使っているのですがテ...
-
pythonでhtmlファイルの指定文...
-
HTMLソースが表示のページのも...
-
⚠️至急です!⚠️ Yahoo!知恵袋の...
-
Pythonでの文字列からfloatへの...
-
Webサイト内に埋め込んだmp4動...
-
テキストファイルの1行目のみを...
-
ネットワークフォルダの中身を...
おすすめ情報