人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

EXCELのMID関数の複数条件の時の使い方がわかりません。

=MID(D2,FIND("http:",D2,1),FIND("url",D2,1)-FIND("http:",D2,1)-3)

↑の関数で文字列の中から、http?urlの間の文字を抜き出すことができたのですが、
httpではなく、httpsの時も同様に抜き出すにはどうしたらいいのでしょうか?
=MID(D2,FIND("https:",D2,1),FIND("url",D2,1)-FIND("https:",D2,1)-3) の時も同じように抜き出したい

=OR 関数と並用でしょうか? それともIF文を使うのでしょうか?


●質問者: kajironpu
●カテゴリ:コンピュータ
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● freemann

エクセルの関数ではないですが、正規表現というものを使うと簡単です。
理解するのは大変ですが。

Sub RegexSample()
  '正規表現のパターン
 Dim strRegUrl As String
 Dim i As Integer
  'VBScriptの正規表現のオブジェクト関連
 Dim objRe, result, Match
  '正規表現のパターン
 strRegUrl = "https?://[-\w/$_.+!*(),]+"
  'VBScriptのインスタンス
 Set objRe = CreateObject("VBScript.RegExp")
 With objRe
  '正規表現のパターンを設定
 .Pattern = strRegUrl
  'HTTPでもhttpでも良いように大文字小文字を区別しないようにする
 .IgnoreCase = True
 .Global = True
  '選択されている行の範囲で正規表現を使う
 For i = Selection(1).row To Selection(Selection.Count).row
  '正規表現を実行
 Set result = .Execute(Sheet1.Cells(i, 1).Value)
  '正規表現のマッチングの結果
 For Each Match In result
 Sheet1.Cells(i, 2).Value = Match.Value
 Next
 Next
 End With
End Sub

使い方は、VBAのエディターで上記サンプルをコピペして、URLを抜き出したい行を選択して、マクロで実行します。
但し上記の期待している事は、列Aに元データが入っていて、列Bに抜き出したURLを書き込みます。


kajironpuさんのコメント
ありがとうございます。なかなか中身を理解するのは難しそうです。 さっそく試してみましたが、900行くらいあるものを 試した所、「オーバーフローしました」とエラーが出てしまいました。

freemannさんのコメント
オーバーフローしましたか。 こちらの環境で1000行で試したところ、特にエラーにならずに終わりました。 お手数ですが、次のもので試していただけますでしょうか。 >|vb| Sub RegexSample() '正規表現のパターン Dim strRegUrl As String Dim i As Integer 'VBScriptの正規表現のオブジェクト関連 Dim objRe, result, Match '正規表現のパターン strRegUrl = "https?://[-\w/$_.+!*(),]+" 'VBScriptのインスタンス Set objRe = CreateObject("VBScript.RegExp") With objRe '正規表現のパターンを設定 .Pattern = strRegUrl 'HTTPでもhttpでも良いように大文字小文字を区別しないようにする .IgnoreCase = True .Global = True '選択されている行の範囲で正規表現を使う For i = Selection(1).row To Selection(Selection.Count).row '正規表現を実行 Set result = .Execute(Sheet1.Cells(i, 1).Value) '正規表現のマッチングの結果 For Each Match In result Sheet1.Cells(i, 2).Value = Match.Value Next Set result = Nothing Next End With End Sub ||<

