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年度で同じ日計表というホルダにあります。
  ・
・・・・・・・・・・・・・・・・・・・・・・・・・

A 回答 (2件)

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行でまとまりますね。まとまるだけでなく、余計な動作がなくなるため
処理がずっと早くなりますよ。
    • good
    • 0
この回答へのお礼

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

お礼日時:2005/05/06 21:50

ちょっとよろしいですかしらね。


ひとつ気になったのは、
>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
'---------------------------------------
    • good
    • 0
この回答へのお礼

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

お礼日時:2005/05/06 22:00

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

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

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QExcel でシート間の重複データ(Sheet1のA=Sheet2のA かつ Sheet1のB=Sheet2のB)

Excel2000です。

Sheet1のA列・B列・C列・・・にデータが入っています。
Sheet2のA列・B列・C列・・・にデータが入っています。

Sheet1のA列とSheet2のA列は、似たようなデータが入っています。
Sheet1のB列とSheet2のB列も、同様です。
C列以降のデータは、シート間で全然関係ありません。

Sheet1の行データ(A列・B列)が、Sheet2(A列・B列)にも存在しているかどうか、
を知るには、どうすればよいですか。
C列以降の列のデータは、比較する際に使いません。

つまり、
Sheet1のA = Sheet2のA
かつ
Sheet1のB = Sheet2のB
であるような行を知りたいのですが、

どうすればよいのでしょうか。

Aベストアンサー

Sheet1、Sheet2 ともに空いている列に =A1&B1 のような連結データを作り、Matchなどで比較するとか、、、

Sheet1 の E1 =A1&B1
Sheet2 の E1 =A1&B1
Sheet1 の F1 =MATCH(E1,Sheet2!E:E,0)

QC:\WINDOWS\TEMP\B2Temp\Attachとは・・・

添付ファイルをメーラーからパソコンに落とすときに、
現在の場所を表すのに
「C:\WINDOWS\TEMP\B2Temp\Attach」
と表示されます。場所を表しているのだと思うのですが、くわしくどういう意味なのか教えて下さい。

Aベストアンサー

Cドライブの中のwindowsフォルダの中のtempフォルダの中のB2Tempフォルダの中のAttachフォルダ、という意味だと思います。質問の意図を取り違えてましたらすみません。スタートメニューを右クリックしてエクスプローラーで階層を確認されたら分かりやすいかと思います。

QRange("B19:T19").Select

よろしくお願いします

Private Sub Worksheet_Change(ByVal Target As Range)
内のマクロで
Range("B19:T19").Selectの
19をTarget.Rowで表現すると

Range("B19:T19").Selectをどう直したらいいでしょうか?
こんな簡単なことが分かりません

どなたか教えてください

Aベストアンサー

こんばんは!

Range(Cells(Target.Row, "B"), Cells(Target.Row, "T")).Select

とか

Cells(Target.Row, "B").Resize(, 19).Select

といった感じではどうでしょうか?

※ 複数行が変化した場合(データ消去・コピー&ペースト)の場合は
最初の行だけしか選択されません。m(_ _)m

QEXCELでSheet2にある名前がSheet1のどこにあるのかすぐ分かる方法

EXCELでSheet2に馬の名前があります。
例えば、クイーンズルビー
Sheet1にも同じ名前がある場合
どこにあるのかSheet2のクイーンズルビー
という名前をクリックして
Sheet1のクイーンズルビーのある所にすぐ移動する方法はありますでしょうか?Sheet1のどこかにあるのは分かっているのですが、どこにあるのかは分かりません。今の所ctrl+fで入力して探しています。列の位置はCと分かっているのですが、行がどこか分からない状態です。
バージョンはEXCEL2000です。
よろしくお願いします。

Aベストアンサー

ファイル名が「Book1.xls」とします。
「Sheet2」のA3セルに「クイーンズルビー」が入力されているとします。
B3セルに「=HYPERLINK("[Book1.xls]Sheet1!$C$"&MATCH(A3,Sheet1!C:C,0),A3)」を入力します。
B3セルをクリックする事により、移動します。

QExcel 2010 Sheet1の内容をSheet2に条件で抽出する方法

Sheet1で「担当者が山田で完成日がブランクの作業名」をSheet2のA2から下に自動で入るようにしたい。他の担当者も同様の処理を行いたい。
※もしSheet1の完成日に日付が入力されたらSheet2からは自動で削除されるようにしたい。

これは関数でどのような処理を行えば可能になるでしょうか。
自分でもいろいろと試してみたのですが、力不足でできませんでした。
詳しい方いらっしゃいましたら教えて頂ければと思います。
よろしくお願いいたします。

Aベストアンサー

こんばんは!

画像の配置通りだとSheet2のA2セルに
=IFERROR(INDEX(Sheet1!$A$1:$A$1000,SMALL(IF((Sheet1!$B$1:$B$1000=A$1)*(Sheet1!$C$1:$C$1000=""),ROW($A$1:$A$1000)),ROW(A1))),"")

配列数式になりますのでCtrl+Shift+Enterで確定!
この画面からコピー&ペーストする場合は
上記数式をドラッグ&コピー → Sheet2のA2セルを選択 → 数式バー内に貼り付け → そのまま(編集可能なまま)
Ctrl+Shiftキーを押しながらEnterキーで確定!

最後にA2セルのフィルハンドルで列・行方向にコピーしてみてください。m(_ _)m


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報