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

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

ただいまの
回答率

88.06%

特定の文字の有無でif文を分岐させたい

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 2,275

score 46

こんにちわ。
初心者ですが、Excelでマクロを書いています。

テキストファイルから文字列を1行ずつ取得し、
その文字列の中に特定の文字があったら、それ以外でif文を分岐させたいのですがうまくできません。

Sub Run()
    Dim OpenFileName As String
    'ファイルを開くダイアログ
    ChDir ThisWorkbook.Path & "\"
    OpenFileName = Application.GetOpenFilename("テキストファイル,*.txt")

    If OpenFileName <> "False" Then
        Open OpenFileName For Input As #1
    End If

    Dim line1 As String
    Dim line2 As String


    '2行読み込み
    Line Input #1, line1
    Line Input #1, line2

    '2行目を取得
    Dim userName As String
    Dim todofuken As String
    If InStr(line2, "*東京*") > 0 Then
        userName = Left(line2, InStr(line2, "東京") - 1)
        todofuken = Trim(userName)
    Else
        userName = Left(line2, InStr(line2, "大阪") - 1)
        todofuken = Trim(userName)
    End If

    Debug.Print , todofuken ;

    Close

テキストファイルの2行目を取得して、
その行には必ず東京か大阪の文字があります
東京がある場合と大阪(そうでない場合)で処理を変えたいです。
(処理内容はほぼ同じなのですが…)

これを実行すると
プロシージャーの呼び出し、または引数が不正です
というエラーになります。
if文の条件はいろいろ試したのですがうまくできません…。
何が悪いのでしょうか。

よろしくお願いします。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1

InStr関数の引数に * は不要ではないでしょうか。

(正) InStr(line2, "東京") 
(誤) InStr(line2, "*東京*") 

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/08/16 10:31

    単純なことでしたね…。
    解決しました、ありがとうございます。

    キャンセル

+1

InStr関数にはワイルドカードという概念はありません。
そのためInStr(line2, "*東京*")と書いた場合、"*東京*"の文字列を探す処理となります。

この部分もInStr(line2, "東京")で良いでしょう。

自分が書くとしたら以下のような感じですかね(もう少し効率化できますが)。

    '2行目を取得
    Dim todofukenStart As Long
    todofukenStart = InStr(1, line2, "東京")

    If todofukenStart = 0 Then '「東京」が含まれていなかったら
        todofukenStart = InStr(1, line2, "大阪")
    End If

    If todofukenStart = 0 Then '「大阪」も含まれていなかったら
        '正しいファイルを選べばここに来ることは無いはず
        Err.Raise 5, Description:="line2「" & line2 & "」に「東京」も「大阪」も含まれていません"
    End If

    Dim userName As String
    Dim todofuken As String

    userName = Left(line2, todofukenStart - 1)
    todofuken = Trim(userName)

気になったことをいくつか

    If OpenFileName <> "False" Then
        Open OpenFileName For Input As #1
    End If

上記の箇所で処理を抜けなくて大丈夫ですか?

プロシージャーの呼び出し、または引数が不正です
というエラーになります。

具体的にどの行でエラーになるのかを書いた方が回答者がわかりやすいです。
(恐らくElse節の中のuserName = Left(line2, InStr(line2, "大阪") - 1)だと思われますが)

todofuken = Trim(userName)としていますが、ここに「都道府県」は入らないような気がします(実際の文字列がわからないのでなんとも言えませんが)。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/08/16 10:58

    ありがとうございます。
    もう少し効率のいいきれいな書き方ができるようになりたいとおもいます。
    エラー行もわかる場合は記載を忘れないようにします。

    とりあえず出力はうまくできました。
    If OpenFileName <> "False" Then~の部分は私もおかしいと感じています…。(ファイルが開かれていますというエラーがでる場合があるので…)

    キャンセル

  • 2018/08/16 11:05

    開いたファイルは必要な情報を読み込んだら即座にCloseしてしまって良いと思います(今回で言えば`Line Input` の直後)。
    途中で処理を止めたりすると、開きっぱなしになる可能性があるので。

    また、ファイル番号は`FreeFile`関数を使用すると番号の重複を考えずに済みます。
    https://msdn.microsoft.com/ja-jp/vba/language-reference-vba/articles/freefile-function

    キャンセル

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

  • ただいまの回答率 88.06%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る