• ベストアンサー

Excel VBAでインターネットを利用して運賃計算する方法

Excelで交通費の精算をしているのですが、シート上に入力した出発駅名・到着駅名から、自動的に運賃が出るようにしたいと考えています。 運賃改定のことも考え、インターネット上の路線検索サイト(http:/transit.yahoo.co.jp/ 等)のデータをうまく活用したいのです。 過去の質問( http://oshiete1.goo.ne.jp/kotaeru.php3?q=768527 ) を参考に Sub 運賃() On Error GoTo ERRH syuppatu = ActiveSheet.Range("b2:b2").Value toutyaku = ActiveSheet.Range("b3:b3").Value Application.ScreenUpdating = False Application.DisplayAlerts = False '---取り込み部分 Workbooks.Open Filename:= _ "http://transit.yahoo.co.jp/search?p=" & toutyaku & "&from=" & syuppatu & "&sort=0&num=0&htmb=select&kb=NON&chrg=&air=AIR&yymm=200509&dd=9&hh=16&m1=05&m2=00" '--- ActiveSheet.Name = "new" Sheets.Add ActiveSheet.Name = "s" & syuppatu Sheets("s" & syuppatu).Range("b4:b4").Value = _ Replace(Replace(Sheets("new").Range("b27:b27").Value, "運賃:片道 ", ""), "円", "") Sheets("new").Delete ERRH: Application.DisplayAlerts = True Application.ScreenUpdating = True End Sub というマクロを作ったのですが、別のワークブックを作成してしまう等、あまり使い勝手がよくありません。 別のワークブックを作成しないでこのような処理を行う方法はありませんでしょうか? 理想としてはユーザー定義関数のようなかたちにできればよいのですが・・・

質問者が選んだベストアンサー

  • ベストアンサー
  • ta123
  • ベストアンサー率51% (95/186)
回答No.1

以下の方法はどうでしょうか。ワークシートを追加して運賃検索結果を展開させます。運賃をコピー後ワークシートは削除します。 運賃は出発/到着駅名の下のセル(B4)に格納するようにしました。 ユーザ関数にする方法は分かりませんでした。 Sub new運賃計算() Dim myString As String Dim myWS As Worksheet Set myWS = ActiveSheet myString = "search?p=" & myWS.Range("B2").Value & "&from=" & myWS.Range("B3").Value & "&sort=0&num=0&htmb=select&kb=NON&chrg=&air=&yymm=200509&dd=11&hh=17&m1=05&m2=00" Application.ScreenUpdating = False ActiveWorkbook.Worksheets.Add With ActiveSheet.QueryTables.Add(Connection:="URL;http://transit.yahoo.co.jp/" & myString _ , Destination:=Range("A1")) .Name = myString .FieldNames = True .RowNumbers = False .FillAdjacentFormulas = False .PreserveFormatting = True .RefreshOnFileOpen = False .BackgroundQuery = True .RefreshStyle = xlInsertDeleteCells .SavePassword = False .SaveData = True .AdjustColumnWidth = True .RefreshPeriod = 0 .WebSelectionType = xlEntirePage .WebFormatting = xlWebFormattingNone .WebPreFormattedTextToColumns = True .WebConsecutiveDelimitersAsOne = True .WebSingleBlockTextImport = False .WebDisableDateRecognition = False .WebDisableRedirections = False .Refresh BackgroundQuery:=False End With myWS.Range("B4").Value = Replace(Replace(ActiveSheet.Range("B25").Value, "運賃:片道 ", ""), "円", "") Application.DisplayAlerts = False ActiveSheet.Delete Application.DisplayAlerts = True Application.ScreenUpdating = True End Sub

kenji2004
質問者

お礼

ありがとうございます。 希望していた処理ができました。 しかもうれしいことに元々のより処理がはやいです。 ユーザー定義関数化については別だてで改めて質問します。 助かりました。 どうもありがとうございました。

その他の回答 (1)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.2

こんにちは。 本格的なものはここでは出しませんが、以下を参考にしてみてください。 参照設定が何?とか、BASP21 の使い方は、とか、起動法はどうする、というレベルでしたら、以下は使わないほうがよいかもしれません。この程度なら、私にも出来ると思う方は、こちらは無視して自分が良い思うものを出してください。なお、Yahoo のURL のオプションを分る範囲で書いておきましたので、後は、ご自身で加工してください。 なお、URL に、Unicode文字を直接当てても、正しく表示されないと思います。 kb=DEP '出発時間 kb=ARR '到着時間 kb=LST '終電 kb=NON '指定なし chg=CHARGE '新幹線以外の有料特急を利用しない air=AIR '空路を利用しない Option Explicit Private Function Unicode2EUC(name As String) As String   '参照設定:BASP21   'http://www.hi-ho.ne.jp/babaq/bsmtp.html   Dim bobj As Basp21 'Basp21 TypeLibrary   Dim buf As String   Dim bufarry As Variant   Dim s As Variant   Set bobj = New Basp21   bufarry = bobj.Kconv(name, 2)   For Each s In bufarry    buf = buf & "%" & Hex(s)   Next s   Unicode2EUC = buf End Function Private Sub InternetConnect(URL As String) '参照設定:Microsoft Internet Control Dim objIE As InternetExplorer Dim myContents As String Dim myContentHTML As String Dim ratingURL As String Dim ret As Variant Dim flg As Integer Dim fst_rating As Long, lst_rating As Long Dim buf As String, i As Long Set objIE = New InternetExplorer With objIE   .Navigate URL   '.Visible =True '通常はウィンドウは出さない。   Do While .Busy    DoEvents   Loop   Do Until .ReadyState = 4    DoEvents    i = i + 1    If i > 3000 Then     MsgBox "アクセスできませんでした。", vbInformation: Exit Sub    End If   Loop    myContents = .Document.body.innerTEXT    SplitOutLog myContents End With End Sub Private Sub SplitOutLog(strLine As String)   Dim s As Long, i As Long, j As Long, m As Long, k As Long   Dim r As Long, n As Long   Dim buf As String, tmp As String   '切り出し   s = 1   r = 1   Do    i = InStr(s, strLine, "運賃:片道 ")    If i = 0 Then Exit Do    buf = Mid$(strLine, i + 6)    j = InStr(buf, "円")    Cells(r, 1).Value = Mid$(buf, 1, j - 1)    m = InStr(buf, "駅")    k = InStr(m - 10, buf, vbCrLf)    n = InStr(m, buf, "円")    tmp = VBA.Trim(Mid$(buf, k + 2, n - k - 1))    Cells(r, 2).Value = Replace(tmp, vbCrLf, "")    strLine = Mid$(buf, n)    r = r + 1   Loop End Sub Sub Main()   Dim Start As String, Destine As String   Dim myTime As Date, yy As String, dd As String, mon As String   Dim hh As String, m1 As String, m2 As String   Dim StartEUC As String, DestineEUC As String   Dim URL As String   '出発地と目的地   Start = Application.InputBox("出発点を入れてください", Type:=2)   If Start = "" Then Exit Sub   Destine = Application.InputBox("目的地を入れてください", Type:=2)   If Destine = "" Then Exit Sub   '時間   myTime = Now + TimeValue("00:00:30")   yy = Year(myTime): mon = Month(myTime)   dd = Day(myTime)   hh = Hour(myTime)   m1 = "0" & Left$(Format(Minute(myTime), "00"), 1)   m2 = "0" & Right$(Format(Minute(myTime), "00"), 1)   '確認   MsgBox "出発点 :" & Start & vbCrLf & "目的地 :" & Destine & vbCrLf & _   "時刻 :" & Format$(myTime, "yyyy年m月d日 hh時mm分") & " 以降"   'EUCに変換   StartEUC = Unicode2EUC(Start)   DestineEUC = Unicode2EUC(Destine)   URL = "http://transit.yahoo.co.jp/search?p=" _   & DestineEUC & "&from=" & StartEUC _   & "&sort=0&num=0&htmb=result&kb=NON&chrg=&air=&yymm=" _   & yy & mon & "&dd=" & dd & "&hh=" & hh & "&m1=" & m1 & "&m2=" & m2   InternetConnect URL   'フォーマットを整える   Cells(1, 1).CurrentRegion.MergeCells = False   Cells(1, 1).Select End Sub

kenji2004
質問者

お礼

ありがとうございます。 わざわざ長いコードまで作っていただき非常に恐縮です。 >参照設定が何?とか、BASP21 の使い方は、とか、 >起動法はどうする、というレベルでしたら、以 >下は使わないほうがよいかもしれません。 それ以下のレベルです(^^ゞ 試行錯誤して、参照設定等を行って、なんとか動かすことができました。 おかげさまで希望していた処理ができました。 ありがとうございます。 でも、何の処理をしているのか私ごときではほとんどわかりません・・・ カスタマイズするため、気合を入れて勉強・解読したいと思います。 YahooのURLオプション、日時の設定方法等もとても参考になります。 本当にありがとうございました。 p.s. URLにUnicode文字(=漢字など?)を直接当ててもなぜか正しく表示されました。yahoo側で自動変換してくれているのでしょうか・・・

関連するQ&A

  • Excelの三つのVBAを一つにまとめる。

     初めまして、よろしくお願いします。当方全くの素人でVBAの基礎もよくわからず、ネットから拾ってきていじった三つのVBAがあります。この三つ、一つ一つは個別に機能するのですが、VBAとして正しいのかさえよく解っていません。この三つを一つにまとめて、同時に機能するようにしたいと頭を抱えています。 Sub TEST() Application.ScreenUpdating = False Application.EnableEvents = False ActiveSheet.Calculate Range("b10:b20").Insert shift:=xlShiftToRight Range("b10:b20").Value = Range("a10:a20").Value Application.OnTime TimeValue("09:00:00"), "TEST" Application.ScreenUpdating = True Application.EnableEvents = True ActiveWorkbook.Save End Sub ________________________________________________________________ Sub TEST1() Application.ScreenUpdating = False Application.EnableEvents = False ActiveSheet.Calculate Dim myCnt As Long Range("c30:c40").Copy Range("d30:d40").PasteSpecial Paste:=xlPasteValues Range("b30:b40").Copy Range("c30:c40").PasteSpecial Paste:=xlPasteValues Range("a30:a40").Copy Range("b30:b40").PasteSpecial Paste:=xlPasteValues nextTime = Now() + TimeValue("01:00:00") Application.OnTime nextTime, "TEST1" Application.ScreenUpdating = True Application.EnableEvents = True ActiveSheet.Calculate ActiveWorkbook.Save End Sub ________________________________________________________________ Sub TEST2() Application.ScreenUpdating = False Application.EnableEvents = False ActiveSheet.Calculate Dim myCnt As Long Range("c50:c60").Copy Range("d50:d60").PasteSpecial Paste:=xlPasteValues Range("b50:b60").Copy Range("c50:c60").PasteSpecial Paste:=xlPasteValues Range("a50:a60").Copy Range("b50:b60").PasteSpecial Paste:=xlPasteValues nextTime = Now() + TimeValue("00:10:00") Application.OnTime nextTime, "TEST2" Application.ScreenUpdating = True Application.EnableEvents = True ActiveSheet.Calculate ActiveWorkbook.Save End Sub ________________________________________________________________  解る方、よろしくお願いします。

  • Excel VBAでオートメーションエラーがでる

    いつもお世話になっております。 Sheets("修正シート").Select Application.DisplayAlerts = False ActiveSheet.Delete Application.DisplayAlerts = True Sheets("箇所見る").Select Range("A1").Select 上記のところで実行エラー オートメーションエラーです。 とメッセージがでます。 何がいけないのでしょうか? よろしくお願い致します。

  • エクセル2000でのVBAについて

    下記のVBAを書いているのですが、3つのIF文を1つに まとめたいのですが教えてください。 If Range("E16") = "申請者" Then Sheets("ログイン").Select Sheets("報告票").Select ActiveSheet.Unprotect Range("M3:U7").Select Selection.Locked = False Selection.FormulaHidden = False ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True '数式バー表示 Application.DisplayFormulaBar = True Range("H9").Select Else: Sheets("ログイン").Select If Range("E16") = "所属長承認" Then Sheets("報告票").Select ActiveSheet.Unprotect Range("D3:L7").Select Selection.Locked = False Selection.FormulaHidden = False ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True '数式バー表示 Application.DisplayFormulaBar = True Range("H9").Select Else: Sheets("ログイン").Select If Range("F16") = "所属長承認" Then Sheets("報告票").Select ActiveSheet.Unprotect Range("BS3:CA7").Select Selection.Locked = False Selection.FormulaHidden = False ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True '数式バー表示 Application.DisplayFormulaBar = True Range("H9").Select Else: Sheets("ログイン").Select end if end if end if

  • エクセル マクロ 値の貼り付け

    以下のエクセルのマクロで値のみを貼り付けたいのですが、.valueを指定しても上手くできません。 どのように修正すればいいか教えてください。 Dim wb As Workbook Application.ScreenUpdating = False Set wb = Workbooks.Open(Filename:=ThisWorkbook.Path & "\ファイルA.xls", UpdateLinks:=0) ThisWorkbook.Sheets("BBB").Range("E4:AR4").Copy wb.Sheets("BBB").Range("E4:AR4") Application.DisplayAlerts = False wb.Close (True) Application.DisplayAlerts = True Application.ScreenUpdating = True

  • エクセルVBAでもっと早く転記

    エクセル2000です。 以下は、列をコピーし行にペーストする作業を含むVBAですが、もっとスマートに早く転記する方法がありましたらご教示ください。 お願いします。 Sub TEST() With Application .ScreenUpdating = False .Calculation = xlCalculationManual Sheets("データ").Range("B8:DH8").ClearContents With Sheets("入力") .Range("G8:G68").Copy Sheets("データ").Range("C8:BK8").PasteSpecial Paste:=xlValues, Transpose:=True .Range("G14:G15").Copy Sheets("データ").Range("BM8:BN8").PasteSpecial Paste:=xlValues, Transpose:=True Sheets("データ").Range("BQ8") = .Range("G21") Sheets("データ").Range("BR8") = .Range("G23") .Range("G25:G29").Copy Sheets("データ").Range("BS8:BW8").PasteSpecial Paste:=xlValues, Transpose:=True .Range("G32:G68").Copy Sheets("データ").Range("BX8:DH8").PasteSpecial Paste:=xlValues, Transpose:=True End With Application.CutCopyMode = False .Calculation = xlCalculationAutomatic .ScreenUpdating = True End With End Sub

  • EXCELのVBAについて

    マクロのボタンで内容を削除する様に設定した所、 Dim re As Integer Sheets("投入シート").Select re = MsgBox("入力データをクリアします。" & vbCrLf & vbCrLf & "よろしいですか?", vbOKCancel, "クリア確認") If re <> vbCancel Then Sheets("投入シート").Select ActiveSheet.Unprotect Range("a1:c30").Select Selection.Copy Application.CutCopyMode = False Selection.Copy Sheets("work").Select Range("A1").Select ActiveSheet.Paste Sheets("投入シート").Select ActiveSheet.Unprotect Range("c4:c30").Select Selection.ClearContents Range("f31").Select Selection.Copy Range("c9").Select ActiveSheet.Paste Range("f33").Select Selection.Copy Range("c11").Select ActiveSheet.Paste Range("f32").Select Application.CutCopyMode = False Selection.Copy Range("c14").Select ActiveSheet.Paste Range("c4").Select Application.CutCopyMode = False 'ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True End If Sheets("投入シート").Select Range("c4").Select End Sub この様に入力したのですがセルのC11の計算式だけセル番号が消えてしまいます。 どうしてでしょうか?ご指導をお願いします。

  • ブックの統合について

    Sub 集計() Application.ScreenUpdating = False fldPath = ThisWorkbook.Path & "\" fname = Dir(fldPath & "*.xls") Do Until fname = Empty If fname <> ThisWorkbook.Name Then Workbooks.Open fldPath & fname mx = Application.WorksheetFunction.Max(Sheets("1日").Columns(1)) lr = Sheets("1日").Range("B65536").End(xlUp).Row FR = ThisWorkbook.Sheets("1日").Range("B65536").End(xlUp).Row + 1 Sheets("1日").Rows("6:" & lr).Copy Application.DisplayAlerts = False ActiveWorkbook.Close (False) Application.DisplayAlerts = True ThisWorkbook.Sheets("1日").Cells(FR, 1).Select ActiveSheet.Paste Application.CutCopyMode = False End If fname = Dir Loop Application.ScreenUpdating = True End Sub 上記のようにマクロを組みましたが、集計したいシートがたくさんある為 シートごとにマクロを組みなおさなければなりません。 そこで、 集計するシートと集計されるシートのシート名が一緒の時、 わざわざsheets("1日")と書き直さなくても "Activesheetと同じシート名"のようなマクロの組み方は出来るのでしょうか。

  • マクロ短縮簡潔方法

    Sub 請求書元表() Application.ScreenUpdating = False Application.DisplayAlerts = False Sheets("請求書元表").Select ActiveWindow.SelectedSheets.Delete Sheets("1回目入力").Select Sheets("1回目入力").Copy Before:=Sheets(19) Sheets("1回目入力 (2)").Select Sheets("1回目入力 (2)").Name = "請求書元表" Range("A2").Select Sheets("2回目入力").Select Range("A2:F600").Select Application.CutCopyMode = False Selection.Copy Sheets("請求書元表").Select Range("A601").Select ActiveSheet.Paste Sheets("請求書元表").Select Range("B2").Select Selection.Sort Key1:=Range("B2"), Order1:=xlAscending, Header:=xlGuess, _ OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, SortMethod _ :=xlPinYin Range("B2").Select Sheets("請求書元表").Select Range("b2:b1798").Select Application.CutCopyMode = False Selection.Copy Sheets("請求申込書").Select Range("a2").Select ActiveSheet.Paste Sheets("請求書元表").Select Range("e2:e1798").Select Application.CutCopyMode = False Selection.Copy Sheets("請求申込書").Select Range("d2").Select ActiveSheet.Paste Sheets("請求書元表").Select Range("f2:f1798").Select Application.CutCopyMode = False Selection.Copy Sheets("請求申込書").Select Range("g2").Select ActiveSheet.Paste 'Call 集計申込書 'Call 一括集計 Application.DisplayAlerts = True End Sub

  • エクセルVBAのフィルター機能について

    こんにちわ! エクセルのVBAを使って複数の条件を入力すると結果シートへ吐き出すプログラムを組み込んでいますが、下から五行目のCriteriaRange:=Sheets("検索").Range("A1:R2"), _の.Range("A1:R2")を変更した際に.Range("A1:R3")にすれば条件を指定できるのですがその状態で条件を一つだけ入力し抽出すると抽出できずすべてのデーターが吐き出されてしまいます。 ただし二行抽出データーを埋めるとそのとおりに抽出され結果シートへ吐き出されます。 抽出する条件を入力する際、一つの時もあれば二つの時もあります。そういった事を回避するにはどうすればいいでしょうか? Sub OutputRec() Application.ScreenUpdating = False Sheets("結果").Activate Cells.Clear Sheets("検索").Range("A1").Value = Sheets("DATA").Range("A1").Value Sheets("検索").Range("B1").Value = Sheets("DATA").Range("B1").Value Sheets("検索").Range("C1").Value = Sheets("DATA").Range("C1").Value Sheets("検索").Range("D1").Value = Sheets("DATA").Range("D1").Value Sheets("検索").Range("E1").Value = Sheets("DATA").Range("E1").Value Sheets("検索").Range("F1").Value = Sheets("DATA").Range("F1").Value Sheets("検索").Range("G1").Value = Sheets("DATA").Range("G1").Value Sheets("検索").Range("H1").Value = Sheets("DATA").Range("H1").Value Sheets("検索").Range("I1").Value = Sheets("DATA").Range("I1").Value Sheets("検索").Range("J1").Value = Sheets("DATA").Range("J1").Value Sheets("検索").Range("K1").Value = Sheets("DATA").Range("K1").Value Sheets("検索").Range("L1").Value = Sheets("DATA").Range("L1").Value Sheets("検索").Range("M1").Value = Sheets("DATA").Range("M1").Value Sheets("検索").Range("N1").Value = Sheets("DATA").Range("N1").Value Sheets("検索").Range("O1").Value = Sheets("DATA").Range("O1").Value Sheets("検索").Range("P1").Value = Sheets("DATA").Range("P1").Value Sheets("検索").Range("Q1").Value = Sheets("DATA").Range("Q1").Value Sheets("検索").Range("R1").Value = Sheets("DATA").Range("R1").Value Sheets("DATA").Range("A1").CurrentRegion.AdvancedFilter _ Action:=xlFilterCopy, _ CriteriaRange:=Sheets("検索").Range("A1:R2"), _ CopyToRange:=Sheets("結果").Range("A1"), _ Unique:=False Sheets("結果").Columns("A:R").AutoFit Application.ScreenUpdating = True End Sub

  • エクセル マクロ 簡素化

    マクロ初心者です。 下記のデータのコピペする、マクロを使用しています。 下記にはAAAとBBBの2つのエクセルへのコピペのみしか記述していませんが、 その下に50ファイル分のファイル名、コピー元、コピー先だけが違うマクロが並んでいます。 メンテナンスや更新に手作業で行っているので、非常に時間がかかります。 例えば、別のシートにファイル名、コピー元、コピー先の一覧を作成し、 そのシートでファイル名、コピー元、コピー先を修正し、コピペができるようになるなど、 どうにかして簡素化したいのですが、どのように実現すればいいか、教えてくださると助かります。 ---------------------------------------------------------------------- Private Sub CommandButton1_Click()   Dim wb As Workbook Application.ScreenUpdating = False Set wb = Workbooks.Open(Filename:=ThisWorkbook.Path & "\AAA.xls", UpdateLinks:=0) ThisWorkbook.Sheets("BBB").Range("A1:B1").Copy wb.Sheets("CCC").Range("A1:B1").PasteSpecial (xlPasteValues) Application.CutCopyMode = False Application.DisplayAlerts = False wb.Close (True) Application.DisplayAlerts = True Application.ScreenUpdating = True Set wb = Workbooks.Open(Filename:=ThisWorkbook.Path & "\BBB.xls", UpdateLinks:=0) ThisWorkbook.Sheets("BBB").Range("A2:B2").Copy wb.Sheets("CCC").Range("A2:B2").PasteSpecial (xlPasteValues) Application.CutCopyMode = False Application.DisplayAlerts = False wb.Close (True) Application.DisplayAlerts = True Application.ScreenUpdating = True 'アイテム名、コピー元、コピー先、だけがちがう、同じようなマクロが50ファイル分ある。 End Sub

専門家に質問してみよう