【VBA初心者必見】WEBページ内のリンクURLを自動取得する方法

このQ&Aのポイント
  • VBA初心者の方に向け、マウスをプログラムで移動してWEBページ内のリンクURLを取得する方法をご紹介します。
  • VBAを使ってマウスを自動操作し、リンク先のテキストやバナー上にマウスが来るとURLが表示される機能を作成することができます。
  • エクセルのセルにURLを格納するために、ループ処理を利用します。マウスの座標を指定し、URLが変わるたびにセルに記録されます。
回答を見る
  • ベストアンサー

VBAのプログラムに関する質問です

WEBを開いてマウスをプログラムで移動します。 リンク先があるテキストやバナーの上にマウスが来ると パソコンの画面上(最下部)にURLが表示されます。 マウスを移動してURLが変わるたびに、それをエクセルのセルの中に格納していきたいのですが その方法がわかりません。 プログラムは初心者です。 できるだけわかりやすく教えてもらえれば幸いです。 x=100,y=100,i2=1,i3=1,i4=1 for i=1 to 200     SetCursorPos i, y d="a"+cstr(i2) d1="b"+cstr(i3) d2="c"+cstr(i4) '---------------------------------------------------------- ここでURLが変われば、x、y、URLを入手 sheets("zahyou").range(d)=x sheets("zahyou").range(d1)=y sheets("zahyou").range(d2)=URL i2=i2+1 i3=i3+1 i4=i4+1 '---------------------------------------------------------- next 初心者過ぎててすみません。 なにとぞ回答のほどよろしくお願いいたします。

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

  • ベストアンサー
  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.3

#2です。ご要望に応えると、下記の通りです。終了条件が面倒になるので、A2セルに1を入力すると、終了する様にしてあります。 ただ、本当になさりたいことは違うように思います。 Webページから、ある条件を満足するリンクを取得して、FollowHyperlinkしたいという事なら、WebページのHTMLを取得して、リンクを抽出し、目的の条件に合致するか調べる方法もあります。 方法決め打ちで質問をするとかえって遠回りになる場合もあります。ご検討下さい。 Dim objIE As Object Dim destRange As Range Sub watchStart2() Set objIE = CreateObject("InternetExplorer.Application") Set destRange = Sheets("Sheet1").Range("A1") objIE.Visible = True objIE.Navigate "http://okwave.jp/qa/q6624710.html" While objIE.ReadyState <> 4 Or objIE.Busy = True DoEvents Wend watchIEstatus2 End Sub Sub watchIEstatus2() Dim myStatusText As String myStatusText = objIE.StatusText If Left(myStatusText, 4) = "http" Or Left$(myStatusText, 4) = "ftp" Then destRange.Value = myStatusText End If If destRange.Offset(1, 0) <> 1 Then Application.OnTime Now() + TimeValue("00:00:01"), "watchIEstatus2" Else objIE.Quit Set objIE = Nothing End If End Sub

motorola1298
質問者

お礼

ありがとうございます。 各ボタンの座標を予めエクセルに表を作り格納しておき それらを必要な時に参照して、マウスを移動してクリック→次のアクション それの集合体でWEBを開いて、競馬の投票(IPAT)をするプログラムはすでに作成してます。 買い方は、私なりの理論をプログラムに移植したものでです。 出来あがってから実際毎週走らせていますが、今のところ土曜日の朝に走らせたら日曜日の最終レースまで、締切1分前で各レースを買ってくれてます。 しかしながら、ものすごく原始的で、 クリックしてから違うリンク先の画面表示がしっかりなされてるかの確認は、ページをエクセルのシートにコピペして、とか・・・ sendkeys"{tab}" を使うにしても,tab30とかになると目標のボタンに辿りついてないとか・・ これは単に私の未熟さ、からなんですが。 それを補正するために for i=1 to 30 sendkeys"{tab}" call jikan1'現在の時間から一秒経過させる next とかで解決するしかできませんでした。 クリックしてリンク先の画面を表示するのに、クリックしてから8秒待つとか その8秒なんかに確固たる根拠はなく、何回も試してるうち8秒なら大丈夫だろう みたいな、感覚的なものでした。 そんな状況の中、今回教えていただいた「navigate」なんかは、目を疑うほどのものでした サンプルには「他にもお宝がいっぱい!!!」 というのが本音です。 今現在は、やっとWEBを完全にコントロールするプログラム作成の入り口に立った くらいの私です。 教えていただいた内容は、私がやりたいことの一部ですが 2つのサンプルをあれこれいじってみて、勉強を始めていきたいと思ってます 入口に立った時に、みなさんに出会えたことを感謝いたします。 ここで躓くと、これ以上先には進めませんでした。 本当にありがとうございます。 これからも、皆さんにとっては「くだらない・とるにたらない」 そんな質問をすることになりますが、その時はどうか見捨てないでください。 勝手なお願いばかりですみません。

