[[20031105174927]] 『シート名を自動的につけることは可能でしょうか』(Ami) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『シート名を自動的につけることは可能でしょうか』(Ami)

すみません、初心者なもので、できるのかどうかもわからないのですが、
セルに入力した文字を、ワークシート名に反映させることは可能でしょうか。
例えば、最初のシートのあるセルに、「需用費」と入力して、オブジェクト
ボタンを押すと、あらかじめ用意してあったシートのシート名が「需用費」と
変わるような・・・。
いろいろなところで調べて、その逆のパターン(ワークシート名をセルに
取得する)はあり、応用できないものかと悩んだのですが、うまくいきません。
よろしくお願いいたします。


 自動で反映させるには、VBAによるプログラミングが必要です。
 一般機能でセルの値をシート名に反映させる機能はなかったと思います。
 (いったん掲載したサンプルは見当違いだったために削除)
 仕切りなおします。
 例えばSheet1の、A1、B1、C1の各セルに
 「車両費」「事務費」「光熱費」などの項目があった場合、
 その後に続くSheet2、Sheet3、Sheet4のシート名を
 「車両費」「事務費」「光熱費」に変更するということなのでしょうか。

 (KAMIYA)


さっそくのご回答ありがとうございます。
そうです。試しているのは、おっしゃるとおりのことです。
かんたんなVBAなら使っているのですが、記述例を教えていただけると
うれしいです。

 ちょっと勉強の為、一緒に考えさせて頂きました。最善の方法とも思えないのですが、一応動きました。
 Private Sub CommandButton1_Click()
    Dim i As Integer
        For i = 1 To Sheets.Count - 1
            Sheets(i + 1).Name = Cells(1, i).Value
        Next i
 End Sub

(ケン)


 こんばんは
 ケンさんのもので大丈夫だと思います。
 シート数が基準ですね。

 私のは方向性が違って、シートに設定された項目数を拾うものです。

 Sub SheetNameChange()

    Dim MYCOUNT As Long
    Dim MYSHEET As Worksheet
    Dim C As Range
    Dim i As Integer

    Set MYSHEET = Worksheets(1)
    MYSHEET.Activate

    'シート数が少ないときは追加します。
    MYCOUNT = Application.WorksheetFunction.CountA(MYSHEET.Rows(1))
    If Sheets.Count - 1 < MYCOUNT Then
        Do
            Worksheets.Add.Move after:=Worksheets(Worksheets.Count)
        Loop Until Sheets.Count - 1 = MYCOUNT
    End If
    '名前の同じシートができるとエラーになるので、暫定の名前に変更します。
    For i = 2 To Worksheets.Count
    Worksheets(i).Name = "TEMP" & i
    Next i
    '1行目の列方向へ順番にセルの値をシート名に当てはめます。
    MYSHEET.Activate
    For Each C In Range(Cells(1, 1), Cells(1, MYCOUNT))
        Sheets(C.Column + 1).Name = C.Text
    Next C
 End Sub

 一応、A1、B1、C1、と一行目に項目名が入っていると仮定しました。
 A1、A2という風にA列に項目が入っている場合は、
 CountAの引数を(MYSHEET.Columns(1))
 また、最後のFor Eachの部分で、
 Range(Cells(1, 1), Cells(MYCOUNT, 1))
 と行列番号をぎゃくにすればOK。
 (KAMIYA)


ケンさん、KAMIYAさん、ありがとうございます。
実際に自分の作っているものは、名前に反映させたいセル(B12:B46)があるのが
1枚目のシート(予算)で、そのあと2枚、名前を書き換えなくてもよいシートがあり、
シート名を自動でつけたいシートは4枚目からになります。
そこで、おふた方の記述の、シートの数値や、セルの座標(?)をそれに合わせて
書き換えて試してみたのですが、どちらも、
「実行時エラー1004、アプリケーション定義またはオブジェクト定義のエラー」と
表示されてしまいます。KAMIYAさんの「暫定の名前〜」をつけるところまでは
正常に動作しています。名前を割り振るところで止まります。
セルの座標やシートの数値以外にも、どこか書き換えなければいけないのでしょうか。
エラーの意味さえ飲み込めない素人ですが、アドバイスのほどよろしくお願い
いたします。
(Ami)


 >と行列番号をぎゃくにすればOK。
 などと大口をたたいておきながら、他にも手直しするところが
 いっぱいあったみたいです。すみません。

 セル範囲固定であれば、設計は楽になります。

 Sub SheetNameChange()

    Dim MYCOUNT As Long
    Dim MYSHEET As Worksheet
    Dim C As Range
    Dim i As Integer

    Set MYSHEET = Worksheets(1)
    MYSHEET.Activate

    'シート数が少ないときは追加します。
    MYCOUNT = Application.WorksheetFunction.CountA(MYSHEET.Range("B12:B46"))
    If Sheets.Count - 3 < MYCOUNT Then
            Worksheets.Add after:=Worksheets(Sheets.Count), _
                           Count:=MYCOUNT - (Sheets.Count - 3)
    End If
    '名前の同じシートができるとエラーになるので、暫定の名前に変更します。
    For i = 4 To Sheets.Count
    Worksheets(i).Name = "TEMP" & i
    Next i
    'B12から順番にセルの値をシート名に当てはめます。
    MYSHEET.Activate
    i = 4
    For Each C In Range("B12:B46")
    If C.Text <> "" Then
        Sheets(i).Name = C.Text
        i = i + 1
    End If
    Next C
 End Sub

 多少削ったり増えたりした部分がありますが、
 セル範囲はRange("B12:B46")のような書き方のほうがわかりやすいと思い
 変更しています。
 (シートの追加と暫定シート名は蛇足かも?)
 (KAMIYA)


 この件についてはずっと以前に議論しました。
 (kazu)
[[20020519104759]] 『セルの内容によってシート名を変更できる?』(なお) 


 kazuさま、こんばんは
 おっしゃるとおりです。
 確かに後の管理は大変ですから。
 とくにブックの内容に変更があったときなど。
 それを踏まえたうえでお使いになられるのがよろしい、と言うことでしょうか。
 今回の件もあらかじめ一連のシート名を設定したブックから必要なシートを
 コピーしてくることでもよいかもしれませんね。

 「それが可能かどうか」にこだわりすぎたかもしれません。
  (KAMIYA)


 [KAMIYA]さん、いつもありがとうございます。
 今回の件は私がもっと早く以前の書き込みのことを思い出すべきでした、
 ごめんなさい。
 基本的に危険を踏まえた上で使うということでよいと思います。
 (kazu)


みなさん、どうもありがとうございました。おかげさまでできました!!1〜3のシートのデータが、4〜のシートに費目別に割り振られるように式を組んだのですが、シート名だけが内容と一致せず使いづらい表になっていたのです。課や用途、年によって費目が違うこの表を、複数の課で複数使っていたので、職員からの要望も強く、長いこと試行錯誤していたことでしたので、大変感動しています。本当にありがとうございました。(Ami)

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.