
以前、以下の質問をして、いただいた回答からあとは自分で勉強しながら使っていこうと思っていたのですが、行き詰ってしまったので教えていただけますか?
https://oshiete.goo.ne.jp/qa/9139476.html
①
Macで使えない。
同じ作業をするものにMacユーザーがいたため、CreateObjectが使えません。
Macで代替となるようなもの、若しくは外部アプリケーションを使わずに行える方法はあるのでしょうか。
②
すべてのシートでマクロが動いてしまう。
マクロを実行するとアクティブなシートだけでなく、すべての「A」が付くシートのデータを対応するシートに出力してくれます。
シートは1日1シート使い、31日分あります。
さらに1シート内でも複数の計算をするようにしたいため、計算終了までに1分強かかってしまいます。
こちらはその時間待てばいいのですが、参照にする「A」が付くシートの指定をActiveSheetにすればいいのではと思い、いろいろやってみたのですが、結局うまく動きませんでした。
なにかいい方法を教えていただけますでしょうか。
素人の質問で申し訳ありませんが、よろしくお願いします。
下に以前の質問の抜粋を載せます。
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
「VBAでシート名に対応したシートへ自動入力したい。」
質問抜粋
やりたいことは、例えば一つのブックにシート名が1~10までとA1~A10まであるとします。
シートA○のセルA1とセルA2に数字を入力したら、シート○のA1にシートA○のセルA1とセルA2の合計が自動入力されるようにするには、どのようなコードを書けばよいのでしょうか。
更に、できれば参照元であるシートA○を削除してもシート○に自動入力されたデータが消えないようにならないかと考えています。
回答でいただいたコード
Sub foo()
Dim dic As Object
Dim ws As Worksheet
Dim name As String
Set dic = CreateObject("Scripting.Dictionary")
With ActiveWorkbook
' A無しシートの存在チェック
For Each ws In .Worksheets
If Left(ws.name, 1) <> "A" Then
dic(ws.name) = True
End If
Next
' 計算&記入
For Each ws In .Worksheets
If Left(ws.name, 1) = "A" Then
name = Mid(ws.name, 2)
If Not dic.Exists(name) Then
MsgBox name & "シートがありません", vbExclamation
Else
.Worksheets(name).Range("A1").Value _
= ws.Range("A1").Value + ws.Range("A2").Value
End If
End If
Next
End With
Set dic = Nothing
End Sub
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
No.2ベストアンサー
- 回答日時:
こんにちは、No.1です。
> Set ws = Sheets(name)
> で「インデックスが有効範囲にありません」というエラーが出て自力では解決できませんでした。
これは、この行が実行される時点で、変数nameの値が未定になっているので、
「未定」という名前のシートは無いよ!というエラーになります。
あと、No.1のソースですが、A○シートに対応する○シートがなかった場合のエラーメッセージ表示を追加したものを以下に書きますので、参考にしてください。
------------------------------------------------------------------
Sub foo()
On Error GoTo ERR_TRAP
Dim name As String
With ActiveWorkbook
If Left(ActiveSheet.name, 1) <> "A" Then
MsgBox "現在アクティブなシートのシート名にAがついていません。", vbExclamation
Exit Sub
End If
name = Mid(ActiveSheet.name, 2)
.Worksheets(name).Range("A1").Value _
= ActiveSheet.Range("A1").Value + ActiveSheet.Range("A2").Value
End With
GoTo LAST
ERR_TRAP:
MsgBox ActiveSheet.name & "に対応するA無しシートがありません。", vbExclamation
LAST:
End Sub
なるほど!
確かに値が決まって無ければエラーになりますね。
しかし順番を変えればいいというわけでもないのですね。
今度は「オブジェクトはプロパティまたはメソッドをサポートしていません」と出ました。
これ以上教えていただくのも悪いので、この回答をベストアンサーにして閉め切ろうと思います。
今回分からなかったところは、これから少しずつ勉強していこうと思います。
エラーメッセージの追加ありがとうございます。
マクロを動かした時に、人為的ミスでエラーが出るかもしれないという予測をたて、対処しておくことの大切さがわかりました。
いろいろありがとうございました。
No.1
- 回答日時:
件の回答をしたものです。
以下で如何でしょう?
現在アクティヴな、A○シートのみ計算するようにしました。
------------------------------------------------------
Sub foo()
Dim name As String
With ActiveWorkbook
If Left(ActiveSheet.name, 1) <> "A" Then
MsgBox "現在アクティブなシートのシート名にAがついていません。"
Exit Sub
End If
name = Mid(ActiveSheet.name, 2)
.Worksheets(name).Range("A1").Value _
= ActiveSheet.Range("A1").Value + ActiveSheet.Range("A2").Value
End With
End Sub
------------------------------------------------------
> すべてのシートでマクロが動いてしまう。
> マクロを実行するとアクティブなシートだけでなく、すべての「A」が付くシートのデータを対応するシートに出力してくれます。
これは、1回のマクロ実行で複数のシートの計算を行うと考えたので、そう動作するように作成ました。
ご質問のときに詳細な仕様を記載いただければ、より適切に回答できたと思います。
ありがとうございます!
完璧です!
前回は自分で勉強したいという思いもあり、細かい修正は自分で行うつもりでした。
それが逆に二度手間をかけさせてしまい申し訳ありません。
自分もはじめは全部のシートに働けばいいと思っていたのですが、思った以上に重くて変更を考えました。
前回の回答も、私の不十分な質問の中完璧に答えていただけてたと思います。
前回の回答もMid関数を使われていたことから、自分でもいろいろ調べつついじってみたのですが、エラーが出たり、出力先が常に一番若い数字のシートになったり、うまくいきませんでした。
ちなみにお見苦しいですが最終的に行きついていたのが以下のコードです。
------------------------------------------------------
Sub test()
Dim name As String
Dim ws As Worksheet
Dim aws As Worksheet
Set ws = Sheets(name)
Set aws = ActiveSheet
With ActiveWorkbook
name = Mid(aws.name, 2)
.ws.Range("A1").Value _
= aws.Range("A1").Value + aws.Range("A2").Value
End With
End Sub
------------------------------------------------------
Set ws = Sheets(name)
で「インデックスが有効範囲にありません」というエラーが出て自力では解決できませんでした。
はじめっから回答者さんは使ってないのですが、いろいろなサイトを見てるうちに、Setステートメントというのを覚えて、使って見たかったんですかね・・・。
しかし原因を調べてみたのですが、SETステートメントでSheetsの引数に変数を使ってはいけないというものが出てきませんでした。
常識なのかもしれませんが素人感覚ではなぜ使えないのか分からず、使えるようにするために四苦八苦して、「使わない」という選択肢が出てきませんでした。
今回いただいた回答で、無事使えるようになりました。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) セルの値からファイルを複数作りたい2 3 2022/10/07 15:54
- Visual Basic(VBA) コード名シートA列と集計シートA列のコードが一致したら、コード名シートA5からk12の範囲をコピーし 1 2022/08/29 23:46
- Excel(エクセル) vba シート名の一覧を2列に分けるには 5 2023/04/24 08:56
- PowerPoint(パワーポイント) エクセルのマクロについて教えてください。 1 2022/03/25 17:03
- Visual Basic(VBA) 【ご教示ください】VBAの記述方法がわかりません。 2 2022/08/12 21:28
- Visual Basic(VBA) ExcelのVBAコードについて教えてください。 2 2022/05/26 17:19
- Visual Basic(VBA) 複数シート一括作成後に、特定範囲の数式は値で貼り付けしたい 3 2022/10/07 11:18
- Visual Basic(VBA) 【前回の続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/16 16:44
- Visual Basic(VBA) まとめシートから集計シートへA列のコードが一致したら1行コピーするマクロをネット上で見つけました。こ 1 2022/08/30 14:11
- Visual Basic(VBA) 【前回の続き続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/24 20:49
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Excelマクロのエラーを解決した...
-
excelのマクロで該当処理できな...
-
VBA 存在しないシートを選...
-
実行時エラー1004「Select メソ...
-
エクセルVBA 別シートからのコ...
-
【ExcelVBA】全シートのセルの...
-
エクセルVBA 別シート間の列の...
-
ユーザーフォームに入力したデ...
-
エクセルで通し番号を入れてチ...
-
特定の文字を含むシートだけマ...
-
【VBA】全ての複数シートから指...
-
【VBA】指定した検索条件に一致...
-
Excel チェックボックスにチェ...
-
ExcelのVBAコードについて教え...
-
【VBA】特定の文字で改行(次の...
-
エクセルVBA アクティブシート...
-
VBA 指定した回数分、別シート...
-
XL:BeforeDoubleClickが動かない
-
ワークシートを追加したときの...
-
エクセルVBA Ifでシート名が合...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
特定の文字を含むシートだけマ...
-
Excelマクロのエラーを解決した...
-
excelのマクロで該当処理できな...
-
ユーザーフォームに入力したデ...
-
実行時エラー'1004': WorkSheet...
-
XL:BeforeDoubleClickが動かない
-
エクセルVBA Ifでシート名が合...
-
実行時エラー1004「Select メソ...
-
エクセルのシート名変更で重複...
-
【ExcelVBA】全シートのセルの...
-
VBA 存在しないシートを選...
-
ブック名、シート名を他のモジ...
-
Excel チェックボックスにチェ...
-
VBA 検索して一致したセル...
-
エクセルで通し番号を入れてチ...
-
シートが保護されている状態で...
-
【VBA】特定の文字で改行(次の...
-
ExcelのVBAのマクロで他のシー...
-
Worksheet_Changeの内容を標準...
-
EXCELVBAを使ってシートを一定...
おすすめ情報