- ベストアンサー
変数の入れ方がわかりません。教えてください。
ブックに溜まったシートを別フォルダ移動させたいのですが、シート名(変数)の入れ方がわかりません。 当方、ビギナーで参考書頼りに、組んでみました。 もちろん動きません ToT どなたかご指導願います。 ・シートは稼働日の"yymmdd"名で数ヶ月分です (休日は作成されませんが、順番に並んでいます) ・ブックメインシート、セルA1,A2に移動シート自至を入力 ・入力された日を頼りに、シート分を移動、保存 やりたい処理、ご理解いただけたでしょうか? For分の日付自→至で、飛び日があった場合は、処理できるのでしょうか? 構文もたぶんメチャメチャと思いますが、どなたかご指導願います。 ----------------------------------------------------------- Dim Wb As Worksheet Dim Hiduke As Variant Dim Sdate As Variant,Edate As Variant Dim i As Integer Sub ido() Sheets("main").Select Sdata = Range("A1") Edata = Range("A2") For i Format(Sdata, "yymmdd") to Format(Edata, "yymmdd") Hiduke = ************* Sheets("Hiduke").Move ChDir "C:\仕事" Set Wb = ActiveWorkbook Wb.SaveAs CreateObject("WScript.Shell").SpecialFolders ("C:\仕事") _ & "\" & Format(Hiduke, "yymmdd") ActiveWorkbook.Save ActiveWorkbook.Close Next i Sheets("main").Select End Sub
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
ちょっと修正してみた Sub ido() Dim Wb As Worksheet Dim Hiduke As Variant Dim Sdate As Variant, Edate As Variant Dim i As Integer Dim Wst As Worksheet '追加 Dim ii As Integer '追加 '1 ちょっと修正 ------------- With Sheets("main") Sdate = .Range("A1").Value Edate = .Range("A2").Value End With '------------------------------ '2 修正・追加 --------------- For i = 0 To Edate - Sdate For ii = 1 To Worksheets.Count Set Wst = Worksheets(ii) If Format(Sdate + i, "yymmdd") = Wst.Name Then Hiduke = Wst.Name '------------------------------ '3 ちょっと修正--------------- Sheets(Hiduke).Move ChDir "C:\仕事" Set Wb = ActiveWorkbook Wb.SaveAs CreateObject("WScript.Shell").SpecialFolders("C:\仕事") _ & "\" & Hiduke & ".xls" ActiveWorkbook.Save ActiveWorkbook.Close End If Next ii '------------------------------ Next i Sheets("main").Select End Sub 3の部分は検証してませんが、多分大丈夫と思いそのままにしています 参考にしてください
その他の回答 (4)
- Wendy02
- ベストアンサー率57% (3570/6232)
こんばんは。 初心者とか関係なく、こういうものは、まず、手作業がきちんとわかっていないと、コードになりませんね。 >一応、1シート、1ブック出力が理解できるようになればと。。 参考書にはないかもしれませんが、#2さんの書き込みにヒントはあります。良く読んでみてください。 '標準モジュールのみ Sub aidR() Dim Sdate As Date Dim Edate As Date Dim Wb As Workbook Dim bkName As String Dim i As Long '最後に\ をつける Const myPATH = "C:\" '......パス名 Set Wb = ActiveWorkbook Sdate = Worksheets("main").Range("A1").Value Edate = Worksheets("main").Range("A2").Value On Error Resume Next For i = 0 To Edate - Sdate With Wb.Worksheets(Format$(Sdate + i, "yymmdd")) bkName = .Name .Copy ActiveWorkbook.SaveAs myPATH & .Name ActiveWorkbook.Close False End With Next i On Error GoTo 0 End Sub なお、以下、False をつけるのは、慣習的なものです。 ActiveWorkbook.Close False Save した後に、微妙に値が変わるものがある時に、無視する方法です。 また、今回は、 Sdate = Worksheets("main").Range("A1").Value Edate = Worksheets("main").Range("A2").Value 自~至 ですから、その間が必ずあるとは限りません。Sheet を対象にしていませんから、存在しないシートを想定して、On Error Resume Next を入れてあります。 それと、シートMove にしたら、元のブックを切り取ってしまうことでありませんか?元のブックはそのままにしておいても良いと思います。
お礼
Wendy02さん、ありがとうございます 自分が作った構文と何処がどう違うのかが、よく解ります。 この処理は、仕事上パターン化する感じがするので、 よく勉強させて頂こうと思います。
- n-jun
- ベストアンサー率33% (959/2873)
#1です。 >本当は、たくさんある"yymmdd"シートを月間でまとめて >一つの"yymm"ブックに出力すれば、後々のデータ管理が楽なのでしょうが 構わず"yymmdd"のシートを"yymm"のブック毎に移動させてしまう一例です。 全て移動されると困る場合には修正が必要です。 Sub try() Dim myDic As Object Dim wb1 As Workbook Dim wb As Workbook Dim ws As Worksheet Dim sh As Worksheet Dim myKey Set myDic = CreateObject("Scripting.Dictionary") Set wb1 = ThisWorkbook Application.ScreenUpdating = False For Each sh In wb1.Worksheets If sh.Name <> "main" Then myDic(Left(sh.Name, 4) & "_") = Empty End If Next For Each myKey In myDic.keys For Each sh In wb1.Worksheets If InStr(sh.Name, Left(myKey, 4)) > 0 Then If wb Is Nothing Then wb1.Worksheets(sh.Name).Move Set wb = ActiveWorkbook Else wb1.Worksheets(sh.Name).Move after:=wb.Sheets(wb.Sheets.Count) End If End If Next wb.SaveAs Filename:="C:\仕事" & "\" & Left(myKey, 4) & ".xls" wb.Close Set wb = Nothing Next Application.ScreenUpdating = True Set myDic = Nothing End Sub ご参考まで。
お礼
n-junさん、まさに願ったりの処理です! IF飛んでNEXT・・・頭が混乱しそうです ただ、"main"シート以外をシフトさせて。。。なんとなく解ります(^^;; しっかり理解して参考にさせて頂きます 大変ありがたいです、どうも^^v
- imogasi
- ベストアンサー率27% (4737/17069)
質問は1ブックの各シートをシート1つづつのブックに分ける課題だと解して。 1ブックのシート名を捉えるのは Sub test01() Dim sh As Worksheet For Each sh In Workbooks("Book1.xls").Worksheets MsgBox sh.Name Next End Sub です。 A名前を捉えるか(上記)、 Bシートのインデックス番号を捉えるか2つのやり方が有る。 シートのコピーはマクロの記録を参考にすること。 シートタブ部で右クリック 移動またはコピー 新しいブック コピーを作成する という操作です。 ーー コードは、それらを参考に Sub test01() Dim sh As Worksheet For Each sh In Workbooks("Book1.xls").Worksheets MsgBox sh.Name Workbooks("Book1.xls").Activate bn = sh.Name & "C" & ".xls" Set nb = Workbooks.Add sh.Copy after:=nb.Worksheets(1) nb.Activate nb.SaveAs sh.Name & "C" & ".xls" nb.Close Next End Sub です。 新しいブック名は上記では「シート名」+C+「.xls」 にしてますが、適当に。 上記では、新しいブックはカレントフォルダに出来ますが、他の指定ホルダにを希望ならSaveAsの後のブック名の前にフォルダへのパス名をつける。 ーーー 簡単なようだが、ビギナーには難しいものと思う。別の易しいコードの回答が出るかどうか。 ーーー ワークシートの新規作成やブックを閉じるで時間がかかります。 あとApplication.ScreenUpdating = False、True などを入れるとか、Msgboxを省くとかして、処理が早くなるようにしてください。
お礼
imogasiさん、ありがとうございます 「マクロの記録」使い方を最近覚えて、 こういう処理をするのかぁと感心しきりです。 早く応用ができるようにがんばります
- n-jun
- ベストアンサー率33% (959/2873)
移動先のブック ⇒移動先はひとつのブックなのか?1シートを1ブックとするのか? ⇒複数ブックの場合、保存先は同じなのか?複数に分けるのか?
補足
保存先は、すべて同じです。 本当は、たくさんある"yymmdd"シートを月間でまとめて 一つの"yymm"ブックに出力すれば、後々のデータ管理が楽なのでしょうが、 VB始めたばかりの者で、なんかとても難しそうです(ーー;) 一応、1シート、1ブック出力が理解できるようになればと。。 がんばります
お礼
hige_082さん、ありがとうございます。 こうやって、自分のコードを順追って頂くと とても解りやすいです、特ににFor分など、あぁこうやるのか、、と^^ これをベースにがんばってみます!