• 締切済み

【VBA】sleepかwaitをどこに書き込めば

ExcelでWebスクレイピングを行うための、VBAのソースをご教示頂きました。 過去の質問|https://okwave.jp/qa/q9420082.html このソースは完璧に動くのですが、googleに負荷を掛けてしまい、100件ほど抽出するとエラーが出て使えなくなってしまいます。 そこでsleepやwaitを使って、間隔を空けて実行させたいと考えています。 以下のどの部分に追加すれば良いのか、教えてください! お願い致します。 ――――――――――――――――――― ' Option Explicit ' Sub Macro1() '   Dim SheetW As Worksheet   Dim SheetO As Worksheet   Dim Start As Integer   Dim URL As String   Dim NowCell As String   Dim RowI As Integer   Dim RowO As Integer   Dim RowEnd As Integer   Dim Col As Integer   Dim ColEnd As Integer '   Set SheetO = ActiveSheet   [A10:C10] = Array("番号", "URL", "説明")   [A11:C1048576].Clear   Set SheetW = Sheets.Add   SheetW.Name = "Webクエリ"   RowO = 11   ColEnd = [A5].End(xlToRight).Column '   For Start = SheetO.[B2] To SheetO.[C2] Step SheetO.[D2] DoEvents     URL = SheetO.[B1] & SheetO.[C1] & SheetO.[D1] & Start     With ActiveSheet.QueryTables.Add( _       Connection:="URL;" & URL, _       Destination:=[A1])       .Name = "Google検索結果"       .WebSelectionType = xlEntirePage       .WebFormatting = xlWebFormattingAll       .BackgroundQuery = False       .Refresh     End With '     With SheetO     RowI = [A:A].Find(.[B3]).Row + 1     RowEnd = Cells(Rows.Count, "A").End(xlUp).Row     While Not Cells(RowI, "A") Like .[B4] And _        RowI < RowEnd       NowCell = Cells(RowI, 1) '       For Col = 2 To ColEnd '         If NowCell Like .Cells(5, Col) Then           Exit For         End If       Next Col '       If Cells(RowI, 1).Hyperlinks.Count > 0 And Col > ColEnd Then         .Cells(RowO, "A") = RowO - 10         .Cells(RowO, "C") = NowCell         NowCell = Cells(RowI, "A").Hyperlinks(1).Address '        SheetO.Cells(RowO, "B") = NowCell         .Hyperlinks.Add Anchor:=.Cells(RowO, "B"), _           Address:=NowCell, _           TextToDisplay:=NowCell         RowO = RowO + 1       End If       RowI = RowI + 1     Wend     End With   Next Start ' "Webクエリ"シート削除   Application.DisplayAlerts = False   SheetW.Delete   Application.DisplayAlerts = True End Sub

  • myktk
  • お礼率52% (338/648)

みんなの回答

  • SI299792
  • ベストアンサー率48% (714/1476)
回答No.5

  BusyWait IE の後にSleep を置いてみて下さい。効果があるかもしれません。後、 C1 excel+vba にしてみて下さい。但し、できる可能性は低いです。

  • SI299792
  • ベストアンサー率48% (714/1476)
回答No.4

「職場で~」余計なことを聞いてしまいました。どうでもいいことですが、ちょっと気になって。  Sleep を置くなら、前述の通り、Next Startの上ですが、それでダメたということは、Sleep を置いてもダメです。  お願いがあるのですが、Yahoo でできるかどうか試してください。 B1 https://search.yahoo.co.jp/search?p= D1 &b= B2 1 (Yahoo は1から始まる) C4 次へ> 他の項目は、前と同じ。  後、入力ミスはないと思いますが、念のため確認してください。  できる、できないにかかわらず、閉じないで下さい。Googleでやる方法はあるかもしれません。

  • SI299792
  • ベストアンサー率48% (714/1476)
