エクセルVBAで「Web未接続」を取得する方法

このQ&Aのポイント
  • エクセルVBAを使用して、WebAPIを利用して「Web未接続」の状態を取得する方法について教えてください。
  • 特定のマクロを実行した場合に、ネットに接続されていない場合に「ネットに未接続です」という警告を表示する方法を知りたいです。
  • ネットに接続していないことを判定する方法について詳細を教えてください。
回答を見る
  • ベストアンサー

エクセルVBAで「Web未接続」を取得したい。

エクセルVBAで以下のようにWebAPIの助けを借りています。 しかしこれはたぶんネットに接続してなければ使えないのだと思います。 質問は、このマクロを作動させたとき、ネットに接続してなければ「ネットに未接続です」という警告を出したいのです。 しかし、ネットに接続してないことをどう取得すればよいのかわかりません。ご教示ください。 Sub ボタン1_Click() Dim objXMLHttp As Object, zipArr Dim yubinNo As Long Dim line As String Dim splitLine() As String Dim i As Long i = 2 '行番号 Do While Cells(i, 1).Value <> "" '入力値からハイフンの削除 yubinNo = Replace(Worksheets("Sheet1").Cells(i, 1).Value, "-", "") Set objXMLHttp = CreateObject("MSXML2.XMLHTTP") objXMLHttp.Open "GET", "http://zip.cgis.biz/csv/zip.php?zn=" & yubinNo, False objXMLHttp.Send line = Replace(objXMLHttp.responseText, vbLf, ",") '改行削除 line = Replace(line, """", "") 'クォート削除 line = Replace(line, "none", "") 'noneの文字列削除(情報がない場合、noneのため) splitLine = Split(line, ",") 'CSVを配列へ格納 Worksheets("Sheet1").Cells(i, 2).Value = splitLine(13) & splitLine(14) & splitLine(15) & splitLine(16) Worksheets("Sheet1").Cells(i, 3).Value = splitLine(9) & splitLine(10) & splitLine(11) & splitLine(12) i = i + 1 Loop End Sub

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

  • ベストアンサー
  • kkkkkm
  • ベストアンサー率65% (1617/2456)
回答No.7

> 接続できてもサービス一時停止等かどうかを取得する方法はありますか? objXMLHttp.Open "GET", "http://zip.cgis.biz/csv/zip.php?zn=" & yubinNo, False objXMLHttp.Send を実行してエラーもしくは通常と違う情報が返ってくると停止中と思ったのですが、実際停止してないとテストできないので確信はありません。 ただ、No.1でも記載したようにオンラインで一度成功すると、同じ番号だとそのままオフラインにしてもブックを開き直さないとエラーにならないという理由が分からないのでエラーは別にして、何かしら違う情報が返ってくると考えていいのではないでしょうか。 「サービスは停止中です」とか、検索した番号が返ってきた情報には入ってないとか。 > 存在しない番号の場合の対応はどうすればよいのでしょうか? ちょっと試したところ、番号が存在するかしないかによって.responseTextの情報量(住所情報の有無)に差がありましたので UBound(splitLine) の結果で振分ができると思います。

emaxemax
質問者

お礼

ありがとうございます。 すみません、週明けから寝込んでしまいお礼が遅くなりました。とても勉強になりました。

その他の回答 (10)

  • kkkkkm
  • ベストアンサー率65% (1617/2456)
回答No.11

No.10の訂正です。 Int((9999900 - 1111112) * Rnd + 1111111) と Int((9999999 - 1111112) * Rnd + 1111111) なんかおかしい。なぜこんなことになったのか(夜明けで寝ぼけてた) Int((9999999 - 1111110) * Rnd + 1111111) にしてください。

emaxemax
質問者

お礼

ありがとうございます。

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

