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
    • 1
この回答へのお礼

ご回答ありがとうございます。
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と関連する良く見られている質問

QExcel VBAで、セルに入ってるデータ型を調べる方法は?

現在、Excel VBAでプログラムを作成しています。

Do Until ~ Loop の終了条件を
アクティブセルに入っているデータの型が文字列型の時
としたいのですが、そのようなことは可能なのでしょうか?

可能だとしたら、どのように記述したらいいのでしょうか?

当方のPCは
Win XP、Excel2003
です。

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

Aベストアンサー

VarType 関数を使うとか。

Sub SampleProc()

  Dim i As Long
  
  i = 1
  Do While Len(Cells(i, "A").Value) > 0
    If VarType(Cells(i, "A")) = vbString Then
      Exit Do
    Else
      ' // 処理
    End If
    i = i + 1
  Loop
  MsgBox CStr(i) & "行目で停止"

End Sub

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)

QVBAでオブジェクト変数にsetしたシートがactiveかどうかを調べるには?

標準モジュールの冒頭でワークシート用のオブジェクト変数を確保し、
あるタイミングで、あるシートをそのオブジェクト変数にSetしています。

で、そのシートに値をセットするときに、そのシートがActiveだった場合だけやりたい処理があるのですが、Setしてあるオブジェクト変数だけを見てそのシートがActiveか否かを判断する方法って、あるのでしょうか。

コード例)
Private oSheetA as Worksheet

Sub SetSheet(sName as String)
  Set oSheetA = worksheets(sName)
End Sub

Sub SetValue(nValue as integer)
  xxxxxx ←ここでoSheetAがActiveならやりたいことがある。
  oSheetA.Cells(nRow, nCol) = cValue
End Sub

具体的には、複数のBookを開いている状態で、Activeシートが何であるかはオペレータの操作次第なので固定化できない状態で、SetValueが呼び出されたとき、oSheetAがActiveだったら、値をセットするセルが見えるようにセルをActivateかスクロールさせたいんです。

標準モジュールの冒頭でワークシート用のオブジェクト変数を確保し、
あるタイミングで、あるシートをそのオブジェクト変数にSetしています。

で、そのシートに値をセットするときに、そのシートがActiveだった場合だけやりたい処理があるのですが、Setしてあるオブジェクト変数だけを見てそのシートがActiveか否かを判断する方法って、あるのでしょうか。

コード例)
Private oSheetA as Worksheet

Sub SetSheet(sName as String)
  Set oSheetA = worksheets(sName)
End Sub

Sub SetValue(nVa...続きを読む

Aベストアンサー

Option Explicit

Private oSheetA As Worksheet

Sub SetSheet(sName As String)
Set oSheetA = Worksheets(sName)
End Sub

Sub SetValue(nValue As Integer)
If oSheetA Is ActiveSheet Then
MsgBox ("hoge")
End If
oSheetA.Cells(1, 1) = nValue
End Sub

Sub Main()
SetSheet ("Sheet1")
SetValue (5)
End Sub

'実行できるようにソースは変更していますが,
'こんな感じでIs演算子で同じオブジェクトか比較してみるってのはどうでしょう?

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

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

Aベストアンサー

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

QVoidポインタで受け取った変数の型を調べる方法

あるライブラリの関数を利用しようとしたのですが、その関数の引数にVoidポインタがあり、どういう型のデータを格納したのかわかりません。このポインタのアドレスに格納されたデータの型を調べる関数なり方法なりというのはあるのでしょうか。

Voidポインタというのは型を問わずに受け取れるというのは利点ですが、受け取ったものがあらかじめなんだかわからない場合はどうするのでしょうか。よろしくお願いします。

Aベストアンサー

★基本的に調べようがありません。
・『void』ポインタはアドレス情報のみを受け渡しますので、型のサイズまでは分かりません。
 逆に言えば、型のサイズが分からないから『汎用ポインタ』と呼べるのです。
・あるライブラリの関数とは何?→どんな関数か分かりませんので、これ以上はアドバイス無理!
 ただ、C言語の qsort などでは比較用の関数で『void』ポインタを受け取りますが、その関数内で
 渡されたデータの『型』を指定します。→ポインタの形でキャストします。
 この比較用の関数は自前で用意する関数ですので、ソートするデータの型が分かっています。
 でも、ソートするデータ型が複数ある場合は、比較用の関数を複数作って切り替えます。
・あと関数に型を表す引数があれば、それを見て判断できますが、そうでない場合は『void』ポインタで
 渡される前の『型』の調べることは不可能です。→言語仕様より。
・以上。参考に。→一応、あるライブラリの関数とは何?

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

QVBAでテキストファイルの件数を調べる方法

Access2000のVBAで関数を使用して
ファイルのパス名、ファイル名を指定すれば、
テキストファイルの件数を検索し変数に返す
関数はありませんか?
   
通常テキストファイルを開き1件1件カウントを
取っていけば件数を知ることは可能ですが、
数千レコードのテキストファイルが複数個存在
する場合処理スピードが遅くなるため何か
最適な関数はありませんか?
よろしくお願い致します。

Aベストアンサー

こんにちは。maruru01です。

No.2の方のFileSystemObjectを利用する方法です。

行数 = CreateObject("Scripting.FileSystemObject").OpenTextFile(ファイルのフルパス, 8).Line

複数のファイルをカウントするなら、ファイルでループを回せばいいでしょう。

あと、FileSystemObjectの参考ページを紹介しておきます。

http://www.bcap.co.jp/hanafusa/VBHLP/FSOme.htm

http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/script56/html/jsobjFileSystem.asp

参考URL:http://www.bcap.co.jp/hanafusa/VBHLP/FSOme.htm,http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/l

こんにちは。maruru01です。

No.2の方のFileSystemObjectを利用する方法です。

行数 = CreateObject("Scripting.FileSystemObject").OpenTextFile(ファイルのフルパス, 8).Line

複数のファイルをカウントするなら、ファイルでループを回せばいいでしょう。

あと、FileSystemObjectの参考ページを紹介しておきます。

http://www.bcap.co.jp/hanafusa/VBHLP/FSOme.htm

http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/script56/html/jsobjFileSystem.asp

...続きを読む

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セルをクリックする事により、移動します。

QVBAで他のプログラムが起動しているか調べる方法

VBAで
D:\test\test.exe
が起動中か調べたいのですが
どのようにすれば良いですか?

http://www.vbalab.net/vbaqa/data/access/log/tree_532.htm

このページの方法を使えば、
exe以外のファイルが使用中かは調べることができたのですが
exeファイルの場合にはうまくいきません。

良い方法があれば教えてください。

Aベストアンサー

残念ながら・・・出来ません。
一応、プロパティの中に Handle ってのがあるのですが
取得できるのは ProcessID の値です。
以前、調べていて Handle を見つけた時は、
『やったー \(^o^)/』と思いましたが
ぬか喜びでした。。。orz

なお、当方の環境は、Windows7 Pro & Office2010 です。

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ランキング