語句のチェックマクロ

このQ&Aのポイント
  • 「A」「B」「C」「D」のすべての語句があれば○とするマクロを作成しました。
  • マクロは、指定されたURLからHTMLを取得し、その中に「A」「B」「C」「D」が含まれているかチェックします。
  • もし含まれていれば○を表示し、含まれていなければ--を表示します。
回答を見る
  • ベストアンサー

「A」「B」「C」「D」のすべての語句があれば○

下記のマクロは、「A」があったら○を付けるというものです。 「A」があったら・・・というのを、 「A」「B」「C」「D」のすべての語句があれば○、というようにしたいです。 それは、どのような記述に変更すればできるでしょうか? よろしくお願いいたします。 Sub main() '!!!! [Microsoft XML v6.0] に参照設定 Dim xHttp As IServerXMLHTTPRequest Dim myErr_Number As Long, myErr_Description As String Set xHttp = CreateObject("MSXML2.ServerXMLHTTP") Dim aCell As Range R = 1 For Each aCell In Selection.Columns(1).Cells Application.Goto aCell DoEvents sUrl = aCell.Value If sUrl <> "" Then xHttp.Open "GET", sUrl, True xHttp.setOption SXH_OPTION_IGNORE_SERVER_SSL_CERT_ERROR_FLAGS, _ SXH_SERVER_CERT_IGNORE_ALL_SERVER_ERRORS On Error Resume Next xHttp.send If xHttp.readyState <> 4 Then xHttp.waitForResponse 5 End If If xHttp.readyState <> 4 Then Err.Raise 1004, , myErr_Number = Err.Number myErr_Description = Err.Description On Error GoTo 0 If myErr_Number = 0 Then sHtml = xHttp.responseText nRtn = InStr(sHtml, "A") If nRtn = 0 Then aCell.Offset(, 1).Value = "--" Else aCell.Offset(, 1).Value = "○" End If Else aCell.Offset(, 1).Value = myErr_Description DoEvents End If Next Set xHttp = Nothing End Sub

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

  • ベストアンサー
回答No.9

あ、すいません。No.8では、 in_strm.Charset = "_autodetect" で自動解析させてますが、 これだと、もともとUTF-8だったときに、誤認識して文字化けするかもしれない。 なので、HTML中のcharsetを調べて in_strm.Charset  に 指定したほうがよいかもです。 たとえば、 sHtml = xHttp.responseText v1 = InStr(1, sHtml, "charset=") + 8 If (Mid(sHtml, v1, 1) = """") Then v1 = v1 + 1 v2 = InStr(v1, sHtml, """") If (v2 > InStr(v1, sHtml, "/")) Then v2 = InStr(v1, sHtml, "/") If (v2 > InStr(v1, sHtml, " ")) Then v2 = InStr(v1, sHtml, " ") sCharset = Mid(sHtml, v1, v2 - v1) Set in_strm = CreateObject("ADODB.Stream") in_strm.Open in_strm.Position = 0 in_strm.Type = 1 in_strm.Write xHttp.responseBody in_strm.Position = 0 in_strm.Type = 2 in_strm.Charset = sCharset sHtml = in_strm.ReadText If InStr(sHtml, "ニキビ") > 0 And InStr(sHtml, "改善") > 0 And InStr(sHtml, "メイク") > 0 Then aCell.Offset(, 1).Value = "○" Else aCell.Offset(, 1).Value = "--" End If みたいに。 もちろん、今回の件の原因が 文字化けだったら の話ですが…

mute_low
質問者

お礼

回答ありがとうございます! Sub main() '!!!! [Microsoft XML v6.0] に参照設定 Dim xHttp As IServerXMLHTTPRequest Dim myErr_Number As Long, myErr_Description As String Set xHttp = CreateObject("MSXML2.ServerXMLHTTP") Dim aCell As Range R = 1 For Each aCell In Selection.Columns(1).Cells Application.Goto aCell DoEvents sUrl = aCell.Value If sUrl <> "" Then xHttp.Open "GET", sUrl, True xHttp.setOption SXH_OPTION_IGNORE_SERVER_SSL_CERT_ERROR_FLAGS, _ SXH_SERVER_CERT_IGNORE_ALL_SERVER_ERRORS On Error Resume Next xHttp.send If xHttp.readyState <> 4 Then xHttp.waitForResponse 5 End If If xHttp.readyState <> 4 Then Err.Raise 1004, , myErr_Number = Err.Number myErr_Description = Err.Description On Error GoTo 0 If myErr_Number = 0 Then sHtml = xHttp.responseText v1 = InStr(1, sHtml, "charset=") + 8 If (Mid(sHtml, v1, 1) = """") Then v1 = v1 + 1 v2 = InStr(v1, sHtml, """") If (v2 > InStr(v1, sHtml, "/")) Then v2 = InStr(v1, sHtml, "/") If (v2 > InStr(v1, sHtml, " ")) Then v2 = InStr(v1, sHtml, " ") sCharset = Mid(sHtml, v1, v2 - v1) Set in_strm = CreateObject("ADODB.Stream") in_strm.Open in_strm.Position = 0 in_strm.Type = 1 in_strm.Write xHttp.responseBody in_strm.Position = 0 in_strm.Type = 2 in_strm.Charset = sCharset sHtml = in_strm.ReadText If InStr(sHtml, "A") > 0 And InStr(sHtml, "B") > 0 And InStr(sHtml, "B") > 0 Then aCell.Offset(, 1).Value = "○" Else aCell.Offset(, 1).Value = "--" End If Else aCell.Offset(, 1).Value = myErr_Description DoEvents End If Next Set xHttp = Nothing End Sub これで、作業ができるようになりました! 1点だけ、URLを調べていくと途中で、 実行時エラー3001「引数が間違った型、許容範囲外、または競合しています。」 というポップが出て、頻繁に止まります。 これは、何かの記述で避けることができるようになるでしょうか?

その他の回答 (13)

回答No.14

> エラーが出たURLの一部は、 >https://www.apo-job.jp/ >(charsetのところは、charset=euc-jp) >https://www.aniel.jp/ >(charsetのところは、charset=UTF-8) >https://www.amo-co.jp/ >(charsetのところは、charset="UTF-8) もしかして エラーが出るサイトは https の サイト集中していませんか? というのも、上記、3サイトとも 私が実験してみたところ "A security error occurred" というエラーが、--や○が入るところにに埋まりました。 (コードの後ろから6行目のEnd if 抜けは、修正しましたが) また、上記3サイトのHTMLを 一旦 手動でダウンロードして 仮のURLで本プログラムにかけた所、きちんとエラーなく判定できたので これのHTML自体は、正しいみたいです。 また、正規のSSLサーバー証明書を使っているサイトだとhttpsでも、 きちんとエラーなく判定できました。 たまたまかもしれませんが、上記3サイトは、どれも xserverというレンタルサーバーを使っていているようなのですが、 もしかして これのSSL証明書が SNI というタイプなのかもしれません。 (大雑把にいうとブラウザがSNIに対応していないと接続できないタイプ) そして、それが、 本プログラムの MSXML2.ServerXMLHTTPでは、 上手く 接続できないのかもしれません。 xHttp.setOption SXH_OPTION_IGNORE_SERVER_SSL_CERT_ERROR_FLAGS, _ SXH_SERVER_CERT_IGNORE_ALL_SERVER_ERRORS のオプション指定で 証明書のエラーを無視するような記述はあるのですが、 SNIは、リクエストするホスト名(URL)までは平文で、 その後から暗号に切り替わるなるという ちょっと変わった通信なので。 もしこれが原因なら、 VBAからのHTML取得に、SNI対応する別の通信方法を選ぶか、 SNIに対応したコマンドライン系のダウンローダをVBAからシステムコールして、  そのテンポラリファイルに対して、VBAからデータチェックを行うか ってことになるでしょう。 (これ以上は、本気だして、ちゃんと調べないと、なんとも…)

mute_low
質問者

お礼

返信ありがとうございます! > もしかして エラーが出るサイトは https の サイト集中していませんか? 他のURLのhttpsは大丈夫でした。 そのため、SSLは関係ないかと思われます。 SSL証明書が関係して、かなり専門的になってきますね・・・。 何度も回答&返信ありがとうございました。 動かせるマクロを書いていただけて、嬉しかったです。 作業を進めることができました。 ありがとうございました!

回答No.13

>1点だけ、URLを調べていくと途中で、 >実行時エラー3001「引数が間違った型、許容範囲外、または競合しています。」 >というポップが出て、頻繁に止まります。 多分 HTMLから charset=~ を取り出す処理のところで うまく取り出せない記述の HTMLがあるのだと思われます。 HTMLのソースのcharsetのとこがどうなってるかや sCharset変数 を debug.print するなりして、 調べてみて下さい。 もしくは、そのエラーがでてしまう、URLを教えて下さい。

mute_low
質問者

お礼

返信ありがとうございます! エラーが出たURLの一部は、 https://www.apo-job.jp/ (charsetのところは、charset=euc-jp) https://www.aniel.jp/ (charsetのところは、charset=UTF-8) https://www.amo-co.jp/ (charsetのところは、charset="UTF-8) 他にも止まるURLはありますが、 基本、charset="UTF-8です。 一番上のだけ、charset=euc-jpでした。

  • watabe007
  • ベストアンサー率62% (476/760)
回答No.12

>「A」「B」「C」「D」のすべての語句があれば○ >nRtn = InStr(sHtml, "A") >If nRtn = 0 Then > aCell.Offset(, 1).Value = "--" >Else > aCell.Offset(, 1).Value = "○" >End If Dim Ver As Variant, flg As Boolean For Each Ver In Array("A", "B", "C", "D")   If InStr(sHtml, Ver) = 0 Then flg = True Next If flg = True Then   aCell.Offset(, 1).Value = "--" Else   aCell.Offset(, 1).Value = "○" End If

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

#5です。#5では私の意図を組んでもたってません。また質問では、条件は4つであるのを、3つに簡略してます。それを察知して修正したのかどうか。 しかしそれは言いません。 ーー 小生は趣味で正規表現を勉強していて、正規表現で簡単にならないか、考えてみました。 例データ A1:A10 ニキビ対策の改善にこのメイクをどうぞ 腹痛対策改善にのメイクをどうぞ  ニキビ対策の決定版にこのメイクをどうぞ  しつこいニキビ対策決定版。改善にこのメイクをどうぞ  しつこいかゆみ対策決定版。改善にこのメイクをどうぞ  スキン対策決定版。改善にこのメイクをどうぞ  スキン対策決定版。改善にこのメイクをどうぞ  皮膚対策決定版。改善にこの薬をどうぞ  皮ふニキビ対策決定版。スキン改善にこのメイクをどうぞ  ニキビ対策決定版。スキン改善にこのメイクをどうぞ。よいメイクです。  ーー 標準モジュールに Sub test03() 'Microsoft vbscript reguler expresshion 参照設定 Dim RegMc As Variant Dim str1 As String Dim str2 As String lr = Range("A1000").End(xlUp).Row For i = 1 To lr vl = Cells(i, "A") '--- str1 = vl str2 = "" With CreateObject("VBScript.RegExp") .Pattern = "ニキビ|スキン|メイク" .Global = True Set RegMc = .Execute(str1) MsgBox i & "= " & RegMc.Count If RegMc.Count >= 3 Then str2 = RegMc(0) '抽出 MsgBox (str1 & "=" & str2) End If End With Next i End Sub これを実行すると、 この例では、Pattern = "ニキビ|スキン|メイク" と3語の例なので RegMc.Count >= 3   なら条件を満たしているかと思った。 しかし1文の中に含まれる語が、ニキビースキンースキンだと、この設例の条件(最低でも指定3語は1回以上出現)を満たさない(語「メイク」がない)のにRegMc.Count >= 3  を満たしてしまう。 これをカバーする正規表現は、力不測でわからない。 考えているケースでは、「ダブり出現がない」といえるなら使えるだろう。 === こういう分野・方法もあるということを紹介します。

  • kkkkkm
  • ベストアンサー率65% (1620/2460)
回答No.10

他の方へ補足を見たのですが > https://xn--t8jpwa5c9i0a2269fe27ail0b.com/ > http://xn--ncka8a8dwbt6kza0d9d.com/ > 双方のサイトで、何か決定的な違いがあったりするのでしょうか? 文字コードが違つて、上はUTF-8で下は下はShift_JISでした。 Shift_JISだと駄目なんだと思いますから sHtml=StrConv(xHttp.responseText , vbUnicode) みたいな感じで変換してみてはいかがでしょう。

回答No.8

nRtn = InStr(sHtml, "A") nRtn = nRtn+InStr(sHtml, "B") nRtn = nRtn+InStr(sHtml, "C") nRtn = nRtn+InStr(sHtml, "D") If nRtn = 4 Then だと、InStrは ありなしを False or True とか、0 or 1で 返す関数でなく、 見つけた文字列の先頭からの位置を返す関数なので、 この記述だと 誤動作すると思います。 また、3条件や4条件ぐらいなら フラグを使ったり 3条件の積を作るのに、Orの裏を使ってわざわざややこしくしなくても、 Andの表 (つまり代入部を逆)にして If InStr(sHtml, "ニキビ") > 0 And InStr(sHtml, "改善") > 0 And InStr(sHtml, "メイク") > 0 Then  aCell.Offset(, 1).Value = "○" Else  aCell.Offset(, 1).Value = "--" End If で書いたほうが、見た目も、分かりやすいし、 あとあとも修正し易いように 思います。 で、肝心の文字列あるのに 発見できないのは、多分 sHtml = xHttp.responseText で取り出してるので VBAではこれを勝手にutf-8扱いして、 元がSJISだと文字化けしているからだと思われます。 なので、一旦 xHttp.responseBody からバイナリのまま取り出して、 これを 手動で文字コード変換してやればよいかと。 具体的には、 Set in_strm = CreateObject("ADODB.Stream") in_strm.Open in_strm.Position = 0 in_strm.Type = 1 in_strm.Write xHttp.responseBody in_strm.Position = 0 in_strm.Type = 2 in_strm.Charset = "_autodetect" sHtml = in_strm.ReadText If InStr(sHtml, "ニキビ") > 0 And InStr(sHtml, "改善") > 0 And InStr(sHtml, "メイク") > 0 Then aCell.Offset(, 1).Value = "○" Else aCell.Offset(, 1).Value = "--" End If みたいな感じで。

  • kon555
  • ベストアンサー率52% (1754/3367)
回答No.7

>>○がつきませんでした では「--」が入力されましたか? それとも何も入力されませんでしたか? いい機会だと思って、軽くデバックのやり方を覚えた方がいいように思います。 まず重要なのは『何がどうなったか』を正確に認識することです。今回のケースであれば『--と入力された』のと『何も入力されなかった』のでは有力な原因が変わってきます。 まずそれをしっかりと認識し、またこうしたサイトで質問する際には記載するようにしましょう。 またマクロを単純に実行するのではなく、F8のステップインで挙動を確認しながら実行していくのも効果的です。 そのようにしていけば、「そもそも文字列の認識に失敗している」のか「『全てに当てはまる』という判定部分で失敗している」のか「○の記入に失敗している」のかが分かるようになります。 長いマクロですし、一度貴方自身の環境でそれらを確認してみないと、中々有効な対策は出てこないと思いますよ。 https://www.excelspeedup.com/vbadebug/

mute_low
質問者

お礼

説明不足すみません。「--」は入力されました。 そのため、ソース内の認識ができていないのかな?と思いました。 日本語ドメインをピュニコードで暗号化されているのも、 日本語ドメインに変えてやりましたが、「--」でした。 そのため、日本語ドメイン・ピュニコードは関係ないかと。 ・HTMLで作られたサイト ・WordPressで作られたサイト この違いがあるかもと思い、いろいろ試しましたが、 https://xn--t8jpwa5c9i0a2269fe27ail0b.com/ こちらのHTMLサイトは、ちゃんと「◯」が付きます。 WordPressで作られたサイトも、いくつか試しましたが、 マクロに記述した語句が一致して「○」が付きました。 おそらく、一部のHTMLサイト(http://xn--ncka8a8dwbt6kza0d9d.com/など) がうまく行っていないようです。 このうまく行かないサイトとの違いを見つける。 または、別のアプローチでソースを認識して「◯」「--」を付けるようにする。 というのが良いかと思いました。 https://xn--t8jpwa5c9i0a2269fe27ail0b.com/ http://xn--ncka8a8dwbt6kza0d9d.com/ 双方のサイトで、何か決定的な違いがあったりするのでしょうか?

  • kkkkkm
  • ベストアンサー率65% (1620/2460)
回答No.6

No3です。 もしかしたら http://xn--ncka8a8dwbt6kza0d9d.com/ は http://リプロスキンニキビ・.com/ にリダイレクトされてるから、リダイレクト用のHTML内で検索してヒットしないのではないでしょうか。

mute_low
質問者

補足

http://xn--ncka8a8dwbt6kza0d9d.com/ は、ピュニコードで日本語に変換したのが、 リプロスキンニキビ・ のようです。 http://リプロスキンニキビ・.com/ でやっても、○が付きませんでした。

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

質問がエクセルでないのは承知してますが、手軽なテストのためやってみた。 Instr関数を使うことを守ってやった。 ニキビ、対策、改善の3御をオール含むものOK。 例データ A1:B4 A列が例文。B列が結果OKかNO。 例文 ニキビ対策の改善にこのメイクをどうぞ OK 腹痛対策改善にのメイクをどうぞ  NO ニキビ対策の決定版にこのメイクをどうぞ  NO ニキビ対策決定版。改善にこのメイクをどうぞ  OK 標準モジュールに Sub test0() For i = 1 To 4 vl = Cells(i, "A") p = InStr(vl, "ニキビ") If p = 0 Then GoTo no p = InStr(vl, "対策") If p = 0 Then GoTo no p = InStr(vl, "改善") If p = 0 Then GoTo no Cells(i, "B") = "OK" GoTo nx no: Cells(i, "B") = "NO" nx: Next i End Sub 上記はGoTp文があったりして、自慢じゃないが、気に食わなければ無視して。ロジックは何もむつかしくない。 条件が1つでも見つからなければ、脱落という考えで済む話。

mute_low
質問者

補足

>質問がエクセルでないのは承知してますが、手軽なテストのためやってみた。 EXCELでマクロを動かしています。 カテゴリーは、EXCELの方が良かったでしょうか? マクロをやってみましたが、NOが4つ表示されました。 URLのソースの中に、指定した語句がすべてある場合に◯が付く。 という形にしたいです。

  • kon555
  • ベストアンサー率52% (1754/3367)
回答No.4

「A」「B」「C」「D」の全てがあれば、なら別個にフラグ管理するのがいいと思いますよ。 nRtn = InStr(sHtml, "A") If nRtn = 0 Then のところを、 if InStr(sHtml, "A") <> 0 then i = i+1 if InStr(sHtml, "B") <> 0 then i = i+1 (以下CとDも同様に) に変えます。 そして If nRtn = 0 Then aCell.Offset(, 1).Value = "--" Else aCell.Offset(, 1).Value = "○" End If を If i < 4 Then aCell.Offset(, 1).Value = "--" Else aCell.Offset(, 1).Value = "○" End If とします。これでいけると思いますよ。 不要かもしれませんが解説すると、元々のマクロは条件が1つだけなので、「Aが含まれるか、含まれないか」だけで直接判定しています。 それが nRtn = InStr(sHtml, "A") If nRtn = 0 Then aCell.Offset(, 1).Value = "--" Else aCell.Offset(, 1).Value = "○" End If の部分です。 しかし複数語句の「全てを満たす」というタイプなら、単純にフラグを4つ容易するのが簡単です。 これが if InStr(sHtml, "A") <> 0 then i = i+1 の部分です。 これは語句が含まれる場合は変数iに1を足していくので、全て含まれる場合は、最終的に条件の数とiの数は等しくなります。 よって If i < 4 Then の条件で、○を付けるかつけないかが判定できるのです。 仮に語句の種類を増やす場合、この判定の「i<4」の部分も忘れずに変更してくださいね。

mute_low
質問者

補足

If InStr(sHtml, "ニキビ") <> 0 Then i = i + 1 If InStr(sHtml, "対策") <> 0 Then i = i + 1 If InStr(sHtml, "改善") <> 0 Then i = i + 1 If i < 3 Then aCell.Offset(, 1).Value = "--" Else aCell.Offset(, 1).Value = "○" End If でやってみましたが、○が付きませんでした。 If i < 4 Then、If i < 3 Thenの両方でも駄目でした。 他の部分のマクロが違うのでしょうか?

関連するQ&A

  • サイトタイトルに、指定した語句があれば○

    下記のマクロは、指定範囲のURL先のソースに、 指定した語句があれば、○を付けるマクロです。 指定した語句をソース全て対象にせずに、 <title></title>のサイトタイトルの中にあれば、○を付けるというようにしたいです。 ちなみに、調べたいのは語句ではないですが、"【"というカッコです。 ・下記のマクロ URL先のソース全体の中に、指定した語句があれば○ ・希望のマクロ <title></title>(サイトタイトル)の中に、指定した語句があれば○ どの部分を修正、または追加すればできるようになりますか? よろしくお願いいたします。 Sub 指定した語句() '!!!! [Microsoft XML v6.0] に参照設定すること Dim xHttp As IServerXMLHTTPRequest Dim myErr_Number As Long, myErr_Description As String Set xHttp = CreateObject("MSXML2.ServerXMLHTTP") Dim aCell As Range R = 1 For Each aCell In Selection.Columns(1).Cells '選択セルの1列目がURL Application.Goto aCell '対象URLの列にジャンプ表示 DoEvents sUrl = aCell.Value If sUrl <> "" Then xHttp.Open "GET", sUrl, True xHttp.setOption SXH_OPTION_IGNORE_SERVER_SSL_CERT_ERROR_FLAGS, _ SXH_SERVER_CERT_IGNORE_ALL_SERVER_ERRORS ' SSL関係のエラーを無視 On Error Resume Next xHttp.send If xHttp.readyState <> 4 Then xHttp.waitForResponse 5 '5秒まってだめならタイムアウト End If If xHttp.readyState <> 4 Then Err.Raise 1004, , "タイムアウト" myErr_Number = Err.Number myErr_Description = Err.Description On Error GoTo 0 If myErr_Number = 0 Then sHtml = xHttp.responseText nRtn = InStr(sHtml, "指定した語句") If nRtn = 0 Then aCell.Offset(, 1).Value = "--" Else aCell.Offset(, 1).Value = "○" End If Else aCell.Offset(, 1).Value = myErr_Description ' エラー時はエラー内容を表示 End If DoEvents End If Next Set xHttp = Nothing End Sub

  • サイトタイトルの中に、指定した語句があれば○

    下記は、URL先のソースの中に、 指定した語句があれば、○を付けるマクロです。 このURL先のソース、全てを対象にするのではなく、 <title></title>、つまりサイトタイトルの中に、 指定した語句があれば、○を付けるというように制限して調べたいです。 ・下記のマクロ URL先のソース全体の中に、指定した語句があれば○ ・希望のマクロ <title></title>(サイトタイトル)の中に、指定した語句があれば○ これは、どの部分を修正、追加すればできるようになるでしょうか? また、「指定した語句」の他にも、「指定した語句2」「指定した語句3」、 つまり、<title></title>の中に、「●●」「▲▲」「■■」のどれかが含まれていたら、 隣のセルに○を付ける。という風にしたいです。 ソース全体で調べるなら、 nRtn = InStr(sHtml, "●●") + InStr(sHtml, "▲▲") + InStr(sHtml, "■■") で出来ると思うのですが、制限させて調べる場合は、 どのような記述になるでしょうか? よろしくお願いいたします。 Sub 指定した語句() '!!!! [Microsoft XML v6.0] に参照設定すること Dim xHttp As IServerXMLHTTPRequest Dim myErr_Number As Long, myErr_Description As String Set xHttp = CreateObject("MSXML2.ServerXMLHTTP") Dim aCell As Range R = 1 For Each aCell In Selection.Columns(1).Cells '選択セルの1列目がURL Application.Goto aCell '対象URLの列にジャンプ表示 DoEvents sUrl = aCell.Value If sUrl <> "" Then xHttp.Open "GET", sUrl, True xHttp.setOption SXH_OPTION_IGNORE_SERVER_SSL_CERT_ERROR_FLAGS, _ SXH_SERVER_CERT_IGNORE_ALL_SERVER_ERRORS ' SSL関係のエラーを無視 On Error Resume Next xHttp.send If xHttp.readyState <> 4 Then xHttp.waitForResponse 5 '5秒まってだめならタイムアウト End If If xHttp.readyState <> 4 Then Err.Raise 1004, , "タイムアウト" myErr_Number = Err.Number myErr_Description = Err.Description On Error GoTo 0 If myErr_Number = 0 Then sHtml = xHttp.responseText nRtn = InStr(sHtml, "指定した語句") If nRtn = 0 Then aCell.Offset(, 1).Value = "--" Else aCell.Offset(, 1).Value = "○" End If Else aCell.Offset(, 1).Value = myErr_Description ' エラー時はエラー内容を表示 End If DoEvents End If Next Set xHttp = Nothing End Sub

  • キーワードが全部あるのに、○が付かない

    下記のマクロは、URL先のソースの中に、 「赤ちゃん」「妊婦」「ママ」「水」「ウォーター」 のどれかがあれば、隣に○を付けるというものです。 ですが、 https://www.andrea-pennington.com/ こちらのサイトを調べたところ、 キーワードが全部あるのに、○が付かず--でした。 マクロの記述がどこかおかしいでしょうか? ソースの中に、どれかのキーワードがあれば、 ○が付くようにするには、どのような記述になるでしょうか? Excel2016です。 よろしくお願いいたします。 Sub main() '!!!! [Microsoft XML v6.0] に参照設定すること Dim xHttp As IServerXMLHTTPRequest Dim myErr_Number As Long, myErr_Description As String Set xHttp = CreateObject("MSXML2.ServerXMLHTTP") Dim aCell As Range R = 1 For Each aCell In Selection.Columns(1).Cells '選択セルの1列目がURL Application.Goto aCell '対象URLの列にジャンプ表示 DoEvents sUrl = aCell.Value If sUrl <> "" Then xHttp.Open "GET", sUrl, True xHttp.setOption SXH_OPTION_IGNORE_SERVER_SSL_CERT_ERROR_FLAGS, _ SXH_SERVER_CERT_IGNORE_ALL_SERVER_ERRORS ' SSL関係のエラーを無視 On Error Resume Next xHttp.send If xHttp.readyState <> 4 Then xHttp.waitForResponse 5 '5秒まってだめならタイムアウト End If If xHttp.readyState <> 4 Then Err.Raise 1004, , "タイムアウト" myErr_Number = Err.Number myErr_Description = Err.Description On Error GoTo 0 If myErr_Number = 0 Then sHtml = xHttp.responseText nRtn = InStr(sHtml, "赤ちゃん") + InStr(sHtml, "妊婦") + InStr(sHtml, "ママ") + InStr(sHtml, "水") + InStr(sHtml, "ウォーター")          If nRtn = 0 Then aCell.Offset(, 1).Value = "--" Else aCell.Offset(, 1).Value = "○" End If Else aCell.Offset(, 1).Value = myErr_Description ' エラー時はエラー内容を表示 End If DoEvents End If Next Set xHttp = Nothing End Sub

  • "【"が、Shift_JISのサイトで認識できない

    下記のマクロは、指定範囲のURL先のソースに、 指定した語句があれば、○を付けるマクロです。 指定した語句をソース全て対象にせずに、 <title></title>のサイトタイトルの中に、"【"があれば○を付けるというようにしたいです。 (クォーテーションマーク抜きの【) https://okwave.jp/qa/q9899670.html こちらで先に質問をして回答をいただいたのが、 元のコードの一部を、 If sHtml Like "*<title>*" & "【" & "*</title>*" Then aCell.Offset(, 1).Value = "○" Else aCell.Offset(, 1).Value = "--" End If に変更するというものです。 しかし、これだとUTF-8のサイトは認識できますが、 Shift_JISのサイトでは認識できないようです。(【があるのに、○が付かない) UTF-8とShift_JISのサイト両方を認識して、 "【"が、<title></title>の中にあるものに○を付くようにするには、 どのようなマクロの記述になりますでしょうか? よろしくお願いいたします。 Sub 指定した語句() '!!!! [Microsoft XML v6.0] に参照設定すること Dim xHttp As IServerXMLHTTPRequest Dim myErr_Number As Long, myErr_Description As String Set xHttp = CreateObject("MSXML2.ServerXMLHTTP") Dim aCell As Range R = 1 For Each aCell In Selection.Columns(1).Cells '選択セルの1列目がURL Application.Goto aCell '対象URLの列にジャンプ表示 DoEvents sUrl = aCell.Value If sUrl <> "" Then xHttp.Open "GET", sUrl, True xHttp.setOption SXH_OPTION_IGNORE_SERVER_SSL_CERT_ERROR_FLAGS, _ SXH_SERVER_CERT_IGNORE_ALL_SERVER_ERRORS ' SSL関係のエラーを無視 On Error Resume Next xHttp.send If xHttp.readyState <> 4 Then xHttp.waitForResponse 5 '5秒まってだめならタイムアウト End If If xHttp.readyState <> 4 Then Err.Raise 1004, , "タイムアウト" myErr_Number = Err.Number myErr_Description = Err.Description On Error GoTo 0 If myErr_Number = 0 Then sHtml = xHttp.responseText nRtn = InStr(sHtml, "指定した語句") If nRtn = 0 Then aCell.Offset(, 1).Value = "--" Else aCell.Offset(, 1).Value = "○" End If Else aCell.Offset(, 1).Value = myErr_Description ' エラー時はエラー内容を表示 End If DoEvents End If Next Set xHttp = Nothing End Sub

  • A2の値がA1の値と同じ場合はB2にB1の値+1をして

    A2の値がA1の値と同じ場合はB2にB1の値+1をして A2の値がA1の値と違う場合はB2に"1"を繰り返しさせて入力するように 以下としたのですが、A列の値がなくなる限り1が入力されるだけなのですが どうすれば、A列のセルに同じ値が続く場合連番とすることができるでしょうか。お願いします。 range("B1").value = 1 range("B2").select dim 番号 As varient 番号 = activecell.offset(-1, -1).value do until activecell.offset(0,-1).value = "" with activedell if offset(0, -1).value = 番号 then offset(0, 0).value = offset(-1, 0).value + 1 end if offset(0, 0).value = "1" offset(1, 0).select end with loop

  • A B C

    A B C コード 商品 単価 1 チョコレート 100 2 キャンディー 50 3 ガム 80 4 スナック菓子 150 5 乳製品 170 上記表の下にデータを追加していきたいのですが、その際重複データの入力及びコピーもできないようにしたいと思います。 Private Sub CommandButton1_Click() Dim endrow As Long Dim i As Integer endrow = Range("商品").Columns(1).CurrentRegion.Rows.Count Range("商品").Rows(endrow + 1).Columns(1).Value = TextBox1.Value Range("商品").Rows(endrow + 1).Columns(2).Value = TextBox2.Value Range("商品").Rows(endrow + 1).Columns(3).Value = TextBox3.Value TextBox1.Value = Clear TextBox2.Value = Clear TextBox3.Value = Clear With Range("A2") For i = .CurrentRegion.Rows.Count To 1 Step -1 If .Offset(i, 0) = .Offset(i - 1, 0) Then .Offset(i, 0).EntireRow.Delete Next i End With End Sub すぐ上の行と同じ場合には入力ができませんが、それ以外での重複している場合の入力を回避する為の改善箇所をご教示の程お願い致します。(コードが同じで入力不可)

  • 処理速度を速くする方法教えてください。

    Private Sub CommandButton1_Click() Dim irow As Long Dim Celldata(1 To 6) As Double Dim ekimen(1 To 6) As String '高さ読込み If TextBox8.Value = "" Then MsgBox ("No.を入力") End End If If TextBox9.Value = "" Then MsgBox ("温度を入力") End End If If TextBox10.Value = "" Then MsgBox ("係数を入力") End End If Celldata(1) = TextBox1.Value + (TextBox7.Value - TextBox9.Value) * TextBox10.Value Celldata(2) = TextBox2.Value + (TextBox7.Value - TextBox9.Value) * TextBox10.Value Celldata(3) = TextBox3.Value + (TextBox7.Value - TextBox9.Value) * TextBox10.Value Celldata(4) = TextBox4.Value + (TextBox7.Value - TextBox9.Value) * TextBox10.Value Celldata(5) = TextBox5.Value + (TextBox7.Value - TextBox9.Value) * TextBox10.Value Celldata(6) = TextBox6.Value + (TextBox7.Value - TextBox9.Value) * TextBox10.Value '入力と修正 Dim i As Long '最終行から試験Noが一致するものを探す For i = 65535 To 6 Step -1 If CStr(Cells(i, 1)) = Trim(TextBox8.Value) Then Set myrange = Sheets("データ").Cells(i - 1, 1) '記入セルがoffset(1,x)になっているため、i-1にしています。 Exit For End If Next i 'Noが一致しない場合、最終行を記入セルに設定する。 If i = 5 Then Set myrange = Sheets("データ").Range("A65536").End(xlUp) End If 'ワークシートへの転記 With myrange .Offset(1, 0).Value = TextBox8.Value '----No. .Offset(1, 1).Value = Celldata(1) '----1計測 .Offset(1, 2).Value = Celldata(2) '----2計測 .Offset(1, 3).Value = Celldata(3) '----3ル計測 .Offset(1, 4).Value = Celldata(4) '----4計測 .Offset(1, 5).Value = Celldata(5) '----5計測 .Offset(1, 6).Value = Celldata(6) '----6計測 .Offset(1, 13).Value = TextBox1.Value '----1追加 .Offset(1, 14).Value = TextBox2.Value '----2追加 .Offset(1, 15).Value = TextBox3.Value '----3追加 .Offset(1, 16).Value = TextBox4.Value '----4追加 .Offset(1, 17).Value = TextBox5.Value '----5追加 .Offset(1, 18).Value = TextBox6.Value '----6追加 .Offset(1, 19).Value = TextBox7.Value '---温度 .Offset(1, 20).Value = TextBox11.Value '----1高さ .Offset(1, 21).Value = TextBox12.Value '----2高さ .Offset(1, 22).Value = TextBox13.Value '----3高さ .Offset(1, 23).Value = TextBox14.Value '----4高さ .Offset(1, 24).Value = TextBox15.Value '----5高さ .Offset(1, 25).Value = TextBox16.Value '----6高さ '入力ボックスのクリア TextBox1.Value = "" '----1セル TextBox2.Value = "" '----2セル TextBox3.Value = "" '----3セル TextBox4.Value = "" '----4セル TextBox5.Value = "" '----5セル TextBox6.Value = "" '----6セル TextBox7.Value = "" '---温度 TextBox11.Value = "" '----1セル TextBox12.Value = "" '----2セル TextBox13.Value = "" '----3セル TextBox14.Value = "" '----4セル TextBox15.Value = "" '----5セル TextBox16.Value = "" '----6セル End With 'lblComment.Caption = "ワークシートに転記しました!" End Sub Private Sub CommandButton2_Click() Dim i As Long '入力チェック If TextBox8.Value = "" Then MsgBox ("No.を入力") End End If If TextBox9.Value = "" Then MsgBox ("温度を入力") End End If If TextBox10.Value = "" Then MsgBox ("係数を入力") End End If For i = 65535 To 6 Step -1 If CStr(Cells(i, 1)) = Trim(TextBox8.Value) Then Set myrange = Sheets("データ").Cells(i - 1, 1) '記入セルがoffset(1,x)になっているため、i-1にしています。 Exit For End If Next i '受付No.がない場合、終了します。 If i = 5 Then MsgBox ("No.が見つかりません") End End If '入力の処理と逆の処理を行います。 With myrange TextBox1.Value = .Offset(1, 13).Value '---1計測 TextBox2.Value = .Offset(1, 14).Value '---2計測 TextBox3.Value = .Offset(1, 15).Value '---3計測 TextBox4.Value = .Offset(1, 16).Value '---4計測 TextBox5.Value = .Offset(1, 17).Value '---5計測 TextBox6.Value = .Offset(1, 18).Value '---6計測 TextBox7.Value = .Offset(1, 19).Value '---温度 TextBox11.Value = .Offset(1, 20).Value '---1高さ TextBox12.Value = .Offset(1, 21).Value '---2高さ TextBox13.Value = .Offset(1, 22).Value '---3高さ TextBox14.Value = .Offset(1, 23).Value '---4高さ TextBox15.Value = .Offset(1, 24).Value '---5高さ TextBox16.Value = .Offset(1, 25).Value '---6高さ End With End Sub

  • Excel VBAフォーム 登録ボタンの作成方法

    いつもお世話になっています。 初めて、Excelのフォームで入力画面を作りました。 複数の項目があって、それを最後に[登録]ボタンをクリックで 表に入れたいのですが、一度にまとめて実行する方法が分かりません。 アドバイスよろしくお願いいたします。 Private Sub cmd_1() Dim i As String If man.Value = True Then ActiveCell = man.Caption End If If woman.Value = True Then ActiveCell = woman.Caption End If ActiveCell.Offset(0, 1).Select End Sub Private Sub cmd_2() Dim i As String If man.Value = True Then ActiveCell = Yes.Caption End If If woman.Value = True Then ActiveCell = No.Caption End If ActiveCell.Offset(0, 1).Select End Sub Private Sub cmd_downlist() Dim ListNo As Long ListNo = group.ListIndex ActiveCell.Value = group.List(ListNo, i) ActiveCell.Offset(0, 1).Select End Sub Private Sub cmd_comment() ActiveCell = comment.Text ActiveCell.Offset(1, -3).Select End Sub

  • VBAについて

    以下のプログラムは、1年間の価格合計を求めるプログラムです。 これを実行するとうまくいくこともありますが、エラーが起きることもあります。 どうやら下記コードが原因のようなのですが、間違いがわかりません。 Target.Offset(0, 1).Value = run * (13 - month) どこが間違っているのでしょうか。 また最終的に、A行かB行のどちらかが更新されたときにこのプログラムを 実行させたいのですが、方法がわかりません。 無知な質問ではありますが、どなたか教えてください。 --------------------------------------------------------- Private Sub Worksheet_Change(ByVal Target As Range) Dim month As Integer Dim run As Integer If Intersect(Target, Range("A25:A35")) Is Nothing Then Exit Sub Else If Target.Offset(0, -2).Value <> "" Then month = Target.Offset(0, -2).Value month = month - 3 If month = -2 Then month = 10 ElseIf month = -1 Then month = 11 ElseIf month = 0 Then month = 12 End If run = Target.Offset(0, 0).Value Target.Offset(0, 1).Value = run * (13 - month) End If End If End Sub

  • タイムスタンプを挿入して、時間の経過に合わせて色

    Q列に同じ行のA列に文字が入ると、タイムスタンプを挿入して、時間の経過と共に、720時間かけて白から赤にグラデーション変化する。 上記のVBAを行いたいのですが、オーバーフローエラーが発生します。どの様に修正すれば良いでしょうか? Private Sub Worksheet_Change(ByVal Target As Range) Dim currentDate As Date Dim startTime As Date Dim endTime As Date If Target.Column <> 1 Or Target.Cells.Count > 1 Then Exit Sub If Target.Offset(0, 15).Value = "" And Target.Value <> "" Then startTime = Now() Target.Offset(0, 15).Value = startTime ElseIf Target.Offset(0, 15).Value <> "" And Target.Value = "" Then endTime = Now() Target.Offset(0, 15).Value = "" End If currentDate = Now() If Target.Offset(0, 15).Value <> "" Then Target.Offset(0, 16).Interior.Color = GradientColor(Target.Offset(0, 15).Value, currentDate, startTime, 720) Else Target.Offset(0, 16).Interior.Color = RGB(255, 255, 255) End If End Sub Function GradientColor(ByVal timeStart As Date, ByVal timeEnd As Date, ByVal startTime As Date, ByVal duration As Integer) As Long Dim secondsElapsed As Long Dim fractionTimeElapsed As Double secondsElapsed = DateDiff("s", startTime, timeEnd) ➡︎ fractionTimeElapsed = secondsElapsed / (duration * 3600) fractionTimeElapsed = IIf(fractionTimeElapsed > 1, 1, fractionTimeElapsed) GradientColor = RGB(255 * (1 - fractionTimeElapsed), 255 * fractionTimeElapsed, 255 * fractionTimeElapsed) End Function