夜が明けたのでテストしてみました。以下でいけるのではないでしょうか。 Sub ボタン1_Click() Dim objXMLHttp As Object, zipArr Dim yubinNo As Long Dim line As String Dim splitLine() As String Dim i As Long Static mDummy As Long Dim Temp As Long Randomize Temp = Int((9999900 - 1111112) * Rnd + 1111111) '万が一の為もし前回と同じ乱数が出た場合再度乱数発生 If mDummy = Temp Then mDummy = Int((9999999 - 1111112) * Rnd + 1111111) Else mDummy = Temp End If Set objXMLHttp = CreateObject("MSXML2.XMLHTTP") On Error GoTo ErrorExit objXMLHttp.Open "GET", "http://zip.cgis.biz/csv/zip.php?zn=" & mDummy, False objXMLHttp.Send On Error GoTo 0 '停止してると検索対象の番号がresponseTextに入っていないと思うので If InStr(objXMLHttp.responseText, mDummy) < 1 Then MsgBox "郵便番号検索システムが停止している可能性があります", vbInformation Exit Sub End If i = 2 '行番号 Do While Cells(i, 1).Value <> "" '入力値からハイフンの削除 中略 Loop Set objXMLHttp = Nothing Exit Sub ErrorExit: If Call_CheckPing("www.google.co.jp") = False Then ' 回答No.3のpingを利用 MsgBox "インターネット接続がありません" & vbCrLf & vbCrLf & _ "通知領域(タスクトレイ)のネットワークアイコンで確認してください", vbInformation Else MsgBox "郵便番号検索サーバから応答がありません", vbInformation End If Set objXMLHttp = Nothing End Sub

emaxemax
質問者

お礼

何度もありがとうございます。

  • kkkkkm
  • ベストアンサー率65% (1617/2456)
回答No.9

オンラインで一度成功すると、同じ番号だとそのままオフラインにしてもブックを開き直さないとエラーにならない 毎回7桁の乱数で検索したら、同じ番号での検索にならないので、上記の問題は解決して、No.1の方法でオフラインやサービス停止を認識出来そうです テストは夜が明けてからやってみます

emaxemax
質問者

お礼

ありがとうございます。

  • kkkkkm
  • ベストアンサー率65% (1617/2456)
回答No.8

あと、余計なお世話だと思いますが ループ中にオフラインになったりサーバがおかしくなった場合は、番号が変わるのでエラーになると思います。 On Error GoTo ErrorExit objXMLHttpTest.Open "GET", "http://zip.cgis.biz/csv/zip.php?zn=" & yubinNo, False objXMLHttpTest.Send On Error GoTo 0 で中断して(中断する場合は、最初のオンラインかどうかのチェックはいらなくなります) ErrorExit: Dim P1 As Boolean P1 = Call_CheckPing("www.google.co.jp") 'Pingで調査 P1の結果でオフラインになった為かどうかメッセージを出すか On Error Resume Next でエラーを無視して続けるかの処置が必要だと思います。

emaxemax
質問者

お礼

ご丁寧にありがとうございました。

  • HohoPapa
  • ベストアンサー率65% (454/690)
回答No.6

