dポイントプレゼントキャンペーン実施中!

を作成できればと思っています。
このブック内にはたくさんのシートがあります。
毎日データ更新するのですが、そのうち1シートのみ、他の人に送信する必要があるので、たとえば(理想は)編集が済んだ時点で、あるシートに設けたコマンドボタンのようなものをクリックしたときに、その必要な1シートがコピーされて、別のエクセルファイルとして保存されるのが理想です。

マイドキュメント内の、「ファイル」という名前のファイルに保存をしたいと思っています。

今は、必要なシートのシート名をクリックして、コピーを選び、新しいシートを作成して、、、という作業をしています。これを端折ることができないか、と考えております。
なお、このシートを保存するとき、そのシート名は、ある特定のセルの入力値になることが理想です。
というのも、そのマクロが起動するたびに、全く同じ名前で上書き保存されていくのは困りますので、、、

どなたかお詳しい方がいらっしゃいましたらどうぞお願いいたします。

A 回答 (6件)

ANo.1です。



> この場合、シートの保存をする時点で、値のみの保存にしたらよろしいのでしょうか。

保存の前に値のみの状態にすれば良いと思います。
私のコードの場合、保存(ActiveWorkbook.SaveAs ……)の前に以下の4行を追加してみてください。

  Cells.Select
  Selection.Copy
  Selection.PasteSpecial Paste:=xlPasteValues
  Application.CutCopyMode = False

この回答への補足

>保存の前に値のみの状態にすれば良いと思います

ありがとうございます!朝ずっと考えていてそこまでは思いついたのですが、それをどういうコードで書けばいいのかが全くわかりませんでした。
いろいろ試したのですが、失敗しました。
教えていただいた4行で今から試してみます。ありがとうございます。

補足日時:2010/12/10 11:16
    • good
    • 0
この回答へのお礼

ありがとうございます!やってみたら本当にできました。本当に全て教えていただいたまんまですが、、(自分の力じゃなく、、)ありがとうございました!

自分で操作する分にはややこしくても気にならないのですが、いつも他人がやったときに簡単にできるようにしておかないと落ち着かなくて、、(仕事の引継ぎなどを考えると)

因みに、最後にひとつ質問なのですが、私の目から見ると、下記の二つは同じように見えます。これはなぜ二回コピー作業をしないといけないのでしょうか?

ActiveSheet.Select
ActiveSheet.Copy

Cells.Select
Selection.Copy

お礼日時:2010/12/10 11:29

余計なお世話の続きで、別にエラーや不具合がなければ、何でもよいと思います。



>ActiveSheet.Select
>ActiveSheet.Copy

これを行えば、シートモジュールも含まれますので、シートモジュールのマクロがあったり、ActiveX コントロールがある場合は、それらもコピーされますので、私は、他人にメールに添付する場合は、こういう方法は使いません。

なお、Select --> Selection は省き、
ActiveSheet.Copy NewBook.ActiveSheet

とします。しかし、シートそのものをコピーするのは、トラブルの発生するケースがたまにあります。名前定義やフォームのコピーされる時に、元とコピー先の関係が複雑になることがあります。たぶん、Excelのバグに近いものだと思います。ですから、特別の条件がなければ、シートコピーというのは、Cells.Copyだけで貼りつけます。今回、Cells.Copyで、PasteSpecial Paste:xlValues だけにしてしまいましたが、それでは、コピーされないものとしては、書式がありますから、以下のようにしたほうがよいです。

* の二行は、以下のように変えたほうがよいかもしれません。
> Application.SheetsInNewWorkbook = shCnt
> ThisWorkbook.Worksheets("Sheet1").Cells.Copy '*
> .ActiveSheet.Cells(1).PasteSpecial Paste:=xlValues '*
> With Application.Dialogs(xlDialogSaveAs)
     ↓
 ThisWorkbook.Worksheets("Sheet1").Cells.Copy .ActiveSheet.Cells(1)
 .ActiveSheet.UsedRange.Value = .ActiveSheet.UsedRange.Value
    • good
    • 0

こんなところかな?


なるべく易しい内容にしました。ThisWorkbook.Path が、My Document にある場合を想定していますが、そうでなければ、書き換えてください。ActiveX のボタンに設定しました。

>全く同じ名前で上書き保存されていくのは困りますので
今は、ファイル名は日付になっています。上書きに対しては、システム側のメッセージに任せてあります。なお、相手にメールで渡すブック名は、なるべくなら、拡張子を抜いたベースファイル名は8文字までにとどめたほうが良いかと思います。余計なお世話かもしれませんが。

'//
Private Sub CommandButton1_Click()
Dim myFolder As String
Dim shCnt As Integer
Dim orgDir As String
shCnt = Application.SheetsInNewWorkbook
orgDir = ThisWorkbook.Path
'------設定-------------
myFolder = ThisWorkbook.Path & "\ファイル\" 'ユーザーフォルダ
'------------------------
Application.SheetsInNewWorkbook = 1 'シートは1つ
ChDir myFolder
With Workbooks.Add
 Application.SheetsInNewWorkbook = shCnt
 ThisWorkbook.Worksheets("Sheet1").Cells.Copy
 .ActiveSheet.Cells(1).PasteSpecial Paste:=xlValues
 With Application.Dialogs(xlDialogSaveAs)
  .Show Format$(Date, "yymmdd")
 End With
  .ActiveSheet.Cells(1).Select
  .Close False
End With
ChDir orgDir
End Sub

