[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『イベントの実行について』(sige)
よろしくお願いします。
R4セルに日付を入力しA1セルには
1.A1==TEXT(R4,"gyyy年m月")←R4セルに1ヵ月加算したい
例R4が2016/6/16の場合 A1は「平成28年7月」としたい
また以下の通り
2.R4日付入力と同時にシート名を以下イベントで変化させたいのですが
良い案があれば教授お願いします。
以下マクロでは一旦A1をアクティブにしないと動作しないので
Private Sub Worksheet_Change(ByVal Target As Range)
On Error GoTo ERR_HANDLER
If Target.Address(False, False) = "A1" Then ActiveSheet.Name = Range("A1").Value End If Exit Sub ERR_HANDLER: MsgBox "現在のA1セルの値はシート名にできません。" End Sub
Excel2016 OS:Windows10
< 使用 Excel:unknown、使用 OS:unknown >
A1セルはR4セルが変更された場合に同時に変更されるのだからTargetがR4セルかどうかをチェックすればいいのでは?
A1セルの式は =TEXT(EDATE(R4,1),"gyyy年m月") で。 (ねむねむ) 2016/03/24(木) 15:20
すでにねむねむさんから回答がありますが、ちょっと気になったことがあるので書きます。
通常平成○年と表示する場合は =TEXT(EDATE(R4,1),"ggge年m月") のように "ggge" にすると思うのですが、なぜ "gyyy" なのかなと・・・。 (se_9) 2016/03/24(木) 15:25
se_9さん、 確かに。 どちらも結果が同じなので気づいていなかった… (ねむねむ) 2016/03/24(木) 15:32
???さんの式だとたとえばR4セルが2016/1/31・2016/3/31の場合、H28年3月・H28年5月になってしまわないか? (ねむねむ) 2016/03/24(木) 15:35
=TEXT(EDATE(R4,1),"gyyy年m月") A1表示はうまくいきました。 また、TargetをR4に変更しイベントも動作しました。
ここから相談ですが、H28年7月スタートで右側にシートが全部で12枚(1年分)あります
最初のシート変更で、全てのシート名を変更したいのですがマクロで可能でしょうか?
以下にシート名を表記します。
H28年7月_8月_9月_10月_11月_12月_H29年1月_2月_3月_4月_5月_6月
よろしくお願いします。
(sige) 2016/03/24(木) 18:05
For i = 1 To 12
Worksheets(i).Name = Worksheets(i).Range("Q2").Value
Next i
For j = 1 To 12
Worksheets(i).Name = Worksheets(i).Range("A1").Value’★
Next j
End Sub
★部分で以下のエラー
実行時エラー1004 入力されたシート又はグラフの名前がが正しくありません。
次の点を確認して修正して下さい。
?文字入力が31文字以内であること
?次の使用できない文字が含まれていないこと。;¥/* かっこ[ ]
?名前が空白でないこと。
マクロの記録で
Sub Macro2()
'
' Macro2 Macro
’ 途中省略
Sheets("10月").Select Range("A1").Select ActiveCell.FormulaR1C1 = "=TEXT(EDATE(R[3]C[16],1),""gyyy年m月"")" Sheets("11月").Select Range("A1").Select ActiveCell.FormulaR1C1 = "=TEXT(EDATE(R[3]C[16],1),""m月"")"
End Sub
上記の場合は各シートモジュールに以下を書き込んでいます
Private Sub Worksheet_Change(ByVal Target As Range)
On Error GoTo ERR_HANDLER
If Target.Address(False, False) = "A1" Then ActiveSheet.Name = Range("A1").Value End If Exit Sub ERR_HANDLER: MsgBox "現在のA1セルの値はシート名にできません。" End Sub
1シートずつ "A1"セレクトし"F2"キーでENTERで、実行では変更できた。のですが・・・
以上のような、動作チェックしてみてみたのですが、決定的な事が解りませんでした
お知恵拝借よろしくお願いします。
(sige) 2016/03/25(金) 01:30
上級者からもっとすっきりしたコードが提示されると思うので参考程度にしてください。
Private Sub Worksheet_Change(ByVal Target As Range)
Dim i As Long
On Error GoTo ERR_HANDLER
Sheets(1).Name = Format(DateAdd("m", 1, Range("R4").Value), "ge年m月") For i = 2 To 12 If Target.Address(False, False) = "R4" Then If Format(DateAdd("m", i - 1, Range("R4").Value), "e") = Format(DateAdd("m", i, Range("R4").Value), "e") Then Sheets(i).Name = Format(DateAdd("m", i, Range("R4").Value), "m月") Else Sheets(i).Name = Format(DateAdd("m", i, Range("R4").Value), "ge年m月") End If End If Next
Exit Sub
ERR_HANDLER: MsgBox "現在のA1セルの値はシート名にできません。"
End Sub
ちなみにA1の関数は =TEXT(EDATE(R4,1),"ge年m月") でもいいですね。
※追記 もしかしてA1セルに数式入れる必要ないのかな? (se_9) 2016/03/25(金) 06:27 修正07:35
ちなみに試しに現在はR4に2016/6/16と入力"H28年7月"でスタートしてますが
R4に別の日付 "2016/5/16"を入力した場合"現在のA1セルの値はシート名にできません。"と
出てしまいました。月初めをフリーに変更出来るでしょうか?
何度もすみませんがよろしくお願いします。
(sige) 2016/03/25(金) 09:02
こちらではR4セルに 2016/5/16 と入力したらH28年6月〜(H29)5月のシートが作成されました。 R4セルが文字列になっているということはありませんよね? ちなみに/(スラッシュ)はシート名には使えません。 (se_9) 2016/03/25(金) 09:12
>Sheets(i).Name = Format(DateAdd("m", i, Range("R4").Value), "m月") の前に MsgBox Format(DateAdd("m", i, Range("R4").Value), "m月")
>Sheets(i).Name = Format(DateAdd("m", i, Range("R4").Value), "ge年m月") の前に MsgBox Sheets(i).Name = Format(DateAdd("m", i, Range("R4").Value), "ge年m月") と入れておいてどんなシート名をつけようとしているか確認してはどうか?
デバッグに慣れていればブレークポイントを設定しておいて確認してもいいが。
(ねむねむ) 2016/03/25(金) 09:18
R4セルが文字列になっているということはありませんよね? 無いです。
>ちなみに/(スラッシュ)はシート名には使えません。
"gyyy年m月"書式ですのでありません。
ただ、シート名が以前のものが残った状態のままマクロ実行しますので
シート名を書き換える作業中に同名処理が発生し、引っかかるのではないかと
思っているのですが、いかがでしょうか?
よろしくお願いします。
(sige) 2016/03/25(金) 12:42
>シート名が以前のものが残った状態のままマクロ実行しますので
その情報を最初に書いてほしかったです。あまりいい方法ではないかもしれませんが
Private Sub Worksheet_Change(ByVal Target As Range)
Dim ws As Worksheet Dim i As Long
For Each ws In Worksheets ws.Name = Int(Rnd * 10000) Next
On Error GoTo ERR_HANDLER
Sheets(1).Name = Format(DateAdd("m", 1, Range("R4").Value), "ge年m月") For i = 2 To 12 If Target.Address(False, False) = "R4" Then If Format(DateAdd("m", i - 1, Range("R4").Value), "e") = Format(DateAdd("m", i, Range("R4").Value), "e") Then Sheets(i).Name = Format(DateAdd("m", i, Range("R4").Value), "m月") Else Sheets(i).Name = Format(DateAdd("m", i, Range("R4").Value), "ge年m月") End If End If Next
Exit Sub
ERR_HANDLER: MsgBox "現在のA1セルの値はシート名にできません。"
End Sub (se_9) 2016/03/25(金) 14:34
(sige) 2016/03/25(金) 14:54
For Each ws In Worksheets ws.Name = Int(Rnd * 10000) Next
↑のコードは乱数を発生させブック内のすべてのシート名を書き換えるというものです。 それが原因で13枚目のシートも書き換えられてしまうので
For Each ws In Worksheets If ws.Name <> "Sheet13" Then ws.Name = Int(Rnd * 10000) Next
にしてください。 (se_9) 2016/03/25(金) 15:03
For Each ws In Worksheets If ws.Name <> "Sheet13" Then ws.Name = Int(Rnd * 10000) Next (sige) 2016/03/25(金) 15:25
VBエディタのプロジェクトエクスプローラーで「Sheet13(祝日)」と表示されているのであれば そのシートの名前は「Sheet13」ではなく「祝日」ではないのか? (ねむねむ) 2016/03/25(金) 15:34
For Each ws In Worksheets If ws.Name <> "祝日" Then ws.Name = Int(Rnd * 10000) Next (ねむねむ) さん ありがとうございました。 上記でうまくいきました。 (se_9)さん 昨日からお世話になり ありがとうございました。 感謝!
(sige) 2016/03/25(金) 18:01
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.