質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.58%

「オブジェクト変数または with ブロック変数が設定されていません」となってしまいます。

受付中

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 3,871

score 22

コードが完成しました。
シートに作った【開始ボタン】からはエラーなく、処理ができるのですが、、、
Microsoft Visual Vasic for Applicationsの「▶」ボタンからでは、
【オブジェクト変数または with ブロック変数が設定されていません】となってエラーになり、処理ができません。

上記文言で色々と解決方法を探ったのですが、難しくて、理解ができません。
また、エラーが起きた際に出る黄色のマークもこの場合は出ないので、どこがいけないのかも検討もつかず、困っています。

もし分かりましたらご教授頂けますと幸いです。

Option Explicit
'グローバル宣言-------------------------------
Public i As Long
Public j As Long

Public ss As String
Public sss As String
Public str As String
Public msg As String
Public fileName As String

Public wb As Workbook
Public ws As Worksheet
Public Ws_list00  As Worksheet
Public Ws_list01  As Worksheet
Public Ws_list02  As Worksheet


Sub All()
  Application.ScreenUpdating = False

 'バックアップを取る
   Set wb = Workbooks.Open(ThisWorkbook.Path & "\表.xlsx")
    fileName = ThisWorkbook.Path & "/バックアップ/" & _
       "表_バックアップ" & Format(Now(), "yyyy-mm-dd-hh-mm-ss") & ":バックアップ" & ".xlsx"
   wb.SaveAs fileName
    wb.Close


'作業をする
   Workbooks.Open ThisWorkbook.Path & "\表.xlsx"
   Workbooks.Open ThisWorkbook.Path & "\list01.csv"
   Workbooks.Open ThisWorkbook.Path & "\list02.csv"
   Set Ws_list02 = Workbooks("list02.csv").Worksheets("list02")
   Set Ws_list01 = Workbooks("list01.csv").Worksheets("list01")
   Set Ws_list00 = Workbooks("表.xlsx").Worksheets("sheet1")
   Call Sheet2.list01_works
   Call Sheet2.list02_works

   'ブックを閉じる
   Application.DisplayAlerts = False
   Workbooks("表1.csv").Close
   Workbooks("表2.csv").Close
   Workbooks("表.xlsx").Save
   Application.DisplayAlerts = True
  End Sub

別のシート(Sheet2)

Option Explicit
'グローバル宣言-------------------------------
Public i As Long
Public j As Long

Public ss As String
Public sss As String
Public str As String
Public msg As String
Public fileName As String

Public wb As Workbook
Public ws As Worksheet
Public Ws_list00  As Worksheet
Public Ws_list01  As Worksheet
Public Ws_list02  As Worksheet


'list01_works
Sub list01_works()
  Application.ScreenUpdating = False


 '作業をする
   Workbooks.Open ThisWorkbook.Path & "\表.xlsx"
   Workbooks.Open ThisWorkbook.Path & "\list01_works.csv"
   Set Ws_list01 = Workbooks("list01_works.csv").Worksheets("list01_works")
   Set Ws_list00 = Workbooks("表.xlsx").Worksheets("sheet01")
   Call list01

  'ブックを閉じる
   Application.DisplayAlerts = False
   Workbooks("list01_works.csv").Close
   Workbooks("表.xlsx").Save
   Workbooks("表.xlsx").Close
   Application.DisplayAlerts = True

  Application.ScreenUpdating = True
End Sub




'list02_works
Sub list02_works()
  Application.ScreenUpdating = False

 '作業をする
   Workbooks.Open ThisWorkbook.Path & "\表.xlsx"
   Workbooks.Open ThisWorkbook.Path & "\list02.csv"
   Set Ws_list02 = Workbooks("list02.csv").Worksheets("list02")
   Set Ws_list00 = Workbooks("表.xlsx").Worksheets("sheet01")
   Call list02

 'ブックを閉じる
   Application.DisplayAlerts = False
   Workbooks("list02.csv").Close
   Workbooks("表.xlsx").Save
   Workbooks("表.xlsx").Close
   Application.DisplayAlerts = True

  Application.ScreenUpdating = True
End Sub








'list01
Sub list01()


        For i = 50 To 785
        For j = 1 To Ws_list01.Range("A" & Rows.Count).End(xlUp).Row

                                                              sss = Ws_list00.Range("V" & i).Value  ' 確認用
                                                              ss = Ws_list01.Range("A" & j).Value   ' 確認用
        If Ws_list00.Range("V" & i).Value = _
        Ws_Ws_list01.Range("A" & j).Value Then


         Ws_list01.Range("B" & j).Copy
         Ws_list00.Range("W" & i).PasteSpecial _
                            Paste:=xlPasteValues, _
                            Operation:=xlNone, _
                            SkipBlanks:=False, _
                            Transpose:=False



                Exit For
            End If
        Next j
    Next i

End Sub
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • otn

    2020/02/12 21:07

    エラーメッセージを全文載せてください。
    あと、コードが見づらいので、無意味な空行を削除してください。

    キャンセル

  • sinzou

    2020/02/12 21:48

    Sub All() と
    別のシート(Sheet2) は
    同じ .xlsmファイルですか?

    Workbooks.Openが多いような

    キャンセル

回答 3

0

グローバルな変数を使用する一例>>

標準モジュール

Option Explicit

Public gWbk表 As Workbook
Public gWbkList01 As Workbook
Public gWbkList02 As Workbook


Public Sub GetMyObject()
    Dim s As String
    With ThisWorkbook
        Set gWbk表 = Workbooks.Open(.Path & "\表.xlsx")
        Set gWbkList01 = Workbooks.Open(.Path & "\List01.csv")
        Set gWbkList02 = Workbooks.Open(.Path & "\List02.csv")
        s = "\バックアップ\表" & Format(Now, "yyyymmddhhnnss") & ".xlsx"
        gWbk表.SaveCopyAs .Path & s
    End With
End Sub

Public Sub ReleaseMyObject()
    gWbk表.Close True
    gWbkList01.Close False
    gWbkList02.Close False
End Sub


Sheet2モジュール

Option Explicit


Private Sub CommandButton1_Click()
    Module1.GetMyObject

    list01
    list02

    Module1.ReleaseMyObject
End Sub

Private Sub list01()
    Dim ws表 As Worksheet: Set ws表 = gWbk表.Worksheets(1)
    Dim rngList01 As Range: Set wsList01 = gWbkList01.Worksheets(1).UsedRange
    Dim c As Range
    Dim ix As Variant

    For Each c In ws表.Range("V50:V785")
        ix = Application.Match(c, wsList01.UsedRange.Columns("A"), 0)
        If IsError(ix) = False Then
            c.Offset(, 1).Value = rngList01.Cells(ix, "B").Value
        End If
    Next
End Sub

Private Sub list02()
End sub

エラーの原因は定かではありませんが、
オブジェクト型でない変数にオブジェクトを代入しようとしているか、
オブジェクトでないものにプロパティを指定しようとしているか、かと思われます。
変数の宣言が上手く行ってない?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

こんにちは。よろしくおねがいいたします。
まず、お示しのコードがすごくわかりにくいのですが、

質問1:コードをシートモジュールに書いているのは、なにか理由があるのですか?
分けたモジュールは標準モジュールにひとつにまとめて書いてもいいと思いました。

質問2:バックアップを作る部分で、ファイルパスの部分がバックスラッシュでなくスラッシュになっているのは、単なるタイプミス?

質問3:メインのプログラムで"表.xlsx"をオープンして、そのあとコールしているサブプログラムのほうでまた"表.xlsx"をオープンしているようですが・・ここで落ちているのでは?

質問4:表.xlsxのシートの名前がsheet1だったりsheet01だったりしますが・・これも単なるタイプミス?

以下のコードは、もろもろの部分を整理して簡略化してみたものなのですが・・
こういう理解であっていますか?
(かなり簡略化しましたが、これはこれで単独で動きます)

Option Explicit

'グローバル宣言-------------------------------
Public i As Long
Public j As Long

Public fileName As String

Public wb As Workbook
Public ws As Worksheet
Public Ws_list00  As Worksheet
Public Ws_list01  As Worksheet
Public Ws_list02  As Worksheet

Sub All()
'これは、list01.csvとlist02.csvで、表.xlsxを更新するプログラム
'(そのうち、list01.csvの部分だけが以下のプログラム)

'list01.csvのA1セルの値 が 表.xlsxのV50セルの値が同じとき、
'表.xlsxのW50セルにlist01.csvのB1セルの値をセットする
'以下、下にシフトしながら、表.xlsxのすべての行について更新していく

'ScreenUpdatingは省略しました

'表.xlsxのバックアップコピーを作る部分も省略しました

'作業をする
   Workbooks.Open "表.xlsx"
   Workbooks.Open "list01.csv"
   Workbooks.Open "list02.csv"

   Set Ws_list00 = Workbooks("表.xlsx").Worksheets("sheet1")
   Set Ws_list01 = Workbooks("list01.csv").Worksheets("list01")
   Set Ws_list02 = Workbooks("list02.csv").Worksheets("list02")

'作業をする
'念のため、このWs_list01をセレクトしています
Ws_List01.select

For i = 50 To 786
        For j = 1 To Ws_list01.Range("A" & Rows.Count).End(xlUp).Row
                If Ws_list00.Range("V" & i).Value = Ws_list01.Range("A" & j).Value Then
                        Ws_list00.Range("W" & i) = Ws_list01.Range("B" & j)
                        Exit For
                End If
        Next j
Next i

End Sub

わかりにくいかもしれませんね・・・またお声掛けください!

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

「開始ボタン」は特定のプロシージャを実行するようにしていると思いますが、「▶」からの実行はカーソル位置のプロシージャが実行されると思います。

あと複数のプロシージャが存在している場合は、プロシージャを一つ残して、それ以外をコメントアウトすると問題が特定しやすくなります。

また、実行したいプロシージャ内にカーソルを置き、[F8]で一行ずつステップ実行するとデバッグしやすくなります。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.58%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • トップ
  • VBAに関する質問
  • 「オブジェクト変数または with ブロック変数が設定されていません」となってしまいます。