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も見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
小学1年生の子です。塾に行かせ...
-
Pythonでgif画像が上手く作れない
-
pythonで複数画像からgifを作る...
-
プログラミング
-
RTKPOSTのファイル生成について
-
vba クリップボードクリアにつ...
-
google formsを使ったタスク依...
-
windowsでテキストファイルの各...
-
スカラーのベクトル微分
-
正規表現で複数マッチ条件で悩...
-
このURLで広告を出しているのは...
-
Webサイト内に埋め込んだmp4動...
-
pythonにてseleniumを使うも、...
-
Google ColaboでGUI作成
-
HTMLソースが表示のページのも...
-
質問です。 sdカード内に、デー...
-
Selenium4でボタンをクリックで...
-
ExcelVBAでFormulaR1C1を列範囲...
-
pythonのプログラムについての...
-
プログラミング ソースコード
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
chatGPTで次々と質問をしていく...
-
昔のパソコン少年の武勇伝「店...
-
スカラーのベクトル微分
-
ハッシュテーブル(連想配列)が...
-
最新のプログラム言語を学ぶに...
-
pythonにてseleniumを使うも、...
-
Windowsのアプリ開発ってなんの...
-
vba クリップボードクリアにつ...
-
Google ColaboでGUI作成
-
sublimit textっていうエディタ...
-
フリーランスのエンジニアって...
-
ExcelVBAでFormulaR1C1を列範囲...
-
matplotlibで任意の角度の円弧...
-
そのまま使っただけなのに・・...
-
家庭のパソコンで Python の 環...
-
初心者powershellのPS1ファイル...
-
Webプログラムってネイティブア...
-
httpリクエストの送り元の特定
-
プログラミングで例えばゲーム...
-
rpa化する言語としてら何があり...
おすすめ情報