「一気に最後まで読んだ」本、教えて下さい!

こんにちは

毎月更新するシートを追加する
コマンドボタンを設置したいと思います。

シートをコピーし、名前を付けた範囲「翌月繰越」を F6にコピペ。
名前を付けた範囲「クリア範囲」をクリアし、カーソルをG6に置く
という、マクロを記録しました。

コマンドボタンをクリックすると、記録したマクロを
実行するようにしましたが、

Range("F6").Select

の、ところで止まってしまいます。
どのように修正したら良いでしょうか。



Private Sub CommandButton2_Click()

ActiveSheet.Copy Before:=ActiveSheet
Application.Goto Reference:="翌月繰越"
Selection.Copy
Range("F6").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Application.Goto Reference:="クリア範囲"
ActiveWindow.SmallScroll Down:=-48
Application.CutCopyMode = False
Selection.ClearContents
Range("G6").Select
End Sub


また、これを実行するとコピー元シートの左側にシートが追加されますが、
コピー元シートの右側に追加するにはどうしたら良いでしょうか。

Excelは2003です。
よろしくお願いいたします。

A 回答 (5件)

#3の回答者です。



ちょっと後で、思いついたのですが、点線から下のように、マクロを分離させたほうがよいです。
同じマクロを使いますし、ブック全体の文字量の負担が減ります。

shName = Format$(CDate(shName) + 31, "yyyy.mm")
このようにすれば、必ず、新しいシートは、次の月になっていきますし、2008.12 の次は、2009.01になります。

>翌月繰越には式が入っているため、値のみを貼付けたいのですが、

>.Range("F6").Value = Application.Range("翌月繰越").Value  

このように逆さにすればよいです。

もし、その名前登録した部分も、数式を値に換えるなら、

Application.Range("翌月繰越").Value =Application.Range("翌月繰越").Value

とすれば、値になります。

'シートオブジェクト
'--------------------------------------------

'コマンドボタンのマクロ
Private Sub CommandButton2_Click()
 Call CopySheet
End Sub

'--------------------------------------------

'標準モジュール

Public Sub CopySheet()
Dim shName As String
Dim dum As Variant
'シート名は、yyyy.mm 型に限ります。
  shName = StrConv(ActiveSheet.Name, vbNarrow)
  shName = Replace(shName & "/01", ".", "/", , , 1)
  shName = Format$(CDate(shName) + 31, "yyyy.mm")
  On Error Resume Next
   dum = Worksheets(shName).Range("A1")
   If Err.Number = 0 Then
    MsgBox "すでに、" & shName & " シートは存在しています。", 48
    Exit Sub
   End If
  On Error GoTo 0
  ActiveSheet.Copy After:=ActiveSheet
  With ActiveSheet
    .Name = shName
    .Range("F6").Value = Application.Range("翌月繰越").Value
    Application.Range("クリア範囲").ClearContents
    .Range("G6").Select
  End With
End Sub
    • good
    • 0
この回答へのお礼

ご回答有難うございます。

完璧!といいますか、
自分が考えていた以上に上手くできてしまいました。

本当に助かりました。

有難うございました。

お礼日時:2008/04/23 18:48

最近この手の質問が多いような。