'おまけ
Sub CationOnButton()
'ボタン名の変更
 On Error Resume Next
 With Me.CommandButton1
   .Caption = StrConv("ファィル保存", vbNarrow)
   .Font.Size = 9
 End With
 On Error GoTo 0
End Sub
    • good
    • 0

VLOOKUP参照の件は解決されたのですね?



多分その疑問は当然出てくるだろうと予想はしていました。
しかし、シートに設けたボタンとのご指定でしたので、敢えてそのままにしました。
また、アクティブシート以外でも可能ですが、シート構成などが私には解りませんでしたので
一番単純なアクティブシートとしました。

対応策としては、シート上のボタンでは無くツールバーのボタンという方法があります。

試しに、ツールバー上で右クリックしユーザー設定を選び、コマンドタブの中のマクロ分類を見ると
ユーザー設定ボタンが現れます。

このボタンをツールバー上に貼り付けて、マクロの登録を行う事が可能です。

ボタンはツールバーにしか有りませんから、コピーした後のファイルには痕跡が残りません。


「他の人が使ってもすぐわかるように、できれば簡単にしておきたいのです。」
この辺は、ツールバーのボタンに説明キャプションを付けるなどして対応願います。



操作を行うシートとコピー対象のシートを規定する方法など、他にも方法はありますが・・・・
流石にそこまではご容赦願います。

この回答への補足

回答をありがとうございます。よくわかりました。ただ、VLOOKの件は未解決でして、値のコピーにすれば解決するのかと思い、いろいろ調べたところSelection.PasteSpecial Paste:=xlValues
に行きついたのですが、使い方(また、これでよいのか)がよくわかりませんでした。
値のコピーでなくてもいいのですが、何せリンクが繋がったままで、シートの中身がころころ変わってしまっては困ります。当然わかりそうなことだったのでしょうが、、わからず申し訳ありません。
もし解決策があればどうぞお願いいたします。

補足日時:2010/12/10 00:29
    • good
    • 0

ざっとこんな感じ



Sub FileSaveMacro()

Dim fname As String

fname = Range("A1").Text

ActiveSheet.Select
ActiveSheet.Copy

ActiveWorkbook.SaveAs _
Filename:="C:\Documents and Settings\aaaaaaaa\My Documents\ファイル\" & fname & ".xls", FileFormat:=xlNormal


End Sub

・特定のセルが不明ですからA1で設定しています、適宜変更願います。
・マイドキュメントのアカウント名が不明ですので aaaaaaaa と仮定しています。適宜修正ください。

あとはマクロをボタンに登録すればOK
(但し、コピー対象がアクティブシートであるという前提です。)

細部については自身で設定調整願います。

この回答への補足

申し訳ありません。ド素人だったので、予定外のことが、、。というのもこのシートがコピーされ保存されたのですが、もともとVLOOKなどを使用して、ほかのシートとリンクしていたため、この、もとのエクセルをいじるたびに、この保存したシートの中身は変わってしまうようです。
何か防ぐ方法がもしあればどうぞお願いいたします。

補足日時:2010/12/09 17:55
    • good
    • 0
この回答へのお礼

できました!それもいとも簡単に、、素人の私でも!びっくりしました。
本当にありがとうございます。カンペキです。

ところでこれは、このシートがアクティブであることが条件、とのことですが、たとえばここにコピーボタン(このマクロ設定)を用意してしまうと、それが保存したシートを閲覧した人に見えてしまいますよね。
それでお尋ねは、他のシートにマクロ設定のボタンを用意して、、、というふうに記載したのですが、他のシートに設定すると、そちらのシートがアクティブになってしまいますよね。
何かもしいい案をお持ちでしたら、ご教授ください。もちろん、マクロ実行、というのを押すのも不便ではないのですが、他の人が使ってもすぐわかるように、できれば簡単にしておきたいのです。

お礼日時:2010/12/09 17:36

何だか、フォルダとファイル、ブックとシートの区別が付いていないような気がします。


こういう事でしょうか?

アクティブなシートを、シート一枚だけのブックとして、マイドキュメントの「ファイル」と言うフォルダに保存したい。
しかも、ブック名はシートの特定セルの値を使いたい。

それでしたらこんな感じ。
マイドキュメントのパスはOSによって違うのでCドライブにして有ります。実際のパスに合わせて変更してください。
シート名はA1セルの値を使用、A1セルが空の時は年月日時分秒をブック名に使用します。
また、同じ名前のブックがある時は保存せずにメッセージで警告しています。

Sub Sample()
  Dim sSheetname, sSheetFullpath

  sSheetname = Range("A1").Value
  If IsEmpty(sSheetname) Then sSheetname = Format(Now(), "YYYYMMDDhhmmss")
  sSheetFullpath = "C:\ファイル\" & sSheetname & ".xls"
  If Dir(sSheetFullpath) <> "" Then
    MsgBox ("同名ブック有り")
    Exit Sub
  End If

  ThisWorkbook.ActiveSheet.Copy
  ActiveWorkbook.SaveAs Filename:=sSheetFullpath
  ActiveWindow.Close
End Sub


#Excel2003で確認
    • good
    • 0
この回答へのお礼

たいへん、ありがとうございます。もうお人方のほうにも書いたのですが、保存したシートが(VLOOKがあるため)参照先であるもとのエクセルシートと常につながっていて、参照元をさわるたびに中身が更新されてしまう、というトラブルを予測しておりませんでした。
この場合、シートの保存をする時点で、値のみの保存にしたらよろしいのでしょうか。

お礼日時:2010/12/10 00:48

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