kajironpuさんのコメント
お手数をお掛けしまして申し訳ありません。 やはりオーバーフローしてしまいます。 おそらく、1つのセルの中に入っている文字数が膨大なためかもしれません。 ↓のような感じです。 もっとシンプルにすべきですね。 一度カットできるところはカットしてみたいと思います。 ありがとうございました。 {"responseData": {"results":[{"GsearchResultClass":"GimageSearch","width":"640","height":"360","imageId":"ANd9GcScuDCEnCwTXKcHkvDVr8jwJTsHZhwHNYNnMEGvS4YafkDVIw72Y4lvBog","tbWidth":"137","tbHeight":"77","unescapedUrl":"http://kenshin.hk/blog/movie/apes/apes-11.jpg","url":"http://kenshin.hk/blog/movie/apes/apes-11.jpg","visibleUrl":"kenshin_jd.mysinablog.com","title":"\u003cb\u003e猿人\u003c/b\u003e爭霸戰:猩凶革命》劇本扎實吸引,猩猩特技驚?(85分) (劍心.回憶)","titleNoFormatting":"猿人爭霸戰:猩凶革命》劇本扎實吸引,猩猩特技驚?(85分) (劍心.回憶)","originalContextUrl":"http://kenshin_jd.mysinablog.com/index.php?op\u003dViewArticle\u0026articleId\u003d3155245","content":"如果問這電影的最精彩的部分,","contentNoFormatting":"如果問這電影的最精彩的部分,","tbUrl":"http://t2.gstatic.com/images?q\u003dtbn:ANd9GcScuDCEnCwTXKcHkvDVr8jwJTsHZhwHNYNnMEGvS4YafkDVIw72Y4lvBog"},{"GsearchResultClass":"GimageSearch","width":"300","height":"225","imageId":"ANd9GcQpvUUeowywuTw_HAuF83bDzgiqzvssEwNHtzVFxyqyyV-Jl5C19jUJnw","tbWidth":"116","tbHeight":"87","unescapedUrl":"http://i2.sinaimg.cn/travel/97/2009-07-09/U3328P704T97D1084F4094DT20090709173147.jpg","url":"http://i2.sinaimg.cn/travel/97/2009-07-09/U3328P704T97D1084F4094DT20090709173147.jpg","visibleUrl":"travel.sina.com.cn","title":"元?\u003cb\u003e猿人\u003c/b\u003e_元?\u003cb\u003e猿人\u003c/b\u003e?介_元?\u003cb\u003e猿人\u003c/b\u003e?片_新浪旅游_新浪网","titleNoFormatting":"元?猿人_元?猿人?介_元?猿人?片_新浪旅游_新浪网","originalContextUrl":"http://travel.sina.com.cn/97/2009-07-09/1084.html","content":"元?\u003cb\u003e猿人\u003c/b\u003e","contentNoFormatting":"元?猿人","tbUrl":"http://t0.gstatic.com/images?q\u003dtbn:ANd9GcQpvUUeowywuTw_HAuF83bDzgiqzvssEwNHtzVFxyqyyV-Jl5C19jUJnw"},{"GsearchResultClass":"GimageSearch","width":"1252","height":"1252","imageId":"ANd9GcScxMoKh0k-mUr2qaW8CqH8YKw_Jj7vkdU8LGkXhdVbUddijMZq-78dc5St","tbWidth":"150","tbHeight":"150","unescapedUrl":"https://pbs.twimg.com/profile_images/466621025606983680/8ZpUp5CW.jpeg","url":"https://pbs.twimg.com/profile_images/466621025606983680/8ZpUp5CW.jpeg","visibleUrl":"twitter.com","title":"三住さん(\u003cb\u003e猿人\u003c/b\u003e) (@kakeru8694) | Twitter","titleNoFormatting":"三住さん(猿) (@kakeru8694) | Twitter","originalContextUrl":"https://twitter.com/kakeru8694","content":"三住さん(\u003cb\u003e猿人\u003c/b\u003e) (@kakeru8694) |","contentNoFormatting":"三住さん(猿人) (@kakeru8694) |","tbUrl":"http://t2.gstatic.com/images?q\u003dtbn:ANd9GcScxMoKh0k-mUr2qaW8CqH8YKw_Jj7vkdU8LGkXhdVbUddijMZq-78dc5St"},{"GsearchResultClass":"GimageSearch","width":"259","height":"300","imageId":"ANd9GcTmz9SIXRPlt7FwE44K1gRterpOXVflax3cO2T5ma9t2eldCZ3iUyFr1A","tbWidth":"100","tbHeight":"116","unescapedUrl":"http://a0.att.hudong.com/31/44/01200000025439136323446396721_s.jpg","url":"http://a0.att.hudong.com/31/44/01200000025439136323446396721_s.jpg","visibleUrl":"www.baike.com","title":"\u003cb\u003e猿人\u003c/b\u003e_互?百科","titleNoFormatting":"猿人_互?百科","originalContextUrl":"http://www.baike.com/wiki/%E7%8C%BF%E4%BA%BA","content":"\u003cb\u003e猿人\u003c/b\u003e?册","contentNoFormatting":"猿人?册","tbUrl":"http://t3.gstatic.com/images?q\u003dtbn:ANd9GcTmz9SIXRPlt7FwE44K1gRterpOXVflax3cO2T5ma9t2eldCZ3iUyFr1A"}],"cursor":{"resultCount":"486,000","pages":[{"start":"0","label":1},{"start":"4","label":2},{"start":"8","label":3},{"start":"12","label":4},{"start":"16","label":5},{"start":"20","label":6},{"start":"24","label":7},{"start":"28","label":8}],"estimatedResultCount":"486000","currentPageIndex":0,"moreResultsUrl":"http://www.google.com/images?oe\u003dutf8\u0026ie\u003dutf8\u0026source\u003duds\u0026start\u003d0\u0026hl\u003den\u0026q\u003d%E7%8C%BF%E4%BA%BA","searchResultTime":"0.16"}}, "responseDetails": null, "responseStatus": 200}

