教えて!gooグレードポイントがdポイントに!

セルA1に、別のブックのセルから=の式で引張って来た日付表示のデータ(H19.10.10)が入っています。
その日付を常にそのシート名に反映させるにはどうしたら良いでしょうか?宜しくお願いします。

教えて!goo グレード

A 回答 (3件)

こんばんは。



>参照元のデータが更新されると同時にシート名も変わるといいのですが・・・。
もちろん、こういう方法もできますが、イベントというのは、常に、マクロを待機状態にしているわけですから、負担が大きくなります。おまけに、こういう大元のオブジェクトのプロパティを頻繁に、シート名を換えるような内容は、ブックを壊す原因にもなりますから、できる限り気をつけて扱ってください。

本来は、自分が明示的に行う、一般プロシージャのほうがよいです。
自動的に行うのは、リスクが高いです。


ThisWorkbook に貼り付けてください。

Application.Undo '設定を戻す は、不要だったら抜いてください。
単独にこのプロシージャだけでよいです。

以下のマクロの日付値は、ワークシートに Text 関数はお使いにはならないでください。シリアル値を入れ、書式で設定してください。

二つのマクロは、絶対に同時に使わないでください。片方だけにしてください。無限ループになる可能性があります。

---------------------------------------------------------------

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
  Dim myDate As String
  If Target.Address <> "$A$1" Then Exit Sub
  On Error GoTo ErrHandler
  If IsDate(Target.Text) Then
    myDate = Format$(Target.Value, "GEE.M.D")
    If Sh.Name <> myDate Then
      Sh.Name = myDate
    End If
  End If
  Exit Sub
ErrHandler:
  MsgBox Sh.Name & "のシート名の変更はできませんでした。", 32
  Application.Undo '設定を戻す
End Sub
-----------------------------------------------------------------
トラブルに責任は持ちませんが、以下のようにすれば可能です。
こちらは、ActiveWindow になっていなくとも設定されますから、エラーを吐きません。シート名が変わらない場合は、シート名が同じかエラーが発生しています。

Private Sub Workbook_SheetCalculate(ByVal Sh As Object)
  Dim myDate As String
  Dim sht As Worksheet
  On Error Resume Next
  Application.EnableEvents = False
  For Each sht In ThisWorkbook.Worksheets
    If IsDate(sht.Range("A1").Text) Then
      myDate = Format$(sht.Range("A1").Value, "GEE.M.D")
      If sht.Name <> myDate Then
        sht.Name = myDate
      End If
    End If
  Next sht
  Application.EnableEvents = True
  On Error GoTo 0
End Sub
    • good
    • 1
この回答へのお礼

おばんでございます。
Wendy02様、ありがとうございます。
お力を頂き、お陰様で仕事を完成させて頂きました。
非常に丁寧にお教え下さったご説明、超初心者の私にとりましては難しく、
今回は、そのままコピーさせて頂きましたが、これからよく勉強させて頂きたく存じます。
この度初めて、教えて!gooさんに質問させて頂いたのですが、
見ず知らずの私のような者に、こんなに親切丁寧にして頂けたこと、ものすごく感激しています。お会いして直接お礼を申し上げたい気持ちで一杯です。本当にありがとうございました。
蛇足ですが(失礼な話になりますが)亡くした愛犬Wendyと同じお名前でしたことも・・・。本当にありがとうございました。感謝多謝。

お礼日時:2007/10/11 22:27

>A1が計算式の形になっているため参照元のブックのデータ変更と同時にシート名が変わってくれません。



コード(プログラム)が解らないので、文面だけでは何とも言えません。
エラーが表示されるなら、エラー内容も記載して下さい。
また、他のブックが更新された事を知るためのイベントも無いので、自動的に変化を知ることは不可能だと思います。

シート名には、"/"等の一部の記号が使えないので、別の文字にするなどの工夫が必要です。

With Sheets("Sheet1")
.Name = Format(.Range("A1"), "yyyy-mm-dd")
End With
    • good
    • 0
この回答へのお礼

回答頂き誠にありがとうございます。
VBAは全く初心者で、急な必要に迫られコードは探してコピーして作りました。
日付の表示の仕方は、H19-10-10 のようにしているため、
エラーはおっしゃる通り使えない記号を使っていることへの指摘でした。(実行時エラー1004)ただし、TEXTで文字列にしてからは出ていません。
文字列でもかまわないので、参照元のデータが更新されると同時にシート名も変わるといいのですが・・・。
すみません。イベントのやり方もわかりません。
下記が現在のコードです。
宜しくお願い申し上げます。

Option Explicit

Function CheckName(AName As String) As Boolean
Dim i As Long
CheckName = True
For i = 1 To ThisWorkbook.Sheets.Count
If AName = Sheets(i).Name Then
CheckName = False
Exit Function
End If
Next
End Function

Private Sub Workbook_SheetChange(ByVal Sh As Object, _
ByVal Source As Range)
If Source.Row = 1 And Source.Column = 1 Then
If Sh.Range("A1") <> "" And CheckName(Sh.Range("A1")) Then
Sh.Name = Sh.Range("A1")
End If
End If
End Sub

お礼日時:2007/10/10 17:09

自動で書き換えるにはマクロ(VBA)で行うしかありません。

    • good
    • 0
この回答へのお礼

ThisWorkbookにVBAで文字列であれぱシート名にさせるところまでは出来ました。しかし、日付表示のままだとうまく行きません。
又、A1の式にTEXT関数を加えて文字列表示にしてなんとか見た目は日付表示にしたのですが、A1が計算式の形になっているため参照元のブックのデータ変更と同時にシート名が変わってくれません。
アドバイスお願いできますでしょうか?

お礼日時:2007/10/10 16:12

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

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

教えて!goo グレード

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

このカテゴリの人気Q&Aランキング