回答No.3

 うまく行きませんでしたか。D1 &start= 又は &filter=0&start= と書きましてが、どちらにしましたか?(念のための確認です)。私のパソコンではうまくいっているので、私にはわかりません。B5を1にすれば、IEを閉じる前に一時停止するので、メッセージをしっかり見ることができます。一時停止機能はその為につけました。  私も最初そのメッセージが出たのですが、1時間後再実行したら成功しました。1ページ目からこのメッセージが出るのなら、前に実行した時のアクセス禁止が続いている可能性が高いです。多分人間でな考えれれないほどのスピードで次のページを見るからロボットと判断されるので、1ページ目はロボットとわからないはずです。時間がおいてやってみて下さい。  それでも駄目なら、Next Startの上に     Sleep [B6] を置いて、[B6]を1000位にしてやってみて下さい。又は、B5を1にして、1ページ毎に継続ボタンを押して下さい。1度このエラーが出たら、アクセス禁止が続くので、必ず時間をおいてやってみて下さい。  それでも駄目ならお手上げです。低速のパソコンに買い替えて下さい(笑)。  ところで、土日返事がなく、月曜日に返事があったということは、職場でやっているのですか?

myktk
質問者

補足

今回もご回答ありがとうございます! まず「職場で~」という質問ですが、個人用途です! このアカウントも、10数年前にアットホームダットというドラマを見て、作った個人のアカウントです(笑) 平日は目を酷使する仕事をしているので、土日はパソコンから離れた生活(読書や美術館etc.)をしています。スマホでも確認できますが、長文を打つときや、理解を深めたいときはパソコンで確認しています。 で、話しを戻します。 D1については、両方とも試しましたが同じでした。 そして今回教えて頂いた方法でもダメでした(涙) ロボットの表示がされない場合もあるのですが、 そもそもExcelにURL/説明ともに、1つも表示(反映)されません。 エラーも出ず、読み込んでいる挙動はあるのですが、ダメでした。 何度か試し、1度だけ1行分だけ表示されたことがありました。 しかしそれ以降は、Excelがまっさらorロボットと認識されるか… どちらかでした。 低速とは、どこからいうのか分かりませんがw 手元にあるPCでは残念ながら、試せません。 最後に最初に教えて頂いたソースに、もしsleepやwaitを入れるとしたら、どこになりますか?勉強のため教えてください。

  • SI299792
  • ベストアンサー率48% (714/1476)
