質問

win98、エクセル2000を使用しています。
VBA初心者です。
前年のファイルのデータを次年度にコピーしたいのです。
変数を使って前年を動的に選択したいので、
わからないながら、下記のように書いてみました。
とりあえず、Workbooks.Open fNameまでは
作動するのですが、それぞれを交互にactiveに出来ません。
下記の記入自体にも自信はないのですが、
とりあえず→の部分にどのように書けばそれぞれを
activeにできるのでしょうか?
苦労しています。教えていただけると助かります。
お願いします。
・・・・・・・・・・・・・・・・・・・・・・・・・
Dim fName
Dim gName
fName = "c:\Windows\デスクトップ\日計表\" & ActiveSheet.Range("b2") & "年度.xls"
gName = "c:\Windows\デスクトップ\日計表\" & ActiveSheet.Range("d5") & "年度.xls"
Workbooks.Open fName
'6月・・・・・・・・・36
'→ここでgNameをactiveにしたい・・・・・・・・
Sheets("06月").Select
ActiveSheet.Unprotect
'→ここでfNameをactiveにしたい・・・・・・・・
Sheets("06月").Select
Range("C7:F36").Select
Selection.Copy
  ・
  ・
ちなみにファイル名はgNameは2005年度、fNameは2004年度で同じ日計表というホルダにあります。
  ・
・・・・・・・・・・・・・・・・・・・・・・・・・

通報する

回答 (2件)

ちょっとよろしいですかしらね。
ひとつ気になったのは、
>ActiveSheet.Unprotect
ですが、
プロテクトで、 EnableSelection という特別や処置をしてなければ、そのままでよいはずですね。

今、コードを考えただけのSample です。
きちんと実際に試したわけではありませんが、今のままでは、保存するわけではないので、問題はないと思います。

'<このプロシージャは、標準モジュールを基準にしています>
'---------------------------------------
Sub OpenBooks()
  Dim fName As String
  Dim gName As String
  Dim LastBk As Workbook
  Dim CurrBk As Workbook
  Const myPath As String = "c:\Windows\デスクトップ\日計表\"
'以下の2行は、コード自体が変更するかもしれないような気がします。
'これは、セルからでも取れます。
  Const myMonth As String = "06月"
  Const myCopyRng As String = "C7:F36"
'
  fName = ActiveSheet.Range("b2") & "年度.xls"
  gName = ActiveSheet.Range("d5") & "年度.xls"
If Len(fName) <= 6 Or Len(gName) <= 6 Then
   MsgBox "ファイル名が見つかりません。", 16
  Exit Sub
 End If
'
On Error Resume Goto ErrHandler 'ブックが開かなかった時を想定
  Set LastBk = Workbooks.Open(myPath & fName)
  Set CurrBk = Workbooks.Open(myPath & gName)
  LastBk.Worksheets(myMonth).Range(myCopyRng).Copy _
    CurrBk.Worksheets(myMonth).Range("C7")
'
  LastBk.Close False '前年度のファイルは閉じる
'LastBk.Save '保存して、開いたままにする
On Error GoTo 0
ErrHandler:
If Err.Number > 0 Then
MsgBox Err.Number & "(" & Err.Description & ")"
End If

Set LastBk = Nothing
Set CurrBk = Nothing
End Sub
'---------------------------------------

この回答へのお礼

ご回答ありがとうございました。
no.1さんのご回答で解決しました。
wendy02さんの回答も試させていただきます。

1)ファイル名で指定する方法・・・ブック名だけを保存する変数fName2、gName2を作成します。
Dim fName2 As String
Dim gName2 As String
fName2 = ActiveSheet.Range("b2") & "年度.xls"
gName2 = ActiveSheet.Range("d5") & "年度.xls"
としておけば、gNameとfNameを開いた後は、それぞれ

Workbooks(fName2).Activate
Workbooks(gName2).Activate

でそれぞれをActiveにできます。

2)ブックのインデクスを参照する方法
上の例ではgNameを開くコマンドが書かれていませんが、本来なら、開いた順に
インデックスが加算していきます。つまり、元々3つのブックが開いている状態で新たに
Workbooks.Open fName
としてブックfNameを開いた場合、このブックのインデックス番号は4となるわけです。
つまり最後に開いたブックのインデックス番号は現在開かれているブックの総数に等しい
ということです。したがって、
Workbooks.Open fName
Workbooks.Open gName
という順番でブックを開いていたとしたら、gNameをアクティブにしたい場合は、
Workbooks(Workbooks.Count).Activate となり、fNameをアクティブにしたい場合は
Workbooks(Workbooks.Count - 1).Activate となるわけです。


ここからが重要ですが、データ処理を行う際に毎度ブックを切り替える必要は
ありません。

Workbooks(Workbooks.Count - 1).Activate
Sheets("06月").Select
Range("C7:F36").Select
Selection.Copy

fName を Active にし、「06月」シートを選択し、セル範囲「C7:F36」を選択し、
最終的に選択されたものをコピーする。

それなら

Workbooks(Workbooks.Count - 1).Sheets("06月").Range("C7:F36").Copy

fName の 06月 シートのセル範囲 C7:F36 をコピーする。

の1行でまとまりますね。まとまるだけでなく、余計な動作がなくなるため
処理がずっと早くなりますよ。

この回答へのお礼

ご回答ありがとうございます。
Workbooks(Workbooks.Count).Activate
Workbooks(Workbooks.Count-1).Activate
で切り替えが、お陰さまで出来ました。
まだ、知識不足のためおぼつきませんが、
Workbooks(Workbooks.Count - 1).Sheets("06月").Range("C7:F36").Copy
という書き方も勉強してみます。

このQ&Aは役に立ちましたか?3 件

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

新しく質問する

注目の記事

おしトピにAndroid版アプリが登場

話題のトピックにさくっとコメントできる「おしトピ」に Android版アプリが登場! もっと身近に使いやすくなりました。
今ならダウンロードで話題の掃除ロボットや全天球カメラが 当たるプレゼントキャンペーンも実施中。


新しく質問する

このカテゴリの人気Q&Aランキング

毎日見よう!教えて!gooトゥディ