freemannさんのコメント
いえ、セルに入れるものではないですよ。 マクロに登録するのです。 エクセルのバージョンによるのですが、リボンメニューとして、「ファイル」メニューの中の「オプション」を開いて、リボンのユーザー設定の中の右側にある「開発」のチェックを入れます。 そして、オプションのウィンドウを閉じるとエクセルのメニューに「開発」タブが表示されていると思います。 「開発」タブをクリックして、「Visual Basic」をクリックします。 するとVBAのエディターが開きます。 そこに、サンプルコードをコピペします。 一度ファイルを保存します。 その後にエディターを閉じます。 Sheet1を開き、A列のデータを選択します。 ここで、「開発」タブのマクロをクリックするとウィンドウが開くので、先ほどコピペしたマクロが選択されていることを確認して、「実行」ボタンをクリックすると動作すると思います。 ここで私の説明で抜け落ちていた前提条件を補足します。 質問者さんのURLの一覧が入っているシート名をSheet1として、元データがA列に入っているようにします。 もし違うシート名の場合はシートを追加して、シート名をSheet1にしてA列にデータをコピーしてください。 頑張ってください。

kajironpuさんのコメント
詳細のご説明、ありがとうございました。 マクロに登録はできました。まだ難儀していますが、もう少し頑張ってみます。

2 ● a-kuma3

式で書くと、こんな感じです。

=IF(ISERR(FIND("https:",D3,1)),IF(ISERR(FIND("http:",D3,1)),"×",MID(D3,FIND("http:",D3,1),FIND("url",D3,1)-FIND("http:",D3,1)-3)),MID(D3,FIND("https:",D3,1),FIND("url",D3,1)-FIND("https:",D3,1)-3))

質問に書かれていたまま MID の長さは -3 してますけど、これ要らないと思います。

FIND 関数は文字列が見つからないとエラーを返してくるので、ISERR 関数で判定して IF 関数で振り分けます。
文字数が多い https: の方から先に探して、見つからなければ http: を探す、という感じです。
http: も見つからなかったら「×」。

それにしても、長いっ
インデントをつけると多少は見やすくなるでしょうか(いや、ならない)

=IF(
  ISERR(FIND("https:",D3,1)),
  IF(
    ISERR(FIND("http:",D3,1)),
    "×",
    MID(D3,FIND("http:",D3,1),FIND("url",D3,1)-FIND("http:",D3,1)-3)
  ),
  MID(D3,FIND("https:",D3,1),FIND("url",D3,1)-FIND("https:",D3,1)-3)
)



VBA が気にならないなら、VBA の関数にした方が保守性は良さそうです。

Function URLを切り取る(s)
 Set re = CreateObject("VBScript.RegExp")

  ' http(s): から url まで、という正規表現(これだけで済んじゃう)
 re.Pattern = "(https?://\S+)url"

 Set Match = re.Execute(s)
 If Match.Count > 0 Then
 URLを切り取る = Match(0).SubMatches(0)
 Else
 URLを切り取る = "×"
 End If
 Set re = Nothing
End Function

使い方は、こんな感じでセルの関数として使います。

=URLを切り取る(A1)



No.1 のコメントを見て、-3 の意味が理解できました。
JSON のダブルクォートとカンマを取り除くのですね。
であれば、関数はこんな感じです。

Function URLを切り取る(s)
 Set re = CreateObject("VBScript.RegExp")

  ' http(s): から url まで、という正規表現(これだけで済んじゃう)
 re.Pattern = "(https?://[^""]+)"",""url"  ' ★ここだけを変えてます。

 Set Match = re.Execute(s)
 If Match.Count > 0 Then
 URLを切り取る = Match(0).SubMatches(0)
 Else
 URLを切り取る = "×"
 End If
 Set re = Nothing
End Function

kajironpuさんのコメント
ありがとうございます。そうなんです、ダブルクォートとカンマを取り除くために いろいろ式をいじくっていました。 さっそく頂いた関数を試してみましたが、見事に画像ファイルだけを抽出することができました。 とても便利です! 本当にありがとうございました。
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