- 締切済み
人の名字をシート名とするに際し、読みが同じ時に
エクセルで特定のセル2つにそれぞれ名字と名前を入力し 基本的に名字をシート名としたい。 読みが同じ名字の時のみ、下の名前も込みでシート名としたいのですが どのようなVBAを組めばよいかお教えください。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- imogasi
- ベストアンサー率27% (4737/17069)
Excelのいろいろな処理は、シートにそのデータがあることが基本。 苗字についても同じ。名前の苗字+下の名前との間が1スペースで区切られているとして 、スペースまでの苗字部分を、新しい列に(ワーク列として使い)作成(設定)することを勧める。ワーク列を使いたくないというなら、もっとVBAに熟練してからにしてください。 この苗字列はエクセル関数ででも作れる(またVBAででも作れる)。 なお同じ名前のシートがあるかどうかは、VBAの簡単なメソッドなどない。 ForEachで総なめして探すほかない。Existが使えない。 VBSのDictionaryのような仕組みがるから勉強する手もあるが。 苗字と名前の間に元からスペースがないなら、手作業で入れること。 そして考えている苗字について、最上行からのCOUNTIF関数(をVBAで使い)2以上なら同じ苗字があるとして、名前全体をシート名とする。COUNTIFで1なら苗字部分を名前にする。WorkSheetFunction.Countif(()をWEBで照会のこと。 FindメソッドでもできるがCOUNTIF関数を使うのが簡単。 こういうロジックを紹介するから、VBAコードを組んでみること。 こういうロジックこそ、今後他の問題を考えるときでも大切で、人によって違うものを出してくることはあり得る。素の場合はどれがよさそうか判断せよ。 VBAコードを書いたものをまる写しで使うと、この大切な訓練ができない。
- ushi2015
- ベストアンサー率51% (241/468)
こんにちは 同姓同名の場合はどうするのですか?
- chie65536(@chie65535)
- ベストアンサー率44% (8741/19839)
Sub 名前付け(姓 As String, 名 As String) Static 通し番号 As Integer 通し番号 = 0 On Error GoTo 姓重複 ActiveSheet.Name = 姓 Exit Sub 姓重複: Resume 姓重複リトライ 姓重複リトライ: On Error GoTo 姓名重複 ActiveSheet.Name = 姓 & 名 Exit Sub 姓名重複: 通し番号 = 通し番号 + 1 Resume 姓名重複リトライ 姓名重複リトライ: ActiveSheet.Name = 姓 & 名 & 通し番号 End Sub 上記マクロを「標準モジュール」に追加します。 使用する場合は Private Sub CommandButton1_Click() Call 名前付け(Cells(1, 1), Cells(1, 2)) End Sub とか Private Sub CommandButton1_Click() Call 名前付け(Range("A1").Value, Range("B1").Value) End Sub とかって感じで呼び出します。 このマクロは、 姓に指定した引数と同じ名前のシートが無いなら、指定した姓を現在のシート名にする 姓に指定した引数と同じ名前のシートが他にあるなら、姓と名を繋いだ名前を現在のシート名にする 姓と名を繋いだ物と同じ名前のシートが他にあるなら、姓と名を繋いだ名前に、1、2、3の連番を振った名前を現在の現在のシート名にする と言う処理をします。 つまり 基本的に姓(苗字)をシート名にする 同じ苗字があれば、苗字と名前をシート名にする(下の名前も込みにする) 同姓同名(苗字も名前も同じ)があれば、苗字と名前に連番を付けてシート名にする と言う事です。