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文を使うのでしょうか?

回答の条件
  • 1人5回まで
  • 13歳以上
  • 登録:2015/10/08 21:19:35
  • 終了:2015/10/15 21:20:03

回答(2件)

id:freemann No.1

freemann回答回数306ベストアンサー獲得回数482015/10/09 00:41:02

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

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を書き込みます。

他3件のコメントを見る
id:freemann

いえ、セルに入れるものではないですよ。
マクロに登録するのです。
エクセルのバージョンによるのですが、リボンメニューとして、「ファイル」メニューの中の「オプション」を開いて、リボンのユーザー設定の中の右側にある「開発」のチェックを入れます。
そして、オプションのウィンドウを閉じるとエクセルのメニューに「開発」タブが表示されていると思います。
「開発」タブをクリックして、「Visual Basic」をクリックします。
するとVBAのエディターが開きます。
そこに、サンプルコードをコピペします。
一度ファイルを保存します。
その後にエディターを閉じます。
Sheet1を開き、A列のデータを選択します。
ここで、「開発」タブのマクロをクリックするとウィンドウが開くので、先ほどコピペしたマクロが選択されていることを確認して、「実行」ボタンをクリックすると動作すると思います。

ここで私の説明で抜け落ちていた前提条件を補足します。
質問者さんのURLの一覧が入っているシート名をSheet1として、元データがA列に入っているようにします。
もし違うシート名の場合はシートを追加して、シート名をSheet1にしてA列にデータをコピーしてください。

頑張ってください。

2015/10/09 16:49:03
id:kajironpu

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

2015/10/13 12:47:55
id:a-kuma3 No.2

a-kuma3回答回数4506ベストアンサー獲得回数18702015/10/09 18:56:05

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

=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
id:kajironpu

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

2015/10/13 12:49:19

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません