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

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

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

Q&A

3回答

2248閲覧

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

退会済みユーザー

退会済みユーザー

総合スコア0

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

0グッド

0クリップ

投稿2020/02/12 11:10

コードが完成しました。
シートに作った【開始ボタン】からはエラーなく、処理ができるのですが、、、
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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

otn

2020/02/12 12:07

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

2020/02/12 12:48

Sub All() と 別のシート(Sheet2) は 同じ .xlsmファイルですか? Workbooks.Openが多いような
guest

回答3

0

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

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

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

投稿2020/02/12 17:15

yuuskeccho

総合スコア97

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

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

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

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

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

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

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

vba

1Option Explicit 2 3'グローバル宣言------------------------------- 4Public i As Long 5Public j As Long 6 7Public fileName As String 8 9Public wb As Workbook 10Public ws As Worksheet 11Public Ws_list00 As Worksheet 12Public Ws_list01 As Worksheet 13Public Ws_list02 As Worksheet 14 15Sub All() 16'これは、list01.csvとlist02.csvで、表.xlsxを更新するプログラム 17'(そのうち、list01.csvの部分だけが以下のプログラム) 18 19'list01.csvのA1セルの値 が 表.xlsxのV50セルの値が同じとき、 20'表.xlsxのW50セルにlist01.csvのB1セルの値をセットする 21'以下、下にシフトしながら、表.xlsxのすべての行について更新していく 22 23'ScreenUpdatingは省略しました 24 25'表.xlsxのバックアップコピーを作る部分も省略しました 26 27'作業をする 28 Workbooks.Open "表.xlsx" 29 Workbooks.Open "list01.csv" 30 Workbooks.Open "list02.csv" 31 32 Set Ws_list00 = Workbooks("表.xlsx").Worksheets("sheet1") 33 Set Ws_list01 = Workbooks("list01.csv").Worksheets("list01") 34 Set Ws_list02 = Workbooks("list02.csv").Worksheets("list02") 35 36'作業をする 37'念のため、このWs_list01をセレクトしています 38Ws_List01.select 39 40For i = 50 To 786 41 For j = 1 To Ws_list01.Range("A" & Rows.Count).End(xlUp).Row 42 If Ws_list00.Range("V" & i).Value = Ws_list01.Range("A" & j).Value Then 43 Ws_list00.Range("W" & i) = Ws_list01.Range("B" & j) 44 Exit For 45 End If 46 Next j 47Next i 48 49End Sub 50

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

投稿2020/02/12 15:31

AkiSaito

総合スコア110

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

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

標準モジュール

ExcelVBA

1Option Explicit 2 3Public gWbk表 As Workbook 4Public gWbkList01 As Workbook 5Public gWbkList02 As Workbook 6 7 8Public Sub GetMyObject() 9 Dim s As String 10 With ThisWorkbook 11 Set gWbk表 = Workbooks.Open(.Path & "\表.xlsx") 12 Set gWbkList01 = Workbooks.Open(.Path & "\List01.csv") 13 Set gWbkList02 = Workbooks.Open(.Path & "\List02.csv") 14 s = "\バックアップ\表" & Format(Now, "yyyymmddhhnnss") & ".xlsx" 15 gWbk表.SaveCopyAs .Path & s 16 End With 17End Sub 18 19Public Sub ReleaseMyObject() 20 gWbk表.Close True 21 gWbkList01.Close False 22 gWbkList02.Close False 23End Sub

Sheet2モジュール

ExcelVBA

1Option Explicit 2 3 4Private Sub CommandButton1_Click() 5 Module1.GetMyObject 6 7 list01 8 list02 9 10 Module1.ReleaseMyObject 11End Sub 12 13Private Sub list01() 14 Dim ws表 As Worksheet: Set ws表 = gWbk表.Worksheets(1) 15 Dim rngList01 As Range: Set wsList01 = gWbkList01.Worksheets(1).UsedRange 16 Dim c As Range 17 Dim ix As Variant 18 19 For Each c In ws表.Range("V50:V785") 20 ix = Application.Match(c, wsList01.UsedRange.Columns("A"), 0) 21 If IsError(ix) = False Then 22 c.Offset(, 1).Value = rngList01.Cells(ix, "B").Value 23 End If 24 Next 25End Sub 26 27Private Sub list02() 28End sub

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

投稿2020/02/12 15:11

mattuwan

総合スコア2136

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問