回答No.2

 勝手な判断とは…私が 100件程しか必要なかったので、自分に合わせて作りました。  色々試していると、「お使いのコンピュータ ネットワークから通常と異なるトラフィックが検出されました。このページは、リクエストがロボットではなく実際のユーザーによって送信されたことを確かめるものです。」というメッセージが出ました。ロボットとみなされての、アクセス禁止が原因のようです。実際にロボットだから仕方ありません。  私は、 200件位まで大丈夫で、前記の方法でできました。スペックの差でしょうか。遅いパソコンにこんなメリットがあったとは。  プログラムを作ったのは、Web クエリを使う方法があると知ったからです。いちいちIEを起動しないので実行速度が上がると思いました。  IEを起動して処理する方法なら、作った経験があります。昔作った物を手直ししました。今の所、エラーは出ていません。 B1 http://www.google.co.jp/search?q= C1 excel vba D1 &start= 又は &filter=0&start= B2 0 C2 1000 D2 10 B3 innerHtml C3 *<b>* C4 ????次へ B5 FALSE と入力して下さい。以下、単なるコメントなので、入れても入れなくてもいいです。 A1 アドレス A2 ページ A3 出力条件 A4 次ページ有無 B4 innerText A5 表示 A10 URL B10 説明  リングは検索結果以外にもいろいろあります。このようなプログラムを作る時は、必要な物をどうやって見分けるか悩みます。検索結果には太字が使われているので、<b> のあるリンクは必要と判断しています。  B5はTrueにするとIEが表示され、すぐに消えます。面白いけれどうざいです。1にすると1ページ処理する度に止まります。デバッグのための機能です。 ' DefInt A-Z ' 一時停止 Declare Sub Sleep Lib "kernel32" ( _   ByVal dwMilliseconds As Long) ' Sub Macro1() '   [A11:B1048576].Clear   Row = 11 '   For Start = [B2] To [C2] Step [D2]     [E1] = Start '     If Not Macro1Loop(Row) Then       Exit For     End If   Next Start End Sub ' Function Macro1Loop(Row) As Boolean '   Dim IE As Object   Dim Links As Object   Dim NameProp As String '   Set IE = CreateObject("InternetExplorer.Application")   IE.Visible = [B5]   IE.Navigate [B1] & [C1] & [D1] & [E1]   BusyWait IE '   For Each Links In IE.Document.Links     NameProp = Links.InnerHtml '     If [B3] = "nameprop" Then       NameProp = Links.NameProp     End If '     If NameProp Like [C3] Then       ActiveSheet.Hyperlinks.Add Anchor:=Cells(Row, "A"), _         Address:=Links.Href, _         TextToDisplay:=Links.Href       Cells(Row, "B") = Links.InnerText       Row = Row + 1     ElseIf Links.InnerText Like [C4] Then        Macro1Loop = True     End If   Next Links '   If [B5] = 1 Then     Stop   End If   IE.Quit   Set IE = Nothing End Function ' Sub BusyWait(IE As Object) '   While IE.Busy Or IE.ReadyState < 4     DoEvents     Sleep 100   Wend End Sub B1 https://okwave.jp/list/new_question/ B2 1 C2 5 D2 1 B3 nameprop C3 q#* C4 次へ > にすればOKWAVEに使えます。単なる遊びですが。

myktk
質問者

補足

ご回答ありがとうございます! 早速、確認させて頂きました。 全て入力して実行したところ、エラーは出ませんでしたが、何も起こりませんでした。 表示をFLASH⇒TRUEに変更したところ、googleのロボットチェックの画面が出ているシーンが一瞬出てきました。 …これ以上は難しいのでしょうか?

  • SI299792
  • ベストアンサー率48% (714/1476)
回答No.1

返事が遅れてすみません。私の勝手な判断で、 100件位できればいいだろうと思い、最後まで見ることは想定していませんでした。色々調べたのですが、このエラーが出ると、しばらく使えないので、調べるのに時間がかかりました。 このエラーの原因は2つ考えられます。 無いページを表示しようとした。 “Excel Vba” の検索結果は 126件位しかなく、13ページ以降を無理に出そうとしたからです。 上記の理由でストッパーを付けませんでした。1番簡単な対策は、B3を 125以下にすることです。時間によって件数が変わるので、実行前に調べる必要があります。 13ページ目を見ると、 「最も的確な検索結果を表示するために、上の 126 件と似たページは除外されています。」と書いてありました。全て検索したい場合、 A4 &filter=0&start= にしてください。そうすれば、 700件位でます。 1度に沢山取ろうとしても、このエラーは出るようです。 Waitを入れるとすればループ内のどこでもいいですが、Nextの上が一番いいでしょう。やってみたけれど効果はありませんでした。Waitを入れても効果はないと思います。 1度に取れる件数は、時間によって違うようです。夜やったら、 300件位可能でしたが、昼は 200件位した取れませんでした。 逃げの方法ですが、このプログラムはB2で最初の位置を指定できます。シートをいくつか用意して、まず B2 0 C2 300 にして実行。時間がたってから、 B2 300 C2 300 にして実行する。今のところこれしかは方法はありません。 ストッパー付きのプログラムは作ったのですか、このエラーが解決しない限り、プログラムを載せても無駄なので載せません。今、対策を考えているので、ここは閉じずにおいていてください。

myktk
質問者

