• ベストアンサー

EXCELで同一フォーマットのシートを31日分簡単に作成する方法は?

お世話になります。 機械等の運転日誌を作成しております。 sheet1を1日、sheet2を2日とします。 2日のB1に入力した数値が、1日のA1にも入力され(飛び)、 3日以降も前日のA1に入力されるように、 sheet1のひながたで、31日分作成したいのです。 一枚ずつ1日(A1=sheet2!B1)、2日(A1=sheet3!B1)... という方法で31日分作成すると、かなり時間がかかってしまいます。 助けてください! よろしくお願いします!

質問者が選んだベストアンサー

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.3

こんにちは。 =INDIRECT("Sheet"&REPLACE(CELL("filename",A1),1,FIND("eet",CELL("filename",A1))+2,"")-1&"!A1") このようにして、Indirect 関数を使う方法もありますが、再計算関数ですので、後々、面倒なことになります。ですから、以下のようなマクロを作ってみました。 使い方: 最初に、該当するシートまたは、全部のシートを選択します。 次に、式を入力するセルにセルポインターを置きます。  Alt+F8 で、登録された、FormulaEnterという名前のマクロを探します。  式の中に入るセルの場所を聞いてきますので、それをマウスで選択します。  どのように入るか、例が出てきますので、良ければ、OK を押してください。  全部のシートを選択しても、最初のシートには、式は入力はされません。 マクロの登録 '<標準モジュールがベターですが、どこでもよいです。> Sub FormulaEnter() '前のシートを参照して、式を作るマクロ Dim myAdd As String, ActivecellAdd As String Dim mySheets As Sheets Dim ShIndex As Integer Dim ws As Worksheet Dim msg As String Dim myRng As Range  Set mySheets = ActiveWindow.SelectedSheets  ActivecellAdd = ActiveCell.Address(0, 0, 1)    If mySheets.Count = 1 Then MsgBox "複数のシートを選択してください。": Exit Sub    On Error GoTo ErrHandler    Set myRng = Application.InputBox("現在のシートで、参照するセル位置を指定してください。", Type:=8)  myAdd = myRng.Address(0, 0)  If ActiveSheet.Index = 1 Then ShIndex = 2 Else ShIndex = 1  msg = "=" & mySheets(ShIndex).Previous.Name & "!" & myAdd    If MsgBox("例:" & ActivecellAdd & "の位置に、以下のように入力されます。" & vbCrLf & vbCrLf & _   msg & vbCrLf & vbCrLf & "よろしいですか?(Sheet1に該当するシートには入力されません。)", vbOKCancel) = vbOK Then    For Each ws In mySheets    If ws.Index <> 1 Then    ws.Range(ActivecellAdd).FormulaLocal = "=" & ws.Previous.Name & "!" & myAdd    End If  Next ws End If ErrHandler:  mySheets(1).Select  Set mySheets = Nothing   End Sub

missile-boy
質問者

お礼

ご回答有り難う御座いました。 早速実行してみましたところ、、、 私の望んでいたものは、これです! VBって、いや、Wendy02さますごいですねえ。 感激しました。 またご指導のほど、よろしくお願いします!

その他の回答 (2)

  • maruru01
  • ベストアンサー率51% (1179/2272)
回答No.2

こんにちは。maruru01です。 以下のような方法があります。 まずは準備。 メニューの[挿入]→[名前]→[定義]で名前定義のダイアログを表示します。 そこで、 [名前]:適当な名前(仮に「次シート名」とします。) [参照範囲]:「=INDEX(GET.WORKBOOK(1),GET.DOCUMENT(87)+1)&LEFT(NOW(),0)」 と設定して[OK]します。 そうしたら「1日」のシートのA1に、 =INDIRECT("'"&次シート名&"'!B1") と入力します。 なお、この時2枚目のシートが何もないとエラーになりますが、構いません。 後は、このシートをコピーして増やせばいいです。 ちなみに、一番後ろ(シートタブが一番右)のシートには当然この数式は入れません。 もし既にシートを作ってある場合は、シートタブで先頭から一番後ろ(右)のシートを除いたシートまでをまとめて選択して、A1に上記の数式を入力します。 なお、シート位置で判断していますので、シート名を変更しても自動的に対応します。

missile-boy
質問者

お礼

ご回答有り難う御座いました。 maruru01さまの方法でもうまくできました。 感謝いたします。 また教えてくださいませ。

回答No.1

Sheet1が1日,Sheet2が2日の日誌であるとします。 また、こういうモノにはたいていどこかに日付が書いてあるものな ので,そのセルををthis_dayと仮定します。中身は年月なしの日付 だけを表す1から始まる整数とします。 =indirect("Sheet"&this_day+1&"!B1") が、翌日のシートのB1の内容を持ってくる式になります。

missile-boy
質問者

お礼

できました! 早々にご回答有り難う御座いました。 本当に困っていたので助かりました。

関連するQ&A