
エクセル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
No.1ベストアンサー
- 回答日時:
結論を言うと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は最後でなく配列を使う直前に行った方がいいです。値が入ったまま途中で止まったり、なんだかんだと色々な値が入ってしまってます。
この回答への補足
そうなんですか?!今までこの定義にて問題が発生していなかったため知りませんでした.
御指摘いただいた部分に関して修正を行ったのですがエラー箇所,エラー内容ともに変化ないのですが...
No.2
- 回答日時:
エラーが再現できません。
変数の宣言方法は先の回答者の通りなのですが面倒なのでそのままです。
コンパイルエラーになった部分のみ修正しただけです。
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
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
セルをクリック⇒そのセルに入力...
-
貼り付けで複数セルに貼り付けたい
-
vba テキストボックスとリフト...
-
エクセルの書式設定の表示形式...
-
EXCEL VBA セルに既に入...
-
数式を残したまま、別のセルに...
-
Excelで数式内の文字色を一部だ...
-
枠に収まらない文字を非表示に...
-
(Excel)数字記入セルの数値の後...
-
【Excel】 セルの色での判断は...
-
エクセルの一つのセルに複数の...
-
Excel 例A(1+9) のように番地の...
-
VLOOKUPとハイパーリンクの組み...
-
Excel for Mac使用中ポインタが...
-
エクセル オートフィルタで絞...
-
Excelでのコメント表示位置
-
【エクセル】IF関数 Aまたは...
-
エクセルで指定したセルのどれ...
-
エクセルで、複数の参照範囲を...
-
excelの特定のセルの隣のセル指...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
vba テキストボックスとリフト...
-
貼り付けで複数セルに貼り付けたい
-
エクセルで指定したセルのどれ...
-
枠に収まらない文字を非表示に...
-
セルをクリック⇒そのセルに入力...
-
エクセル
-
数式を残したまま、別のセルに...
-
(Excel)数字記入セルの数値の後...
-
エクセル オートフィルタで絞...
-
エクセルの書式設定の表示形式...
-
Excel 例A(1+9) のように番地の...
-
エクセルの一つのセルに複数の...
-
excelの特定のセルの隣のセル指...
-
EXCEL VBA セルに既に入...
-
Excelでのコメント表示位置
-
エクセルのセルの枠を超えて文...
-
【エクセル】IF関数 Aまたは...
-
対象セル内(複数)が埋まった...
-
Excelで数式内の文字色を一部だ...
-
【Excel】 セルの色での判断は...
おすすめ情報