お礼

こんんちは、再びのご回答ありがとうございます! 勝手な判断とは…なんと恐れ多い事をおっしゃいますか。 インターバルを入れるだけでは、解決出来ないのですね。悩ましい。 ちなみに50件を3回連続でも、3回目にはErrorが返ってきました。 少ない数でも、連続で行うとだめでした。 とても勉強になります! ありがとうございます。 お待ちしています。

関連するQ&A

  • VBAで行列を作る方法

    次のようなプログラミングで1,0,-1の要素で作られる3×3行列を全通り調べています。 この場合3の9乗通り調べることができます。 これを4×4や5×5行列など数を大きくして調べたいのですが、このプログラムを配列を使うなどして 簡単にできる方法を教えてください。 よろしくおねがいします。 Sub test() Dim a As Integer '行 Dim b As Integer '列 Dim c As Integer, i As Integer, j As Integer, d As Integer, e As Integer Dim 内積 As Integer, step As Integer Dim f As Integer, g As Integer, h As Integer, l As Integer, m As Integer, n As Integer, k As Integer, x As Integer Dim sum As Integer, total As Integer Dim aa As Integer, aaa As Integer, aaaa As Integer, bb As Integer, bbb As Integer, bbbb As Integer a = 3 '行 b = 3 '列 c = 0 内積 = 0 con = 0 sum = 0 tatal = 0 aa = 0 aaa = 0 aaaa = 0 bb = 0 bbb = 0 bbbb = 0 x = 0 For n = 0 To 2 For m = 0 To 2 For l = 0 To 2 For k = 0 To 2 For h = 0 To 2 For g = 0 To 2 For f = 0 To 2 For e = 0 To 2 For d = 0 To 2 '要素がすべて1 For i = 1 To a For j = 1 To b Cells(i, j) = 1 Next j Next i If bbbb = 1 Then Cells(a - 2, b - 2) = 0 ElseIf bbbb = 2 Then Cells(a - 2, b - 2) = -1 End If If bbb = 1 Then Cells(a - 1, b - 2) = 0 ElseIf bbb = 2 Then Cells(a - 1, b - 2) = -1 End If If bb = 1 Then Cells(a, b - 2) = 0 ElseIf bb = 2 Then Cells(a, b - 2) = -1 End If If aaaa = 1 Then Cells(a - 2, b - 1) = 0 ElseIf aaaa = 2 Then Cells(a - 2, b - 1) = -1 End If If aaa = 1 Then Cells(a - 1, b - 1) = 0 ElseIf aaa = 2 Then Cells(a - 1, b - 1) = -1 End If If aa = 1 Then Cells(a, b - 1) = 0 ElseIf aa = 2 Then Cells(a, b - 1) = -1 End If If total = 1 Then Cells(a - 2, b) = 0 ElseIf total = 2 Then Cells(a - 2, b) = -1 End If If sum = 1 Then Cells(a - 1, b) = 0 ElseIf sum = 2 Then Cells(a - 1, b) = -1 End If If con = 1 Then Cells(a, b) = 0 ElseIf con = 2 Then Cells(a, b) = -1 End If con = con + 1 Next d con = 0 sum = sum + 1 Next e sum = 0 total = total + 1 Next f total = 0 aa = aa + 1 Next g aa= 0 aaa = aaa + 1 Next h aaa = 0 aaaa = aaaa + 1 Next k aaaa = 0 bb = bb + 1 Next l bb = 0 bbb = bbb + 1 Next m bbb = 0 bbbb = bbbb + 1 Next n End Sub

  • VBAでの質問

    お世話になります。 下記の記述で、「←」の矢印の記述で、 Cells.(5,2)がブランクでなければ、 「→」から進めたいのですが、 どの様に記述すれば宜しいでしょうか ご教示お願いします。 Sub 表記入() Dim Data As Range Dim i As Integer Dim j As Integer Dim k As Integer Set Data = Sheets("集計").Range("A2").CurrentRegion j = 16 k = 0 With Sheets("表") For i = 3 To Data.Rows.Count If Data.Cells(i, 51) <> "" Then .Cells(5, 2) = Data.Cells(i, 3)  ← .Cells(5, 7) = Data.Cells(i, 4) → .Cells(j, 2) = Data.Cells(i, 10) .Cells(j, 6) = Data.Cells(i, 11) & Data.Cells(i, 12) .Cells(j, 14) = Data.Cells(i, 51) Else End If k = k + 1 If k = 10 Then j = j + 18 k = 0 Else j = j + 1 End If End If Next i End With End Sub

  • 【至急助けて下さい!!】VBAでのIF関数挿入

    VBA初心者です。上級者の方助けてください。 VBAで入力セルを消去後、IF関数をN列に挿入したいです。 挿入したいIF関数のところが解決できればあとの記述はなんとかなります。 ■挿入したいIF関数 =IF(M4=$Y$5,$Z$9,IF(M4=$Y$6,$Z$9,IF(M4=$Y$7,$Z$9,IF(M4=$Y$8,$Z$6,IF(M4=$Y$9,$Z$10,IF(M4=$Y$10,$Z$9,IF(M4=$Y$14,$Z$7,IF(M4=$Y$15,$Z$8,"")))))))) 他関数は下記構文でうまくいくのですが、 IF関数はどのように記述したらよろしいでしょうか。 ■他 ws.Cells(i, jig_col).Value = "=VLOOKUP(F" & i & ",Sheet1!$A$2:$C$358,2,0)" ■現在の記述 Dim ws As Worksheet Dim endrow As Long Dim endcol As Long Dim you_col As Integer Dim gak_col As Integer Dim jig_col As Integer Dim bc_col As Integer Dim chg_col As Integer Dim i As Long '確認メッセージを表示し、「NO」の場合は処理を行わない If MsgBox("入力されている内容をクリアします。よろしいですか?", vbYesNo) = vbNo Then Exit Sub End If '画面の更新を行わない Application.ScreenUpdating = False Set ws = ThisWorkbook.Sheets("シンフォームイレギュラー運用状況") '呼び出し元シートの最終行、最終列を取得する endrow = ws.Cells(ws.Rows.Count, 6).End(xlUp).Row endcol = ws.Cells.Find(What:="変更フラグ", LookIn:=xlValues, LookAt:=xlWhole).Column - 2 If endrow < 4 Then Exit Sub ws.Range(ws.Cells(4, 1), ws.Cells(endrow, endcol)).ClearContents you_col = ws.Cells.Find(What:="曜日", LookIn:=xlValues, LookAt:=xlWhole).Column gak_col = ws.Cells.Find(What:="学年", LookIn:=xlValues, LookAt:=xlWhole).Column jig_col = ws.Cells.Find(What:="事業所", LookIn:=xlValues, LookAt:=xlWhole).Column 'bc_col = endcol - 1 'chg_col = endcol For i = 4 To endrow ws.Cells(i, you_col).Value = "=B" & i ws.Cells(i, gak_col).Value = "=VLOOKUP(F" & i & ",Sheet1!$A$2:$C$358,3,0)" ws.Cells(i, jig_col).Value = "=VLOOKUP(F" & i & ",Sheet1!$A$2:$C$358,2,0)" 'ws.Cells(i, bc_col).Value = "=IFERROR(MID(H" & i & ",LEN(H" & i & ")-1,1), "")" 'ws.Cells(i, chg_col).Value = 0 ws.Range("W" & i).Value = 0 Next '画面の更新を行う Application.ScreenUpdating = True End Sub

  • 【エクセル】VBAでハイパーリンクそうさ

    VBAでハイパーリンクのマクロを組んでいます。 A列にホームページ名が50行(シートによってまちまち)くらい並んでいて、 B列に、それに対応するURLが記入されています。B列は空白のところがちらほ らあります。 A列に、A列の表示(ホームぺジ名)のまま、B列のURLでハイパーリンクを張りたい です。リンクは貼れたんですが、ホームページ名がどうやれば表示できるかわかり ません。教えてくださいお願いします。 ダメダメですが、一応自分で書けたところまでを載せておきます。 Sub ハイパーリンク() Dim i As Integer Dim j As Integer j = 50 For i = 1 To j Sheets("Sheet1").Select Cells(i , 1).Select ActiveSheet.Hyperlinks.Add Anchor:=Selection, Address:= _ Cells(i , 2), TextToDisplay:="" Next i End Sub としました。

  • Excel  VBAのマクロについて

    以下のようなマクロを作りました。 P4に開始番号P6に終わりの番号があるのですが、P4=P6、つまり、一つだけのシートを作成する分には問題なく動きます。しかしP4に1、P6に5と範囲を増やすとエラーが出て動きません。どこをなおしたらよろしいでしょうか? Option Explicit Sub 一括() Dim I As Worksheet Dim SheetName As String Dim Prompt As String Dim Col As Integer Dim Cell As Range Dim Row As Long Dim hani As Long For hani = Range("P4").Value To Range("P6").Value Set I = ActiveSheet SheetName = Cells(hani + 4, "K").Value & "(" & Cells(hani + 4, "B") & ")" Prompt = SheetName & "が存在します。" Sheets("基本シート").Copy After:=Sheets("基本シート") On Error GoTo 100 ActiveSheet.Name = SheetName On Error GoTo 0 Range("X3") = I.Cells(hani + 4, "B") Range("E8") = I.Cells(hani + 4, "C") Range("A13") = I.Cells(hani + 4, "D") For Col = 0 To 8 Step 4 Set Cell = I.Cells(hani + 4, "D").Offset(, Col) If Cell > 0 Then Prompt = "該当する日付がありません。" & Cell.Address On Error GoTo 100 Row = WorksheetFunction.Match(Cell, [A:A], 0) On Error GoTo 0 Cells(Row, "E") = I.Cells(hani + 4, "E").Offset(, Col) Cells(Row, "H") = I.Cells(hani + 4, "F").Offset(, Col) If Col < 8 Then Cells(Row, "Y") = I.Cells(hani + 4, "G").Offset(, Col) End If End If Next Col Next hani End 100 If Err <> 1004 Then Error Err End End If MsgBox Prompt, vbCritical Application.DisplayAlerts = False ActiveSheet.Delete Application.DisplayAlerts = True Sheets(1).Select End Sub

  • Excel2010VBAの検索の高速化

    Excel2010VBAで、シート1のデータから変数「日時(a)」、「 データ1(a)」、「データ2(a)」、「データ3(a)」、「データ4(a)」、「データ5(a)」に格納し、変数「日時(a)」とシート2の「日時」の行に一致するセルに変数「 データ1(a)」、「データ2(a)」、「データ3(a)」、「データ4(a)」、「データ5(a)」を入力するというプログラムです。 ここで、検索を高速化する方法はあるでしょうか?(セルに関数は使用していません。) A   B   C  D     E         F       年   月  日  時刻  日時       データ1   2011  1  2   23:01  2011.1.2 23:01 1       ~ ~ G     H      I     J データ2  データ3 データ4 データ5 2      3     4     24 ~ ~ Dim a As Long Dim 年(1 To 9999999) As Integer Dim 月(1 To 9999999) As Integer Dim 日(1 To 9999999) As Integer Dim 時刻(1 To 9999999) As Date Dim データ1(1 To 9999999) Dim データ2(1 To 9999999) Dim データ3(1 To 9999999) Dim データ4(1 To 9999999) Dim データ5(1 To 9999999) As Integer Dim 日時(1 To 999999) As String, 範囲 As Range, 範囲文字列 As String, 縦位置 As Long a = 1 With Workbooks("ブック.xlsm").Worksheets("シート1") Do 日時(a) = .Cells(a + 1, 5) データ1(a) = .Cells(a + 1, 6) データ2(a) = .Cells(a + 1, 7) データ3(a) = .Cells(a + 1, 8) データ4(a) = .Cells(a + 1, 9) If .Cells(a + 1, 10) <> "" Then データ5(a) = .Cells(a + 1, 10) End If a = a + 1 Loop Until .Cells(a + 1, 1) = "" End With a = 1 With Workbooks("ブック.xlsm").Worksheets("シート2") Do Set 範囲 = .Range(Cells(2, 5), Cells(Rows.Count, 5)).Find(What:=日時(a), LookIn:=xlValues, lookat:=xlWhole) If Not 範囲 Is Nothing Then 範囲文字列 = 範囲.Address(ReferenceStyle:=xlR1C1) 縦位置 = Mid(範囲文字列, 2, InStr(2, 範囲文字列, "C") - 2) .Cells(縦位置, 6) = データ1(a) .Cells(縦位置, 7) = データ2(a) .Cells(縦位置, 8) = データ3(a) .Cells(縦位置, 9) = データ4(a) If データ5(a) <> 0 Then .Cells(縦位置, 10) = データ5(a) End If End If a = a + 1 Loop Until 日時(a) = "" End With 回答よろしくお願いします。

  • VBAの解説

    お世話になります 値、セルの操作ですが列数等の変更が生じたため変更を求められています。 下記VBA判りやすく説明できる方お願い致します。 Sub Macro1() Dim idxR, idxC, ptr As Integer Dim ws As Worksheet Set ws = ActiveSheet Worksheets.Add after:=ws ptr = 2 With ws .Rows(1).Copy Destination:=Range("A1") For idxR = 2 To .Range("A65536").End(xlUp).Row Cells(ptr, "A").Value = .Cells(idxR, "A").Value For idxC = 2 To 255 Step 2 If .Cells(idxR, idxC) = "" Then Exit For Else .Cells(idxR, idxC).Resize(1, 2).Copy Destination:=Cells(ptr, "B") ptr = ptr + 1 End If Next idxC Next idxR End With End Sub

  • macroについて教えてください

    こんにちは。以前こちらでPrivate SubについてMacroを教えていただきました。(あの後ログインパスワード等が不明になりお礼も出来ませんでしたが。。。回答頂いた方すみませんでした。) 下記がそのMacroですが、今回また少し変えることになり どのように変えていいのか分かりません。 前回は1~5はグレー、6~10は茶色・・・という形にしたのですが 今回は進捗率での管理をしたく、80%以下は白、80~90%は赤、90~100%は青としたいと思っています。 Private Sub Worksheet_Change(ByVal Target As Range) Dim iColors As Variant Dim rw As Long Dim CellCnt As Integer Dim col As Integer Dim col2 As Integer Dim i As Integer Dim j As Integer Dim k As Integer Dim c As Variant Dim ar() As Variant Dim Sh1 As Worksheet Set Sh1 = Worksheets("小児科Dr") col = Target.Cells(1).Column '制限された列 If Not (col = 4 Or col = 8 Or col = 12 Or col = 16) Then Exit Sub iColors = Array(16, 16, 16, 16, 16, 53, 53, 53, 53, 53, 54, 54, 54, 54, 54) CellCnt = Target.Count ReDim ar(CellCnt - 1) For Each c In Target If c.Value <> "" Then If IsNumeric(c.Value) Then i = c.Value If i >= 11 Then i = 10 End If If i > 0 And i < 11 Then j = iColors(i - 1) Else j = 2 End If ar(k) = j k = k + 1 End If End If Next c rw = Target.Row Select Case col Case 4: col2 = 2 Case 8: col2 = 8 Case 12: col2 = 14 Case 16: col2 = 20 'Sh1.Cells(rw + 2, 13).Resize(Int(Target.Count / 3), 3).Interior.ColorIndex = j End Select InsideColors Sh1, rw, col2, CellCnt, ar() Set Sh1 = Nothing End Sub Private Sub InsideColors(sh As Worksheet, _ rw As Long, _ col As Integer, _ cnt As Integer, _ ar As Variant) 'sh[シート],rw[行], col[列],cnt[セル個数],iColor[色指数] Dim i As Integer Dim j As Integer Dim n As Integer Dim k As Integer If cnt Mod 5 > 0 Then '範囲行数 i = (cnt + 5 - (cnt Mod 5)) / 5 Else i = cnt / 5 End If rw = Int((rw - 1) / 5) + 1 '行再設定 j = ((rw - 1) Mod 5) + 1 '列設定 For n = j To cnt sh.Cells(rw + 2, col).Resize(i, 5).Cells(n).Interior.ColorIndex = ar(k) k = k + 1 Next n End Sub 毎回他の人を頼ってしまい、申し訳ないのですがお願いします。 また、前回分からなかったので1~5を指定するときに5回同じカラー番号を書いたのですがこちらも良かったら手直し方法を教えていただければ助かります。 宜しくお願いします。

  • ExcelにおけるVBAで、データの振り分けをしたい

    Sub a() Dim i As Long Dim s As Long Dim b As Worksheet Dim c As Worksheet Dim maxi As Long Dim maxs As Long Application.ScreenUpdating = False With ThisWorkbook Set b = .Worksheets("bbb") Set c = .Worksheets("ccc") End With maxi = b.Range("A1").CurrentRegion.Rows.Count maxs = c.Range("A1").CurrentRegion.Rows.Count For i = maxi To 2 Step -1 For s = maxs To 2 Step -1 If c.Cells(s, 1) = b.Cells(i, 1) And c.Cells(s, 2) = b.Cells(i, 2) Then c.Cells(s, 14) = b.Cells(i, 3) End If Next s Next i Application.ScreenUpdating = True End Sub ワークシートcとワークシートbの1列目と2列目が一致したときにだけ、cの14列目にbの3列目のデータを代入したく思い、以上のようなコードを書きましたが、重くて終わる様子がありません。 ・そもそもあっているのか、あっていないならどこを修正すればよいか ・早く終わるようにするにはどうしたらいいか アドバイスをよろしくお願いします。

  • このVBAソースのどこが間違ってるか教えてください

    Dim csp As Integer 'ストップ Dim css As Integer 'ストップorスタート Sub Quest2() If css = 0 Then css = 1 Quest2a Else cstp = 1 css = 0 End If End Sub Sub Quest2a() Sheets("Sheet1").Select Range("B1:J10").Select Selection.Interior.ColorIndex = x1None Range("a1").Select cstp = 0 Do r = 1: c = 5 For i = 0 To 15 If i < 9 Then Cells(r, c).Interior.ColorIndex = x1None r = r + 1 If i < 5 Then c = c + 1 Else c = c - 1 End If Cells(r, c).Interior.ColorIndex = 3 Else Cells(r, c).Interior.ColorIndex = x1None r = r - 1 If i < 13 Then c = c - 1 Else c = c + 1 End If Cells().Interior.ColorIndex = 3 End If 'タイミング For tm1 = 1 To 1000: For tm2 = 1 To 100: Next If cstp = 1 Then Exit For End If Next DoEvents If cstp = 1 Then Exit For End If If r = 3 And c = 5 Then Cells(r, c).Interior.ColorIndex = x1None End If Next DoEvents If cstp = 1 Then Exit Do End If Loop Cells(10, 9) = Cells(r, c) Cells(10, 9).Interior.ColorIndex = 8 End Sub

専門家に質問してみよう