泥臭く、 Yahooと日本銀行の双方のサイトに接続できな場合に インターネットの異常と判断するようにしてしてみました。 また、郵便番号がヒットしない場合の対応を組み込んでみました。 Sub sample()   Dim objXMLHttp As Object, zipArr   Dim yubinNo As Long   Dim line As String   Dim splitLine() As String   Dim i As Long   i = 2 '行番号       If ((isnetready("https://www.yahoo.jp/") = False) And _    (isnetready("https://www.boj.or.jp/") = False)) Then    MsgBox "インターネット環境が異常です"    Exit Sub   ElseIf isnetready("http://zip.cgis.biz/") = False Then    MsgBox "郵便番号検索サイトに接続できません"    Exit Sub   End If           Do While Cells(i, 1).Value <> ""  '入力値からハイフンの削除     yubinNo = Replace(Worksheets("Sheet1").Cells(i, 1).Value, "-", "")          Set objXMLHttp = CreateObject("MSXML2.XMLHTTP")     objXMLHttp.Open "GET", "http://zip.cgis.biz/csv/zip.php?zn=" & yubinNo, False     objXMLHttp.send          line = Replace(objXMLHttp.responseText, vbLf, ",")  '改行削除     line = Replace(line, """", "")  'クォート削除     line = Replace(line, "none", "")  'noneの文字列削除(情報がない場合、noneのため)          splitLine = Split(line, ",")  'CSVを配列へ格納          Debug.Print line          If UBound(splitLine) > 16 Then       Worksheets("Sheet1").Cells(i, 2).Value = splitLine(13) & splitLine(14) & splitLine(15) & splitLine(16)       Worksheets("Sheet1").Cells(i, 3).Value = splitLine(9) & splitLine(10) & splitLine(11) & splitLine(12)     Else        MsgBox "郵便番号がヒットしない:" & yubinNo     End If     i = i + 1   Loop    End Sub Function isnetready(tgHostName As String) As Boolean   Dim objXML As New MSHTML.HTMLDocument   Dim htmlDoc As New MSHTML.HTMLDocument   Dim objITEM As Object   Dim starttime As Date   Dim CheckText As String   Set htmlDoc = objXML.createDocumentFromUrl(tgHostName, vbNullString)      starttime = Now()   Do Until htmlDoc.readyState = "complete"     DoEvents     If Now() > DateAdd("S", 10, starttime) Then       Exit Do     End If   Loop   DoEvents   CheckText = ""   For Each objITEM In htmlDoc.getElementsByTagName("title")     CheckText = CheckText & objITEM.innerText   Next   Set objITEM = Nothing   Set htmlDoc = Nothing   Set objXML = Nothing      If CheckText = "" Then    isnetready = False   Else    isnetready = True   End If End Function

emaxemax
質問者

お礼

ありがとうございます。 すみません、週明けから寝込んでしまいお礼が遅くなりました。とても勉強になりました。

  • kkkkkm
  • ベストアンサー率65% (1617/2456)
回答No.5

No.1、No.3の補足です。 思うのですが、ネット接続が出来ていて、Pingなどでサーバの稼働が確認できたとしても objXMLHttp.Open "GET", "http://zip.cgis.biz/csv/zip.php?zn=" & yubinNo, False が成功しなければ意味がないのではないでしょうか。サーバアクセス確認だけではサービス一時停止とか分からないと思います。 また、現状では製作途中なので手を付けていないのだと思いますが、間違った郵便番号を検索すると最後の方でエラーになると思いますので対処が必要な気もします

emaxemax
質問者

お礼

>サーバアクセス確認だけではサービス一時停止とか分からないと思います。 確かにその通りですね。ネット接続が出来てないのは先ほどので取得できますが、接続できてもサービス一時停止等かどうかを取得する方法はありますか? また、入力された郵便番号が桁誤りや数値でない場合などは入力時にチェックする予定ですが、存在しない番号の場合の対応はどうすればよいのでしょうか?

  • HohoPapa
  • ベストアンサー率65% (454/690)
回答No.4

判定タイミングを最初にすべきでしたので、コードを修正します。 なお、 >ネットに接続してなければ これをどう解釈すればいいののかにより、コードが異なってきましょう。 つまり、 "http://zip.cgis.biz/" このサイトが停止している場合とインターネットそのものの接続ができない場合を 区別する必要があるのか? ということです。 先に示したコードは、これを区別せず、 単に、 "http://zip.cgis.biz/" に接続できるか? をチェックしているコードです。 Sub ボタン1_Click()   Dim objXMLHttp As Object, zipArr   Dim yubinNo As Long   Dim line As String   Dim splitLine() As String   Dim i As Long   i = 2 '行番号   If isnetready = False Then     MsgBox "ネットに未接続です"     Exit Sub   End If   Do While Cells(i, 1).Value <> ""  '入力値からハイフンの削除     yubinNo = Replace(Worksheets("Sheet1").Cells(i, 1).Value, "-", "")      ~以下省略~ End Sub

emaxemax
質問者

お礼

> このサイトが停止している場合とインターネットそのものの接続ができない場合を区別する必要があるのか? なるほど。考えていませんでしたがたしかに区別できたほうがいいですねえ!

  • kkkkkm
  • ベストアンサー率65% (1617/2456)
回答No.3

No.1の追加です。 pingで接続確認もあると思います。 サーバーやホストにPingが通るかチェックするサンプルコード https://vba-create.jp/vba-tips-ping-true-or-false/ どちらにしても、サーバーに接続できるかどうかのチェックですので 動作が単純な方法がいいのではないでしょうか。

emaxemax
質問者

お礼

ありがとうございます。とていいやりかたを教えていただきました。 助かりました!

  • HohoPapa
  • ベストアンサー率65% (454/690)
回答No.2

後記のような関数を仕込んで判定させるのはいかがでしょうか なお承知かもしれませんが、Microsoft HTML Object Libraryを参照設定する必要があります。 Sub ボタン1_Click()   Dim objXMLHttp As Object, zipArr   Dim yubinNo As Long   Dim line As String   Dim splitLine() As String   Dim i As Long   i = 2 '行番号   Do While Cells(i, 1).Value <> ""  '入力値からハイフンの削除     yubinNo = Replace(Worksheets("Sheet1").Cells(i, 1).Value, "-", "")   If isnetready = False Then     MsgBox "ネットに未接続です"     Exit Sub   End If      ~以下省略~ End Sub Function isnetready() As Boolean   Dim objXML As New MSHTML.HTMLDocument   Dim htmlDoc As New MSHTML.HTMLDocument   Dim objITEM As Object   Dim starttime As Date   Dim CheckText As String      Set htmlDoc = objXML.createDocumentFromUrl("http://zip.cgis.biz/", vbNullString)  ' 以下のようにYahooや国税庁のサイトでもいいかも  ' Set htmlDoc = objXML.createDocumentFromUrl("https://www.yahoo.jp/", vbNullString)  ' Set htmlDoc = objXML.createDocumentFromUrl("https://www.nta.go.jp/", vbNullString)      starttime = Now()   Do Until htmlDoc.readyState = "complete"     DoEvents     If Now() > DateAdd("S", 10, starttime) Then       Exit Do     End If   Loop   DoEvents   CheckText = ""   For Each objITEM In htmlDoc.getElementsByTagName("title")     CheckText = CheckText & objITEM.innerText   Next   Set objITEM = Nothing   Set htmlDoc = Nothing   Set objXML = Nothing      If CheckText = "" Then    isnetready = False   Else    isnetready = True   End If    End Function

emaxemax
質問者

お礼

ありがとうございます。 Microsoft HTML Object Libraryを参照設定してうまくいきました。

  • kkkkkm
  • ベストアンサー率65% (1617/2456)
回答No.1

一度実際に存在する郵便番号でやってみてエラーになったら未接続と考えるのはいかがでしょう。 ただ、一度成功するとその後切れても同じ郵便番号だと再移動しないとエラーにならない。 略 Dim i As Long i = 2 '行番号 Set objXMLHttp = CreateObject("MSXML2.XMLHTTP") yubinNo = "1638001" '東京都庁 On Error GoTo ErrorExit objXMLHttp.Open "GET", "http://zip.cgis.biz/csv/zip.php?zn=" & yubinNo, False objXMLHttp.Send On Error GoTo 0 Do While Cells(i, 1).Value <> "" 中略 Loop Set objXMLHttp = Nothing Exit Sub ErrorExit: Set objXMLHttp = Nothing MsgBox "Error" End Sub

emaxemax
質問者

お礼

ありがとうございます。でも >一度成功するとその後切れても同じ郵便番号だと ではちと困りますね。

