プロが教えるわが家の防犯対策術!

エクセルVBAにて2つの異なるワークブック(セルの配置等は同じ)からセル値を読みだし,それを比較した際に同値であれば2つとは異なる第3のワークブック(同じくセルの配置等は同じ)の読みだしたセルの位置と同じセルに文字列を入力するというプログラムを書こうとしています.その際に他のワークブックAのシートを開き,任意のセル範囲のみを用意した配列に格納しようとすると「オブジェクト変数または with ブロック変数が設定されていません。」というエラーが出ます.これはworksheetとして定義した変数ssのcellsを操作しようとしているから発生しているのでしょうか?最近VBAの勉強を始めたばかりで全く分かっていません.初歩的な質問となってしまうかもしれませんがご教授宜しくお願いします.


Option Explicit
Public cs As Worksheet
Public sb As Workbook
Public ss As Worksheet

Public Sub make()
Dim sn As Long
Dim sname As String
Dim i As Integer

Set c = ThisWorkbook.Worksheets(1)
Set sb = Workbooks.Open("A")

sn = sb.Sheets.Count

For i = 1 To seiton
sname = Sheets(i).Name
Set ss = sb.Worksheets(i)

Call match
Next

sb.Close False
Set ss = Nothing
Set sb = Nothing

End Sub

Public Sub match()
Dim i, j, k As Integer
Dim day, koma As Integer
day = 24
koma = day * 5
Dim can() As Boolean
Dim kout() As Byte
Dim seit() As Byte
ReDim can(koma)
ReDim kout(koma)
ReDim seit(koma)

For i = 0 To koma
j = i \ 5
For k = 0 To 5
seit(i) = ss.Cells(k + 3, 2 + j) '←この部分でエラーが出ています
Next
Next

Erase can
Erase kout
Erase seit
End Sub

A 回答 (2件)

結論を言うとjが少数になっているため列番号がおかしくなっているのでしょう。



Public Sub match()
Dim i, j, k As Integer

上記の型宣言では、iとjはvariant型として認識されます。
型宣言は実は1つずつ行う必要があります。正しくは
Dim i As Integer, j As Integer, k As Integer
私も最初間違えて正解を知った時は「えーー?」と思いましたが、1つずつするのです。

他に気付いた点は
Eraseは最後でなく配列を使う直前に行った方がいいです。値が入ったまま途中で止まったり、なんだかんだと色々な値が入ってしまってます。

この回答への補足

そうなんですか?!今までこの定義にて問題が発生していなかったため知りませんでした.
御指摘いただいた部分に関して修正を行ったのですがエラー箇所,エラー内容ともに変化ないのですが...

補足日時:2014/03/21 00:50
    • good
    • 0
この回答へのお礼

ありがとうございました.宣言の方法,勉強になりました.色々と試行錯誤しまして無事にエラーを回避することができました.

お礼日時:2014/03/23 00:04

エラーが再現できません。


変数の宣言方法は先の回答者の通りなのですが面倒なのでそのままです。
コンパイルエラーになった部分のみ修正しただけです。
Erase の3行もなくても大丈夫そうですがそのまま (^_^;)
Small.xlsx は至極単純なBookです。
関数・セル結合・保護などしていません。
開いたBookに何かあるのでは?
k、j の値と共に確認されては?

Option Explicit

Public cs As Worksheet
Public sb As Workbook
Public ss As Worksheet

Public Sub make()
Dim sn As Long
Dim sname As String
Dim i As Integer

'Set ss = ThisWorkbook.Worksheets(1) 'c → ss
Set sb = Workbooks.Open("E:\TMP\Small.xlsx")

sn = sb.Sheets.Count

For i = 1 To sn 'seiton
sname = Sheets(i).Name
Set ss = sb.Worksheets(i)

Call match
Next

sb.Close False
Set ss = Nothing
Set sb = Nothing

End Sub

Public Sub match()
Dim i, j, k As Integer
Dim day, koma As Integer
day = 24
koma = day * 5
Dim can() As Boolean
Dim kout() As Byte
Dim seit() As Byte
ReDim can(koma)
ReDim kout(koma)
ReDim seit(koma)

For i = 0 To koma
j = i \ 5
For k = 0 To 5
seit(i) = ss.Cells(k + 3, 2 + j) '←この部分でエラーが出ています
Next
Next

Erase can
Erase kout
Erase seit
End Sub
    • good
    • 0
この回答へのお礼

ありがとうございました.宣言の方法,勉強になりました.色々と試行錯誤しまして無事にエラーを回避することができました.

お礼日時:2014/03/23 00:04

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています