アプリ版:「スタンプのみでお礼する」機能のリリースについて

自分のパソコンではVBAが起動しますが‥
他のパソコンでやってみると起動せずに
インデックスが有効範囲にありませんの
エラーが出てしまいます。

何故でしょう?

だいたい下記のようなVBAになります。

Sub SendingSheet()
 Dim wb As Variant
 Dim WkBk As Variant
 For Each wb In Workbooks
  If (wb.Name) Like "FTN*【チェックシート】*.xls?" And wb.Name <> ActiveWorkbook.Name Then
   Set WkBk = wb
   Exit For
  End If
 Next
 If IsObject(WkBk) Then
  On Error Resume Next
  With WkBk
   ActiveSheet.Copy After:=WkBk.Worksheets(.Worksheets.Count)
ActiveSheet.name= "シートA"
   Beep  'コピーしたら音がなる
  End With
  If Err.Number <> 0 Then
   MsgBox Err.Number & " :" & Err.Description
  End If
  On Error GoTo 0
 Else
  MsgBox "該当するブックは開いていません。", vbExclamation
 End If
End Sub

----------------
よろしくお願いします。

質問者からの補足コメント

  • ありがとうございます。

    エラーストップの確認ですが‥
    確認の仕方が分かりません。

    ただ
    "FTN*【チェックシート】*.xls?"
    上記のBookにコピーしてほしいのに

    アクティブBookへ名前を付けてコピーされて
    しまいます。

    っという事は
    "FTN*【チェックシート】*.xls?"
    のBookを見つける事が
    出来てないという事でしょうか?

      補足日時:2019/02/20 16:45

A 回答 (3件)

まず、エラーストップした場所をきちんとご確認ください。

でないと正確なことが分かりません。
ご記載頂いたマクロを私もPC上で走らせて見ましたが、おっしゃるようなエラーストップは発生しませんでした。

以下は推測です。

ぱっと思うのは、On Error を使っていらっしゃるので、エラーでストップするということはそれ以前の部分の記述に問題がある(お使いのPCごとの条件の違いが影響する)可能性が高いと思われます。
また、「インデックスが有効範囲にない」ということは、コレクション等を指定する際に、()内に指定された名前もしくはindex番号で指定できるコレクションがない、ということです。
たとえば、開いているExcelファイルが2つしかないのに、
Workbooks(3)~
のような記述をすると、そんなWorkbookはない、とエラーになるわけです。
ただし、For Each文を使っているので、参照のエラーが出る理由はよく分かりません。

もうひとつ気になる点を上げるとすれば、AcvtiveWorksheetをWkBkにコピーした後、ActiveWorksheet名を「シートA」に変えている点ですかね。同じファイルを開いたままこのマクロを繰り返し実行すると、WkBKに「シートA」がいくつも作られます。私の使用PC(Excel2016)ではシート名の後ろに「(2)」などの番号が入り、マクロは停止しないものの「すでに名前が使われています」と警告メッセージが出ました。バージョンの違いでそこがうまく走らない可能性はあるかと思います。
    • good
    • 0

補足して頂いたことから分かるのは、


1.マクロはストップしていない
2.おそらくWkBkにWorkbookが格納されていない。
の2点でしょうか。

1.についてですが、おそらく表示されたのは
If Err.Number <> 0 Then
  MsgBox Err.Number & " :" & Err.Description
End If
このメッセージボックスでしょう。
エラーストップの場所を確認するためには、On Error の文を’でコメントアウトしてマクロを実行してみてください。

2.についてですが、ご記載のマクロ内にあるif文は、FTN~のファイルがアクティブな状態だとWkBkに何も変数が代入されません。FTNがアクティブな以上、「AND wb.Name <> "FTN~"」の部分が成立しないためです。
ただ、そうなるとシートがコピーされるのは不自然ですので、ここが不明です。


ところで、質問者様がこのマクロで実現したいことは、

・このマクロを保存しているファイル(A)と、FTN~のファイル(B)およびそのほかのファイル(C他)を起動しているときに、
・ファイルAのシートをファイルBに挿入し、名前を「シートA」にしたい(挿入した場合はBeep音鳴らす)
・ファイルBが起動されていないときはそれをアナウンス

ということでしょうか。
もしそうであるなら、以下のように修正してみてはいかがでしょうか。

Sub sumple1()

Dim wb As Variant
Dim WkBk As Variant
Dim twb As Variant 'ファイルA
Set twb = ThisWorkbook

For Each wb In Workbooks
  If wb.Name Like "FTN*【チェックシート】*.xls?" And wb.Name <> twb.Name Then
    Set WkBk = wb
    Exit For
  End If
Next
If IsObject(WkBk) = False Then
  MsgBox "該当するブックは開いていません。", vbExclamation
  Exit Sub
Else
  With WkBk
  twb.ActiveSheet.Copy after:=.Worksheets(.Worksheets.Count)
  .Worksheets(.Worksheets.Count).Name = "シートA"
Beep 'コピーしたら音がなる
  End With
End If

End Sub

ファイルAにシートが複数ある場合は、twb.sheets("シート名")かtwb.sheets(シート番号)で指定してください。

意図と違う場合は、やはりエラー箇所を確認して修正するべきでしょう。
    • good
    • 1
この回答へのお礼

凄く参考になりました。
ありがとうございます。

上手くエラーが出ずにコピーすることが出来ました。

お礼日時:2019/02/23 17:53

ちょっと割り込みさせていただきます。


ほとんど、前の方のやり取りは読まずに、コードを直してみました。

"FTN*【チェックシート】*.xls? というブックがあったら、そこにシートのコピーを送るというマクロですよね。
見た目は簡単なマクロのようですが、ひじょうにややこしくしているのは、マクロを搭載しているThisWorkbookの存在です。そのBookと、"FTN*【チェックシート】*.xls?は、同一ではない、というコードになっているからです。その条件は含め、ご質問者さんのコードは活かしました。

>"FTN*【チェックシート】*.xls?"
>上記のBookにコピーしてほしいのに
>アクティブBookへ名前を付けてコピーされて
>しまいます。

やはりそうなのですね。こちらのマクロでも、なぜかコピー後に、Active化が移動していないということです。(Excel 2016) //明示的にActiveの親オブジェクト(Book)から指定しなくてはならないようです。

ファイル(ブック)を特定化するロジックが大雑把ですね。一旦、見つけたブックを、さらに、Activeかどうかを調べるのであって、同時に両方の条件を調べたら、ブックがないことになってしまいます。

なお、こちらでは、エラーを避けるために、「 "シートA-" & .Worksheets.Count 'オプショナル」というオプションを設けました。それと、エラー・ストップというのは、通常は、ステップマクロで分かるものです。


'//標準モジュール(アドインを含む)
Sub SendingMySheet()
 Dim Wb As Variant
 Dim WkBk As Workbook
 Dim acWb As Workbook
 Dim sh As Worksheet

 On Error GoTo ErrHandler

 For Each Wb In Workbooks
  If Wb.Name Like "FTN*【チェックシート】*.xls?" Then
   If Wb.Name <> ActiveWorkbook.Name Then
    Set WkBk = Wb
    Exit For
   Else
    MsgBox Wb.Name & "はアクティブではできません。", vbExclamation
    Exit Sub
   End If
  End If
 Next Wb
 If Not WkBk Is Nothing Then
  Set acWb = ActiveWorkbook
  With WkBk
   acWb.ActiveSheet.Copy After:=.Worksheets(.Worksheets.Count)
   .ActiveSheet.Name = "シートA-" & .Worksheets.Count 'オプショナル
   Beep
  End With
 Else
  MsgBox "該当するブックは開いていません。", vbExclamation
 End If
ErrHandler:
 If Err() <> 0 Then
  MsgBox Err.Number & " :" & Err.Description
 End If
End Sub
    • good
    • 1
この回答へのお礼

凄く参考になりました。
ありがとうございます。

上手くエラーが出ずにコピーすることが出来ました。

お礼日時:2019/02/23 17:54

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