その他の回答 (2)

  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.2

面白そうなので、Web検索してみてみつかった参考URLのコードを、エクセルVBAで動くようにアレンジしてみました。 「花ちゃん」さん、失礼いたします。 watchStart()の方を実行してみて下さい。 但し、古いIE限定です。IE7以降は一工夫必要な様ですが、当方試験できる環境がありませんので、下記等を参考にしてみて下さい。こちらはIE制御に関する定番の情報源です。 http://www.ken3.org/cgi-bin/group/vba_ie7.asp 'IEのステータスバーに表示されるURLを、アクティブなブックのSheet1のA列に記入 'VBAで使える適当なタイマーを知らないので、Application.Ontimeで、1秒に一回読み込んでいます。 'A列にENDという文字を入れてあるセルの上まで書き込むと終了します。 Dim objIE As Object Dim myDic As Object Dim destRange As Range Sub watchStart() Set objIE = CreateObject("InternetExplorer.Application") Set myDic = CreateObject("Scripting.Dictionary") Set destRange = Sheets("Sheet1").Range("A1") objIE.Visible = True objIE.Navigate "http://okwave.jp/qa/q6624710.html" While objIE.ReadyState <> 4 Or objIE.Busy = True DoEvents Wend watchIEstatus End Sub Private Sub watchIEstatus() Dim myStatusText As String myStatusText = objIE.StatusText If Left(myStatusText, 4) = "http" Or Left$(myStatusText, 4) = "ftp" Then '連想配列で同じURLを何度も書き込まないようにチェックしています If Not myDic.Exists(myStatusText) Then myDic.Add myStatusText, "" destRange.Value = myStatusText Set destRange = destRange.Offset(1, 0) End If End If If UCase(destRange.Value) <> "END" Then Application.OnTime Now() + TimeValue("00:00:01"), "watchIEstatus" Else Set myDic = Nothing objIE.Quit Set objIE = Nothing End If End Sub

参考URL:
http://hanatyan.sakura.ne.jp/patio/read.cgi?no=191
motorola1298
質問者

お礼

大変参考になりました。 ここで質問をするのが初めてでした。 まだ初心者の私が、的確な質問をすることもできませんでした。 それをくみ取っていただいた上に、物凄く参考になる回答をいただけて本当にうれしいです。 ありがとうございました。 これで、やりたいことが少し前進しました。 実はここで更に甘えてたいのですが あのプログラムだとA列の下に向かって格納していきます。 また、一度格納したURLは再度ダブっては格納されません。 現在のマウスが乗っかったURL(ダブっても構わないです)をA1にだけ格納したいのですが 教えていただけないでしょうか? 先ほどいただいたプログラムと、今回との違いでプログラムの仕方の勉強をさせてください。 どうかお願いします。

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.1

WEBを開いて WEBをあなたのパソコンの画面に表示しているのは、ブラウザというソフトのはず。インターネットエクスプローラーなどが多い。このことを理解してますか。HTML文に基づいてブラウザが表示している。 ーー このIEをエクセルVBAを使って扱うのは、難しいと思いますよ。 よほどの「VBAだけでない広く知っている」熟練者で無いとね。 URLを開くとかまでなら、WEBにコードが多数転がってますが。 ましてマウスのポインターを操って人間が操作するのを、プログラムでやるなんて、相当熟練の人(APIを使い慣れている人で無いと出来無いと思います。私もできませんが、相当基礎から勉強しないとと言うことは判ります。) そういう(スクリプトなどで画面操作を人間に代わってプログラムが自動でおこなう)ソフトが無いか調べてみるのも手です。 ーー エクセルVBAに関するかぎり、、そちらも、つい先日本を読んだばかりのレベルではないですか? もしそうなら、この質問の全体で言うことの実現など、今後勉強して、してはるか先でしょう。

motorola1298
質問者

お礼

ご指摘の通りです。 まだ本を開いたばかりの初心者です。 やっとのことで、エクセル画面にスタートボタンを置き そこからWEBを開いてマウスを移動・クリックできるところまできました。 WEBは時々、デザインやボタンの位置が変わるので、 固定した座標でマウスを移動しても、どうしてもズレてしまいます。 そこで考えたのが、マウスを順々に移動させて目的のURLにリンクされてるのを確認してからクリックさせることでした。 上級者にもなれば、もっと高度な発想とプログラムができることと思いますが 今現在の私の能力では、これが限界です。 また都合のいい話なんですが、 一から勉強してるのではなくて、やりたいことに必要なものしか勉強してません。 これから質問も増えていくと思いますが、どうか温かい目で見てやってください。 ありがとうございました。

関連するQ&A

  • Excel VBAについて

    Excel VBAについて教えて頂きたいのですが、 Sub test() Dim lastrow, r, i As Long Dim sh1, sh2 As String Dim ws As Worksheet lastrow = Cells(Rows.count, "D").End(xlUp).row For r = 7 To lastrow '7 For i = 1 To lastrow '4 sh1 = ActiveSheet.Cells(r, 4) ActiveSheet.Cells(r, 20) = _ Application.CountIfs(Sheets(sh1).Range("D:D"), Range("H3") & Range("I3"), Sheets(sh1).Range("K:K"), "<=3") _ / Application.CountIf(Sheets(sh1).Range("D:D"), Range("H3") & Range("I3")) ActiveSheet.Cells(r, 21) = _ Application.CountIfs(Sheets(sh1).Range("C:C"), Range("F3"), Sheets(sh1).Range("K:K"), "<=3") _ / Application.CountIf(Sheets(sh1).Range("C:C"), Range("F3")) ActiveSheet.Cells(r, 22) = _ Application.CountIfs(Sheets(sh1).Range("E:E"), Range("K3"), Sheets(sh1).Range("K:K"), "<=3") _ / Application.CountIf(Sheets(sh1).Range("E:E"), Range("K3")) Sheets(sh1).Range("A3:R3").AutoFilter Field:=4, Criteria1:=Range("H3") & Range("I3") ActiveSheet.Cells(r, 15) = Application.Subtotal(105, Sheets(sh1).Range("O:O")) Sheets(sh1).Range("A3:R3").AutoFilter Field:=4, Criteria1:=Range("H3") & Range("I3") - 200 ActiveSheet.Cells(r, 18) = Application.Subtotal(105, Sheets(sh1).Range("O:O")) Sheets(sh1).Range("A3:R3").AutoFilter Field:=4, Criteria1:=Range("H3") & Range("I3") + 200 ActiveSheet.Cells(r, 19) = Application.Subtotal(105, Sheets(sh1).Range("O:O")) For Each ws In Worksheets ws.AutoFilterMode = False Next Next Next End Sub このコードは ActiveSheetで実行すると D列の7行目から最終行までに入力されている名前のシート(名前=シートがあります) その、シートの参照先で C,D,E列がcountif関数を利用して O列がSubtotal関数を利用しています。 このコードでもやりやいことは実行できるのですが、 時間がかかりすぎてしまいます。 約20件あり約2分ほどかかります。パソコンによっては倍ほど時間がかかるかもです。 そこでなのですが、 もっと処理のスピードを上げたいのですが、 可能でしょうか? 可能ならそのやり方をご教示ください。 よろしくお願い致します。

  • VBAの転記について

    With Sheets("入力") '3行目~22行目まで For i = 5 To 24 SheetName = Sheets("入力").Cells(i, "C").Value On Error Resume Next Set Dummy = Sheets(SheetName) SheetName2 = .Cells(i, "C").Value U最終行 = Sheets(SheetName2).Range("C65536").End(xlUp).Row + 1 If U最終行 = 39 Then Sheets(SheetName2).Copy BEFORE:=ActiveSheet Sheets(SheetName).Delete End If If Err.Number = 0 Then A = Sheets(SheetName2).Range("C65536").End(xlUp).Row + 1 Sheets(SheetName2).Range("C" & A).Value = .Cells(i, "G").Value Sheets(SheetName2).Range("D" & A).Value = .Cells(i, "I").Value Sheets(SheetName2).Range("E" & A).Value = .Cells(i, "L").Value Sheets(SheetName2).Range("F" & A).Value = .Cells(i, "N").Value Sheets(SheetName2).Range("G" & A).Value = .Cells(i, "P").Value Sheets(SheetName2).Range("H" & A).Value = .Cells(i, "R").Value Sheets(SheetName2).Range("I" & A).Value = .Cells(i, "T").Value Sheets(SheetName2).Range("K" & A).Value = .Cells(i, "V").Value Sheets(SheetName2).Range("L" & A).Value = .Cells(i, "X").Value ElseIf .Cells(i, "C").Value <> "" Then G = Sheets("原紙").Range("C65536").End(xlUp).Row + 1 Sheets("原紙").Range("B1").Value = .Cells(i, "D").Value Sheets("原紙").Range("B4").Value = .Cells(2, "D").Value Sheets("原紙").Range("C" & G).Value = .Cells(i, "G").Value Sheets("原紙").Range("D" & G).Value = .Cells(i, "I").Value Sheets("原紙").Range("E" & G).Value = .Cells(i, "L").Value Sheets("原紙").Range("F" & G).Value = .Cells(i, "N").Value Sheets("原紙").Range("G" & G).Value = .Cells(i, "P").Value Sheets("原紙").Range("H" & G).Value = .Cells(i, "R").Value Sheets("原紙").Range("I" & G).Value = .Cells(i, "T").Value Sheets("原紙").Range("K" & G).Value = .Cells(i, "V").Value Sheets("原紙").Range("L" & G).Value = .Cells(i, "X").Value '原紙をコピーする Sheets("原紙").Copy BEFORE:=Sheets(1) 'シートの名前を市場コードにする Sheets(1).Name = SheetName End If Next i End With On Error GoTo 0 上記のVBAを作成しましたが、 C行の値ごとの転記(G~Xの値)が出来ません。 どこが間違いか教えていただけないでしょうか。

  • エクセルVBAについての質問です。

    エクセルVBAについての質問です。  動作環境は  OS:WINDOWS XP  エクセル2003  です。 今、Book1.xlsというエクセルファイルがあります。 このファイルの中に、【sheet1】,【sheet2】,【sheet3】の3つのシートが存在しています。 【sheet1】および【sheet2】には、A列=ユニーク番号、B列=データ1、C列=データ2・・・・n列=データnの値が約1500行(各行で、データの値は異なります。)入っています。 この【sheet1】と【sheet2】のデータの内容を照合して【sheet3】にその結果を反映(TRUEまたはFALSE)します。 仮に【sheet3】のあるセル(仮にD3)の値がTRUEとなったら、【sheet1】のセル(D3)の値を【sheet3】のセル(D3)に代入する。 逆に【sheet3】のあるセルの値がFALSEとなったら、そのセルはFLASEのままにする。プログラムは以下の様にしたのですが、全てを処理するまでに相当時間がかかっています。 VBAのプログラムは今回初めて書いたので、プログラムが悪いのか、プログラムの思想が悪いのかがわかりません。 どなたかご教授していただけませんか?多分、コードの書き方もキレイではないと思います(悲) Private Sub データ照合ボタン_DblClick(ByVal Cancel As MSForms.ReturnBoolean) Dim i As Long Dim area As Range Dim A As Variant Dim WrkRange As String '----シート(1)とシート(2)の各セルの値を比較---- With Sheets("sheet1") WrkRow = .Cells(Rows.Count, 3).End(xlUp).Row End With Sheets("sheet3").Select For i = 12 To WrkRow WrkRange = Range("C" & i).Select ActiveCell.FormulaR1C1 = "=EXACT('sheet1'!RC,'sheet2'!RC)" WrkRange = Range("D" & i).Select ActiveCell.FormulaR1C1 = "=EXACT('sheet1'!RC,'sheet2'!RC)" '・           '・           '・ Next i A = i - 1 Sheets("sheet1").Select For i = 12 To A WrkRange = Range("C" & i).Select Selection.Copy Range("C" & i).PasteSpecial xlPasteValues Sheets("sheet3").Select If Range("C" & i) = True Then Sheets("sheet1").Select Range("C" & i).Copy Sheets("sheet3").Select Range("C" & i).Select ActiveSheet.Paste Else: End If Next i A = i - 1 Sheets("sheet1").Select For i = 12 To A WrkRange = Range("D" & i).Select Selection.Copy Range("D" & i).PasteSpecial xlPasteValues Sheets("sheet3").Select If Range("D" & i) = True Then Sheets("sheet1").Select Range("D" & i).Copy Sheets("sheet3").Select Range("D" & i).Select ActiveSheet.Paste Else: End If Next i          '・          '・          '・    End Sub

  • vbaプログラミング

    excelのsheet1のF列とj列には5桁の文字列がはいっていて、それぞれ1文字目から3文字目の3文字分を判定して、値をsheet3に出力しています。下記がプログラムです。6しか出力されないんです。 間違い、ご指摘点があればよろしくお願いします。 For i = 3 To 100 If CStr(Mid(Sheets("sheet1").Cells(i, 6), 1, 3)) = "089" And (Sheets("sheet1").Cells(i, 10) = "033") Or (Sheets("sheet1").Cells(i, 10) = "036") Then Sheets("Sheet3").Cells(j, 2).Value = 0 ElseIf CStr(Mid(Sheets("sheet1").Cells(i, 6), 1, 3)) = "090" And (Sheets("sheet1").Cells(i, 10) = "033") Or (Sheets("sheet1").Cells(i, 10) = "036") Then Sheets("Sheet3").Cells(j, 2).Value = 3 ElseIf CStr(Mid(Sheets("sheet1").Cells(i, 6), 1, 3)) = "093" Then Sheets("Sheet3").Cells(j, 2).Value =6

  • エクセルVBA全シートに差し込みマクロ構文

    Sheets("震圧データ").Select MsgBox "新規ブックに年月分けて" & vbCrLf & "震圧データを転記します、" & vbCrLf & "お待ちください。" Dim c As Range Dim i As Integer Dim LastRow As Long Dim NewSheetName As String, MatchFlag As Boolean Application.ScreenUpdating = False Workbooks.Add With ThisWorkbook.Sheets("震圧データ") For Each c In .Range(.Cells(4, "A"), .Cells(Rows.Count, "A").End(xlUp)) If NewSheetName <> Year(c.Value2) & "年" & Month(c.Value2) & "月" Then NewSheetName = Year(c.Value2) & "年" & Month(c.Value2) & "月" If c.Row - 2 > Sheets.Count Then Worksheets.Add after:=Worksheets(Worksheets.Count) Else Sheets(c.Row - 2).Select End If ActiveSheet.Name = NewSheetName Sheets(NewSheetName).Range("A1").Value = "年月日" Sheets(NewSheetName).Range("B1").Value = "曜日" Sheets(NewSheetName).Range("C1").Value = "A" Sheets(NewSheetName).Range("D1").Value = "B" Sheets(NewSheetName).Range("E1").Value = "C" Sheets(NewSheetName).Range("F1").Value = "時間" Sheets(NewSheetName).Range("G1").Value = "状態" Sheets(NewSheetName).Range("I1").Value = "No.1" Sheets(NewSheetName).Range("I2").Value = "記録者" Sheets(NewSheetName).Range("I3").Value = "氏名:" Sheets(NewSheetName).Range("I4").Value = "=IF(ISBLANK(A4),"""",DATEDIF("""",Today(),""Y"") & ""歳"")" Sheets(NewSheetName).Range("I5").Value = "=""転載日""" Sheets(NewSheetName).Range("I6").Value = "=TODAY()" Sheets(NewSheetName).Range("I56").Value = "=IF(ISBLANK(A56),"""",""No.2"")" Sheets(NewSheetName).Range("I57").Value = "=IF(ISBLANK(A56),"""",""記録者"")" Sheets(NewSheetName).Range("I58").Value = "=IF(ISBLANK(A56),"""", ""氏名:"")" Sheets(NewSheetName).Range("I59").Value = "=IF(ISBLANK(A56),"""",DATEDIF("""",Today(),""Y"") & ""歳"")" Sheets(NewSheetName).Range("I60").Value = "=IF(ISBLANK(A56),"""",""転載日"")" Sheets(NewSheetName).Range("I61").Value = "=IF(ISBLANK(A56),"""",TODAY())" Sheets(NewSheetName).Range("I111").Value = "=IF(ISBLANK(A111),"""",""No.3"")" Sheets(NewSheetName).Range("I112").Value = "=IF(ISBLANK(A111),"""",""記録者"")" Sheets(NewSheetName).Range("I113").Value = "=IF(ISBLANK(A111),"""", ""氏名:"")" Sheets(NewSheetName).Range("I114").Value = "=IF(ISBLANK(A111),"""",DATEDIF("""",Today(),""Y"") & ""歳"")" Sheets(NewSheetName).Range("I115").Value = "=IF(ISBLANK(A111),"""",""転載日"")" Sheets(NewSheetName).Range("I116").Value = "=IF(ISBLANK(A111),"""",TODAY())" Sheets(NewSheetName).Range("I166").Value = "=IF(ISBLANK(A166),"""",""No.4"")" Sheets(NewSheetName).Range("I167").Value = "=IF(ISBLANK(A166),"""",""記録者"")" Sheets(NewSheetName).Range("I168").Value = "=IF(ISBLANK(A166),"""", ""氏名"")" Sheets(NewSheetName).Range("I169").Value = "=IF(ISBLANK(A166),"""",DATEDIF("""",Today(),""Y"") & ""歳"")" Sheets(NewSheetName).Range("I170").Value = "=IF(ISBLANK(A166),"""",""転載日"")" Sheets(NewSheetName).Range("I171").Value = "=IF(ISBLANK(A166),"""",TODAY())" Sheets(NewSheetName).Range("H1").Value = "提出済○" Sheets(NewSheetName).Range("A57").Select Range("I6,I61,I116").Select Range("I6,I61,I116,I171").Select Selection.NumberFormatLocal = "yyyy/m/d" Columns("F:F").Select Selection.NumberFormatLocal = "[$-409]h:mm AM/PM;@" Range("G1").Select With Selection .HorizontalAlignment = xlCenter End With LastRow = Sheets(NewSheetName).Cells(Rows.Count, "A").End(xlUp).Row Sheets(NewSheetName).Cells(LastRow + 1, "A").Resize(1, 8).Value = .Cells(c.Row, "A").Resize(1, 8).Value Sheets(NewSheetName).Columns("A:I").EntireColumn.AutoFit Next 新規ブック最終シートのみ適用できますが他の月別シートに適用できておりません '↓どのような構文にしたら適用されるのでしょうか?ここからが質問です↓ If Sheets(NewSheetName).Range("A56") = "" Then Range("I56:I171").Delete Else Sheets(NewSheetName).Range("A56").Value = "年月日" Sheets(NewSheetName).Range("B56").Value = "曜日" Sheets(NewSheetName).Range("C56").Value = "A" Sheets(NewSheetName).Range("D56").Value = "B" Sheets(NewSheetName).Range("E56").Value = "C" Sheets(NewSheetName).Range("F56").Value = "時間" Sheets(NewSheetName).Range("G56").Value = "状態" End If 'ここまで! どなたかご教示お願いします .Activate End With

  • VBAでのシート選択について

    いつもお世話になります。 VBA初心者で、基本的な質問をしているかもしれませんが、 どうかお付き合いください;; たとえば、以下のようなコードがあったとします。 例) Function Sample() dim x As Integer dim y As Integer x=10 y=100 If x > sheets("シート2").Range("A1") AND y < sheets("シート2").Range("A1") Then 処理 End If End Function 例えば上記のコードのようなものがあったとして、 シート名を省いて文字数を減らす方法はあるでしょうか? 1つのFunction内では「このシート」しか参照しないというような指定が出来ると、 If x > Range("A1") AND y < Range("A1") Then というように簡単にできますよね? 他のFunctionでは、シートの指定はさせたくないので、 End Functionの手前で、「シート指定終了」というのを 記述できればベストなのですが…。 どうかよろしくお願いいたします。

  • Rubyプログラムの質問です

    Rubyプログラムの質問です。 y = ax^3 + bx^2 + cx + d という関数が与えられていて、 整数a,b,c,dを読み込んで、xが0から1まで0.1刻みでyの値を求め、印字するプログラムを作っています。 そして、この中でyの値が最小・最大となるときのx,yの値を出力したいのですが、どう求めればよいのかわかりません。 まずxを0から1まで0.1刻みで出力するのはstepを使って 0.step(10,0.1){ |x| print( x,"\n" ) まではわかりました。 その出力したxをどのように関数の式に代入するのかがわかりません。 そして最小値・最大値を求める問題ですが、最小値を記憶して、次の要素より小さければ交換という 形でいこうと思っているのですが、これもどのようにすればよいのかはっきりわかりません。 loopを使うということは何となく想像がつきます。 たとえばこのようにしても大丈夫なのでしょうか? for( i=1;i<100;i++ ){ if( a[0] < a[i] ){ work = a[0]; a[0] = a[i] a[i] = work; } } どなたかご教示いただければ幸いです。

  • VBAについて質問です。

    VBAについて質問です。 まとまったデータがあるところから検索したい月及び各項目のデータを検索し、項目シート事に抽出するという作業を行なっています。そこで問題がでました。6月にはデータはあるが、5月にはデータはない。 そうすると以下のコードの場合デバックが入り、他の検索が出来ません。 どうしたらよいのでしょうか? 分かる方がいらっしゃいましたらどうかお願い致します。 'シートの変更 Range("B30").Select Sheets("東京").Select '●Sheet2書込み行 Sheets("東京").Range("A5").CurrentRegion.Clear Sheets("東京").Range("A5:F5").Value = _ Array("依頼書No.", "受付日日", "担当者", "枚数", "工数", "備考") Row2 = 5 For R = 2 To Sheets("日報").Cells(Rows.Count, "A").End(xlUp).Row If Sheets("東京").Range("A2") = Sheets("日報").Cells(R, "A") And _ Sheets("東京").Range("B2") = Month(Sheets("日報").Cells(R, "C")) Then Row2 = Row2 + 1 Sheets("東京").Cells(Row2, "A") = Sheets("日報").Cells(R, "B") Sheets("東京").Cells(Row2, "B") = Sheets("日報").Cells(R, "D") Sheets("東京").Cells(Row2, "C") = Sheets("日報").Cells(R, "F") Sheets("東京").Cells(Row2, "D") = Sheets("日報").Cells(R, "I") Sheets("東京").Cells(Row2, "E") = Sheets("日報").Cells(R, "K") Sheets("東京").Cells(Row2, "F") = Sheets("日報").Cells(R, "L") End If Next R '●抽出結果を日付で並べ替え If Row2 = 5 Then MsgBox "該当データなし!" Else Sheets("東京").Range("A5:F" & Row2).Sort _ Key1:=Range("B6"), Order1:=xlAscending, _ Header:=xlYes, OrderCustom:=1, MatchCase:=False, _ Orientation:=xlTopToBottom, SortMethod:=xlPinYin End If Sheets("東京").Select Range("B5:B200").Select Selection.NumberFormatLocal = "yyyy/m/d"     Rows("5:5").Select With Selection .HorizontalAlignment = xlCenter .VerticalAlignment = xlBottom .WrapText = False .Orientation = 0 .AddIndent = False .ShrinkToFit = False .MergeCells = False End With このあとに式を入れて、罫線を入れてコピーして、というコードが入っています。 どうぞ宜しくお願い致します。

  • C++のプログラムが走りません。

    <<条件は以下です。>> データメンバ x:xの座標(ただし 0-1000とする) y:yの座標(ただし 0-1000とする) z:zの座標(ただし 0-1000とする) メンバ関数 void setX(int a): xの座標を設計する(範囲外の値は、error messageを出力する) void setY(int b): Yの座標を設計する(範囲外の値は、error messageを出力する) void setZ(int c) Zの座標を設計する(範囲外の値は、error messageを出力する) int getX(): Xの座標値を得る int getY(): Yの座標値を得る int getZ(): Zの座標値を得る << 不明な点は、 if文で、どう戻るかがわからないことと、 最後の結果表示の部分です。 以下が、作成したプログラムです。ネットで検索して類似しているプログラムを参考にしたんですが。 よろしくお願いします。>> #include <iostream> using namespace std; class Zahyou{ private: int getX();//Xの座標値を得る int getY();//Yの座標値を得る int getZ();//Zの座標値を得る int a,b,c; public: void setX(int a);//Xの座標を設計する void setY(int b);//Yの座標を設計する void setZ(int c);//Zの座標を設計する void show(); }; void Zahyou::show(){ cout << "The result is: (" << a << "," << b << "," << c << ")"; } void Zahyou::setX(int a){ cout << " Please Input X " << "\n "; cin >> a ; if(a < 0 && a > 1000){ cout << "The value of X is a mistake, Please input X again! " << " \n "; } } void Zahyou::setY(int b){ cout << "Please Input Y " << "\n "; cin >> b ; if(b < 0 && b > 1000){ cout << "The value of y is a mistake, Please input X again! " << " \n "; cin >> b ; } } void Zahyou::setZ(int c){ cout << " Please Input Z " << "\n "; cin >> c ; if(c < 0 && c > 1000){ cout << "The value of Z is a mistake, Please input X again! " << " \n "; cin >> c ; } } int main(){ Zahyou zahyou1; zahyou1.getX(); zahyou1.getY(); zahyou1.getZ(); zahyou1.show(); return 0; }

  • VBAのプログラムでうまく動かなくて困っています。

    VBA初心者です。 エクセルのVBAのプログラムでうまく動かなくて困っています。教えていただける方がいらしたら、ぜひ教えて下さい!よろしくお願いします。エクセルの内容は以下のとおりです。 (内容) セル    E H J L N P R・・・ 8行目100 200 50 40 30 80 9行目130 350 10 50 60 120 110 ・ ・ (1)列Hの値が列Eの値より大きい場合その下に行を追加します。 (2)セルJ+セルL+セルN+・・をしてセルEの値を超えたセル以降の値を追加した行のセルJ列から順にコピペする処理です。 上のセルの1行目の内容でいいますと、 (1)列Hの値「200」が列Eの値「100」より大きいのでその下に行追加 (2)セルJ、L、N「50」+「40」+「30」でセルEの値「100」より大きいので、追加した行のセルJ列にセルN、Pの値をコピペするです。 以下が私が書いたプログラムです。 Sub test() Dim x As Integer Dim s As Integer Dim t As Integer x = Range("B8").End(xlDown).Row r = Range("J8").End(xlToRight).Column '8行目から最終行までループ For i = x To 9 Step -1 If Cells(i, 5) < Cells(i, 8) Then ☆【For r = y To 11 Step -2 Cells(s, t).Value = Cells(i, r) + Cells(i, r + 2) If Cells(i, 5).Value < Cells(s, t).Value            Then Exit For Next】 Rows(i + 1).Insert Shift:=xlDown '超えたセルをコピーして、1行下の"J列以降"に代入 ★ x = x + 1 End If Next i End Sub 上記プログラムで★の部分がうまく書けません。☆の部分も間違っているような気がします。よろしくお願いします。

専門家に質問してみよう