ちょっと先の未来クイズ第4問

関数もマクロもまだまだ理解できていない初心者です。
エクセルで送り状を作成していまして、毎回「原紙」のシートをコピーして必要事項を入力し
プリントアウトして使っています。
この中の項目に連番でナンバーを振る欄があり(位置は固定されています)、今現在はものすごく原始的に前のシートを確認して、ナンバーを手入力しています。
これを、原紙のシートをコピーした際に、自動でナンバーが振られるようにしたいのですが・・・
何かいい方法はありませんでしょうか??
シート名を日付で管理し、後で確認できるよう、数か月分は保存している状態です。
また、ただの送り状なので、データベース化する必要はありません。
どなたかお知恵をお貸し下さい、よろしくお願い致します。

A 回答 (2件)

マクロでやって見ました。


新たなシートを作る時に以下のマクロを動かします。

テンプレートシートのコピーを行い、その際に該当セルの最大値を串刺しで計算。
その値+1を新たに追加したシートの該当セルに入れています。
コード中の連番を入れるセルや、原紙のシート名は実際の物に合わせて下さい。

Sub sample()
  Dim sTarget, sSheet, sCount

  sTarget = "A1" '連番を入れるセル
  Sheets("原紙").Copy After:=Sheets(Sheets.Count) '原紙シートをコピー
  sSheet = "'" & Sheets(1).Name & ":" & Sheets(Sheets.Count - 1).Name & "'!"

  sCount = Evaluate("=max(" & sSheet & sTarget & ")") '該当セルの最大値取得
  If IsNumeric(sCount) = False Then sCount = "0"
  Range(sTarget).Value = Int(sCount) + 1
  'シート名を 日付_シート枚数に変更
  Sheets(Sheets.Count).Name = Format(Now(), "YYYYMMDD") & "_" & Sheets.Count
End Sub
    • good
    • 3
この回答へのお礼

す・・・すごいです!!
これがしたかったんです!!
マクロを勉強すると、いろいろなことができそうですね。
ちょっと興味がわいてきました。
ありがとうございました!!

お礼日時:2011/07/12 15:53

ブックを開く


ALT+F11を押す
現れた画面で挿入メニューから標準モジュールを挿入する
現れたシートに下記をコピー貼り付ける

Public Function LeftSheet(ByVal Target As Excel.Range)
Application.Volatile
LeftSheet = Target.Parent.Previous.Range(Target.Address)
End Function

原紙シートの連番セル(仮にA1セル)に
=LeftSheet(A1)+1
と数式を記入しておく

原紙シートを複写してシートの並びの一番右に配置する
一枚「左隣のシート」の指定セルの値を自動で取ってくるので,結果して連番の+1が自動的に計算される。

#言わずもがなですが,左左と追っていって一番先頭にするシートの所定セルには,連番の開始番号(1番なり「数ヶ月分」のストックの最初の番号)を記入しておきます。



#上述は(ご質問でははっきり書かれていませんが)シートを「右へ右へと追加していく」状況を想定しています
「左に向けて新しいシートを追加している」場合は別の関数を作成しなければいけません。回答を応用して,ご自分で作成してみてください。

また「シートの並びは順不同(=デタラメ)」で,「シート名の日付順にしたい(しかも毎日とは限らず飛び飛び日付の場合もある。同じ日付で更に子番号で仕分ける場合もある)」とか,考え出すともっと細かいルールが実はありましたというお話なら,それならそれで全然違うことを考える必要があります。
    • good
    • 2
この回答へのお礼

ありがとうございます!!
ちょっとまだ私が勉強不足なようで、上手くいかない部分が・・・
ちょっと調べてみたいと思います。
「左に向けて新しいシートを追加する」のも可能なんですね!!
大変参考になりました、ありがとうございました!!

お礼日時:2011/07/12 15:55

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

このQ&Aを見た人はこんなQ&Aも見ています


おすすめ情報

このQ&Aを見た人がよく見るQ&A