。。(^^;;;

エラーの原因は、シート名を省略しているからです。
複数のシートを扱うときは、Range、Cellsの前に必ずシート名を付加しませう。

もちろん、名前が特定できないときはActiveSheetとしてもいいし(今回の場合)、
コピーしてできたシートをオブジェクト変数に入れてそれを使うとか。
 
(1)ActiveSheetを使う場合
'------------------------------------------
Private Sub CommandButton2_Click()
 ActiveSheet.Copy Before:=ActiveSheet
 ActiveSheet.Range("F6").Value = ActiveSheet.Range("翌月繰越")
 ActiveSheet.Range("クリア範囲").ClearContents
 ActiveSheet.Range("G6").Select
End Sub
'-------------------------------------------

(2)コピーしたシートをオブジェクト変数に入れて使う場合。
'---------------------------------------------------
Private Sub CommandButton2_Click()
 Dim NewSheet As Worksheet
 ActiveSheet.Copy Before:=ActiveSheet
 Set NewSheet = ActiveSheet
 NewSheet.Range("F6").Value = NewSheet.Range("翌月繰越").Value
 NewSheet.Range("クリア範囲").ClearContents
 NewSheet.Range("G6").Select
End Sub
'----------------------------------------------

何れにしろ、上記(1)(2)とも、
ActiveSheet.Copy Before:=ActiveSheet
このActiveSheetは、まだコピー元のシートです。
このコードが実行されあと、コピーしてできたシートがActiveSheetになります。
それは(2)のコードを見れば何となくでも分かると思います。

それから、コピー元の右にコピーしたいときは、
 Before:= => After:=

以上。
    • good
    • 0
この回答へのお礼

回答頂きありがとうございます。
大変分かりやすく、勉強になりました。

有難うございました。

お礼日時:2008/04/23 18:45

#2の補足です。


あえて、シートコピーで、オブジェクトなどの移動を考えたものだとしたら、このようになります。
shName は、例えば、4月なら、5月が新しいシートとして変更されていきます。


Private Sub CommandButton2_Click()
Dim shName As String
Dim dum As Variant
  shName = StrConv(ActiveSheet.Name, vbNarrow)
  shName = Val(shName) Mod 12 + 1 & "月"
  On Error Resume Next
   dum = Worksheets(shName).Range("A1")
   If Err.Number = 0 Then
    MsgBox "すでに、" & shName & " シートは存在しています。", 48
    Exit Sub
   End If
  On Error GoTo 0
  ActiveSheet.Copy After:=ActiveSheet
  With ActiveSheet
    .Name = shName
    Application.Range("翌月繰越").Copy .Range("F6")
    Application.Range("クリア範囲").ClearContents
    .Range("G6").Select
  End With
End Sub

この回答への補足

ご回答有難うございます。
上手く行きました。

シートを作成する際、翌月の「5月」と表示される点まで
ご配慮いただき有難うございます。

シート名「2008.04」を新しいシート名「2008.05」と
するには、どのようにしたらよいでしょうか。

また、翌月繰越の範囲を貼付ける際、
翌月繰越には式が入っているため、値のみを貼付けたいのですが、
どのようにしたらよいでしょうか。

補足日時:2008/04/23 15:38
    • good
    • 0

こんにちは。



そのマクロは分かりにくいですね。
最初に、記録マクロで作られたものは、「標準モジュール」で動くようには作られても、シートモジュールでは動くようにはなっておりません。

まず、セルやRangeの位置関係が、曖昧なのです。

'コマンドボタンのあるシートから、

ActiveSheet.Copy Before:=ActiveSheet '新しいシート
Application.Goto Reference:="翌月繰越" '前のシート
Selection.Copy '前のシートの翌月繰越
Range("F6").Select 'これはコマンドボタンのあるシートになくてはエラーが発生します。

それと、その「名前-登録」の使ったマクロは読めません。私が、以前から、ぼんやりとしていた問題のイメージが、このコードでやっとはっきりしました。

この場合は、「名前-登録」がどこにあるかにもよりますが、このName オブジェクトが、Applicationに対して一意ですから、コピー側に移ってしまうようです。そうすると、どうしようもないというか、そのマクロでは、偶然に誰かが場あり的に解答は出来ても、今の時点では、厳密には答えはありません。

「名前-登録」の処理をどのようにするかにもよります。
今の段階では、シートコピーをやめて、シートを新たに挿入するスタイルにして、元のシートのCellsコピーすれば、問題は減るとは思います。

>コピー元シートの右側に追加するにはどうしたら良いでしょうか。

ActiveSheet.Copy After:=ActiveSheet

ということでしょうか。
    • good
    • 0

マクロはよくわからないので的外れかもしれませんけど、


>Range("F6").Select
これってコピー先のシートを参照していますか?
別シートの場合はシート名を入れないとまずいとおもうんですが。
マクロだとちがうのかな?

この回答への補足

お返事ありがとうございます。
はい。
F6はコピー先シートのF6です。
コピー先は「元シート名(1)」になりますが、
これを指定するにはどうしたら良いのか分かりません…。

補足日時:2008/04/23 13:02
    • good
    • 0

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