関連するQ&A

  • エクセル関数をVBAでやりたい

    IFERROR(INDEX(***,MATCH(***)),"")この式を下記マクロに組み込むことは、可能でしょうか? Sub Macro1() ' Dim line3 As Integer Dim line5 As Integer line5 = 2  '初期値を2行目に設定してます Do While Worksheets("Sheet5").Cells(line5, 1).Value > 0 'sheet5の通し番号をsheet3のH列から検索して、その行数をline3に代入する。   line3 = Worksheets("Sheet3").Range("H:H").Find(what:=Worksheets("Sheet5").Cells(line5, 8)).Row 'A,B列内容のコピー   Worksheets("Sheet5").Range("A" & line5, "B" & line5).Copy Worksheets("Sheet3").Cells(line3, 1) 'D~G列内容のコピー   Worksheets("Sheet5").Range("D" & line5, "G" & line5).Copy Worksheets("Sheet3").Cells(line3, 4)   line5 = line5 + 1    '次の行へ Loop   ( http://soudan1.biglobe.ne.jp/qa8921867.html )

  • エクセル2019 VBAについて

    エクセル2019でVBAを使いコピーペーストの勉強中です、次の箇所(Dim i As integr)で、ユーザー定義型は定義されていませんと指摘されて止まってしまします、Sheet("データ")には3行のデータは入っています、VBA初心者のため、この後が、なかなか前に進めません、どうかよろしくおねがいします。 ********************************** Sub 練習() Dim s1 As Worksheet: Set s1 = Worksheets("請求書") Dim s2 As Worksheet: Set s2 = Worksheets("データ") Dim r1 As Integer: r1 = 18 Dim r2 As Integer: r2 = 2 { Dim i As integr } For i = 0 To 2 s1.Range(s1.Cells(r1 + i, 1), s1.Cells(r1 + i, 3)).Value = s2.Range(s2.Cells(r2 + i, 2), s2.Cells(r2 + i, 4)).Value s1.Cells(r1 + i, 4).Value = s1.sells(r1 + i, 2).Value * s1.Cells(r1 + i, 3).Value Next End Sub ***************************************

  • Excel VBA; 複数のループ処理

    ↓のようなコードがあります。 Dim i As Long, MaxRow1 As Long, MaxRow2 As Long MaxRow1 = Worksheets("Sheet1").Cells(Rows.Count, 1).End(xlUp).Row MaxRow2 = Worksheets("Sheet2").Cells(Rows.Count, 1).End(xlUp).Row For i = 1 To MaxRow1 Worksheets("Sheet1").Cells(i, 1).Value = i . Next i For i = 1 To MaxRow2 Worksheets("Sheet2").Cells(i, 1).Value = i . Next i これらを最大行の多いシートに合わせて、パフォーマンスを良くしたいと思います。 同様の処理をシート1、シート2で実施しているので纏めて記述したいです。 シート1、シート2に対する処理をサブルーチンにする方法しかありませんか? どなたかお願いします。 If MaxRow1 >= MaxRow2 Then For i = 1 To MaxRow1 Else For i = 1 To MaxRow2 End If Worksheets("Sheet1").Cells(i, 1).Value = i Worksheets("Sheet2").Cells(i, 1).Value = i . Next i

  • Excel VBAで検索する

    Excel VBAで、Sheet1に貼り付けたテキスト内から Sheet2に記載した(1列ごとの)キーワードを検索し キーワードが含まれている行をSheet3に貼り付ける処理をしているのですが、始めたばかりなので上手くいきません。 下記がソースです。 Dim moji As String Dim word As String Dim result As Integer For i = 3 To 103 For j = 2 To 21 moji = ThisWorkbook.Worksheets("Sheet1").Cells (i, 1).Value word = ThisWorkbook.Worksheets("Sheet2").Cells (j, 2).Value result = InStr(moji, word) If doResult <> 0 Then For k = 1 To 100 ThisWorkbook.Worksheets("Sheet3").Cells (k, 1).Value= moji Next k End If Next j Next i このソースでは上手くいかないのですが、どこがダメなのか分からないので、解決の糸口がつかめません。 アドバイスなどお願いします。

  • ExcelのVBAの配列に関する質問です。

    ExcelのVBAの配列に関する質問です。 sheet1のデータをsheet2に表示するVBAを作成しています。。 sheet1のデータは7行目からスタートし、sheet2のデータは26行目からスタートしています。。 sheet1とsheet2の列は同じ並びではないため、それぞれのシートの列番号をCellsを用いて指定しています。 Sub test1() Dim endrow As Long endrow = Worksheets("sheet1").Range("A65536").End(xlUp).Row Dim i As Long Dim j As Long For i = 7 To endrow j = i + 19 Worksheets("sheet2").Cells(j, 1) = Worksheets("sheet1").Cells(i, 2) Worksheets("sheet2").Cells(j, 8) = Worksheets("sheet1").Cells(i, 28) Worksheets("sheet2").Cells(j, 9) = Worksheets("sheet1").Cells(i, 31) Worksheets("sheet2").Cells(j, 10) = Worksheets("sheet1").Cells(i, 32) ・ ・ ・ ※長いので省略 Next i End Sub 上記のtest1は正常に動くのですが、データ量が多いため、処理に時間がかかってしまいます。 高速化できないかと、以下のように変更しました。 Sub test2() Dim dataRange1 As Variant Dim dataRange2 As Variant dataRange1 = Worksheets("sheet1").Range("A1:GI10006") dataRange2 = Worksheets("sheet2").Range("A1:DZ10018") Dim endrow As Long endrow = Worksheets("sheet1").Range("A65536").End(xlUp).Row Dim i As Long Dim j As Long For i = 7 To endrow j = i + 19 dataRange2(j, 1) = dataRange1(i, 2) dataRange2(j, 8) = dataRange1(i, 28) dataRange2(j, 9) = dataRange1(i, 31) dataRange2(j, 10) = dataRange1(i, 32) ・ ・ ・ ※長いので省略 Next i End Sub test2は、エラーメッセージ等は表示されませんが、sheet2にデータが表示されません。 ちなみに、以下のようにsheet1のみ配列化した場合は、正常に表示されました。 Worksheets("sheet2").Cells(j, 1) = dataRange1(i, 2) Worksheets("sheet2").Cells(j, 8) = dataRange1(i, 28) Worksheets("sheet2").Cells(j, 9) = dataRange1(i, 31) Worksheets("sheet2").Cells(j, 10) = dataRange1(i, 32) test2は、どこが間違っているのでしょうか? ご教示ください。 よろしくお願いいたします。

  • ExcelのVBAについて質問です。Excelは2003です。

    ExcelのVBAについて質問です。Excelは2003です。 コマンドボタン1で下記のプログラムを実行するようにしています。 Sub Macro1() ' ' Macro1 Macro ' ' Dim iRows As Integer Dim sRows As String Dim i As Integer For i = 1 To 100 Application.Wait Now + TimeValue("00:00:05") ' 最終行の調査: iRows = Worksheets("Sheet1").UsedRange.Rows.Count ' 最終行をシート3にコピー Worksheets("Sheet1").Rows(iRows).Copy Destination:=Worksheets("Sheet4").Range("1:1") ' CH1 の最新データをシート3にコピー Worksheets("Sheet3").Range("B9").Value = Worksheets("Sheet1").Cells(iRows, 3).Value ' CH2 の最新データをシート3にコピー Worksheets("Sheet3").Range("C9").Value = Worksheets("Sheet1").Cells(iRows, 4).Value Next i End Sub これをコマンドボタン2で途中でも強制的に終了するようにしたいのですがコマンドボタン2にはどのようなプログラムを入れればいいでしょうか?

  • ExcelのVBAについて

    こんにちは、VBA初心者です。 C:\pictureの中に以下のファイルがあります。 DSC_0134.JPG~DSC_0154.JPG これらのファイルをExcelのA列1~20行に書かれた文字△○%&◎~▲▽%%★に.JPGをつけて保存したくて以下のコードを書きました。 Dim buf As String Dim msg As String Dim i As Integer Dim A As Variant i = 1 buf = Dir("dsc*.jpg", vbNormal) Do While buf <> "" Do While i < 21 buf = Dir() msg = buf 'msg=元の名前 A = Worksheets("sheet1").Cells(i, 1).Value     Worksheets("sheet1").Cells(i, 2).Value = msg          Name "C:\picture\msg" As "C:\picture\A.jpg"     i = i + 1 Loop Loop Name "C:\picture\msg" As "C:\picture\A.jpg"のところで、「ファイルがありません。」となってしまいます。 あと、Worksheets("sheet1").Cells(i, 2).Value = msgのところで、\pictureの中の最初のファイル(DSC_0134.JPG)を表示しません。 どこを直せばよいのでしょうか?

  • エクセルVBAについて

    前回質問させていただきました件の追加機能になります。以前質問させていただきましたマクロが下記のものです。 Sub TESTa() Dim A As Long Dim B As Long Dim C As Long Dim D As Long Dim E As Long Dim F As Long '表の行数を調べる A = Worksheets("sheet1").Range("C65536").End(xlUp).Row - 1 For C = 1 To A For B = 4 To 7 'Sheet1のデータをSheet2に複写する Worksheets("Sheet2").Cells(B - 3 + D, 15) = Worksheets("Sheet1").Cells(C + 1, 1) Worksheets("Sheet2").Cells(B - 3 + D, 6) = Worksheets("Sheet1").Cells(C + 1, B) Worksheets("Sheet2").Cells(B - 3 + D, 14) = Worksheets("Sheet1").Cells(C + 1, 3) Worksheets("Sheet2").Cells(B - 3 + D, 10) = Worksheets("Sheet1").Cells(1, B) Worksheets("Sheet2").Cells(B - 3 + D, 13) = Worksheets("Sheet1").Cells(C + 1, 2) Next D = C * 4 Next 'Sheet2の表の行数を調べる Sheets("Sheet2").Select E = Worksheets("sheet2").Range("F65536").End(xlUp).Row '0欄の確認 For F = E To 1 Step -1 If Worksheets("Sheet2").Cells(F, 6) = 0 Then '0の場合は行を削除する Cells(F, 1).EntireRow.Delete End If Next End Sub カウントするとデータ個数がSheet1で約120件になりSheet2においては、4倍になりますので約480件になります。 そこで Sheet1において12件ごとに、Sheet2,3,4...としたいのです。 Sh1 NO.1~12がSheet2 Sh1 NO.13~24がSheet3 ... 10枚のシートにしたいのですが、このマクロにどのような命令を加えればよろしいでしょうか? お手数ですがよろしくお願いいたします。

  • VBA 初心者

    sheet1から、sheet2データを検索して抽出する練習をしているのですがerror"1104"が表示されます、なぜなのか分からないので投稿しました、よろしくお願いします。 sub test() dim sh1 as worksheets dim sh2 as worksheets dim  i  as  integer set sh1 = thisworkbook.worksheets("sheet1!") set sh2 = thisworkbook.worksheets("sheet2!") b = userform1.textbox1 for i = 1 to 10 sh1 .cells(i,2) = b b = b+1 x = sh1.cells(1,2) sh1.cells(i,3).value = worksheetfunction.vlookup(x,sh2.range("a1:d500"),2,false) next i end sub

  • VBA エクセル 合計

    皆様、こんにちは。 それぞれの値が入っている会計シート(シートの形式は同じ)を一つの合計シートに合計しようとしていますが、うまくいきません。具体的に、数値の合計ができません。 例えば、ある項目に対して、シートAに100が入力され、シートBには230が入力されているとすれば、合計シートに100+230=330を入力したいです。なお、全ての会計シートは"Form"というエクセルシートにあり、その数をユーザが決めますので、検索しなければいけません。そして、合計シートは"Result"にあります。 以下のように書いてみましたが、間違っているようです。 Worksheets("Result").Activate Dim SR As Integer Dim SC As Integer 'SR is start row 'SC is start column SR = 6 SC = 2 Worksheets("Form").Activate Dim i As Integer i = 68 Do While 1 = 1 If Selection.Cells(i, 4).Value = "" Then Exit Do End If i = i + 49 Loop Sum = 0 Sum = Sum + Selection.Cells(i, 4) Worksheets("Result").Activate Cells(SR + 5, SC + 2) = Sum 詳しい方に教えていただければ非常に助かります。 どうぞよろしくお願いします。

専門家に質問してみよう