Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


7579 / 13645 ツリー ←次へ | 前へ→

【37937】同一苗字の人の処理 Cuore=Tane 06/5/23(火) 19:38 質問[未読]
【37939】Re:同一苗字の人の処理 ゆみ 06/5/23(火) 19:50 発言[未読]
【38167】Re:同一苗字の人の処理 Cuore=Tane 06/5/28(日) 9:13 お礼[未読]
【37940】Re:同一苗字の人の処理 Kein 06/5/23(火) 21:23 回答[未読]
【37941】Re:同一苗字の人の処理 Kein 06/5/23(火) 21:25 発言[未読]
【38166】Re:同一苗字の人の処理 Cuore=Tane 06/5/28(日) 9:10 お礼[未読]
【37951】Re:同一苗字の人の処理 ハチ 06/5/24(水) 8:54 回答[未読]
【38168】Re:同一苗字の人の処理 Cuore=Tane 06/5/28(日) 9:14 お礼[未読]

【37937】同一苗字の人の処理
質問  Cuore=Tane  - 06/5/23(火) 19:38 -

引用なし
パスワード
   たとえば、赤井さんという人が2人いた場合、1人目は問題なく作成されますが、2人目は同一姓のため、作成できないというエラーが出ます。

同一苗字の方が2人以上いた場合は日程表 赤井(2)と表示されるようにするにはどうすればいいのでしょうか?
[同一苗字が3人いた場合は(3)と数字が1つずつ大きくなるようにしたい。]
出来れば、日程表 赤井を利用してコピーを作成する方法は使わず、必ず日程表 原本を利用してコピーする方法をお願いいたします。[もう1人の赤井さんを利用してコピーした場合、それまで入力されたデータまでコピーされるのでそれは避けたいので…。というのも、このデータを削除するのがややこしいので…]


'変数の指定
  Dim a As Long
  Dim b As String
  Dim c As Integer

'ダイアログボックスの表示
  If MsgBox("新規ヘルパーの登録をしますか?", vbYesNo + vbInformation, "ヘルパー新規登録") = vbYes Then
    
'インプットボックスを表示
    b = InputBox("登録するヘルパーの氏名を入力してください" & Chr(13) & _
    "姓と名の間にスペースを入力してください。", "ヘルパー登録", "例:あいう えお")
    If b <> "" Then 'ボックスに入力されている場合
      a = Worksheets.Count '現在のシート数を数える
      Sheets("日程表 原本").Copy After:=Sheets(a) '原本をコピーし、末尾に移動する
      a = a + 1 '新規シート選択のためaの値に1加算する
      Sheets(a).Select
      Range("F3") = b '新規シートのセルF3にbの値を代入する
      c = InStr(1, b, " ")
      Sheets(a).Name = "日程表 " & Left(b, c - 1)
      Sheets("TOP").Select
      Exit Sub
    Else
      MsgBox "入力されておりません", vbExclamation, "エラーメッセージ"
      Sheets("TOP").Select
      Exit Sub
    End If

【37939】Re:同一苗字の人の処理
発言  ゆみ  - 06/5/23(火) 19:50 -

引用なし
パスワード
   ▼Cuore=Tane さん:
>たとえば、赤井さんという人が2人いた場合、1人目は問題なく作成されますが、2人目は同一姓のため、作成できないというエラーが出ます。
>
>同一苗字の方が2人以上いた場合は日程表 赤井(2)と表示されるようにするにはどうすればいいのでしょうか?
>[同一苗字が3人いた場合は(3)と数字が1つずつ大きくなるようにしたい。]
>出来れば、日程表 赤井を利用してコピーを作成する方法は使わず、必ず日程表 原本を利用してコピーする方法をお願いいたします。[もう1人の赤井さんを利用してコピーした場合、それまで入力されたデータまでコピーされるのでそれは避けたいので…。というのも、このデータを削除するのがややこしいので…]
>
>
>'変数の指定
>  Dim a As Long
>  Dim b As String
>  Dim c As Integer
>
>'ダイアログボックスの表示
>  If MsgBox("新規ヘルパーの登録をしますか?", vbYesNo + vbInformation, "ヘルパー新規登録") = vbYes Then
>    
>'インプットボックスを表示
>    b = InputBox("登録するヘルパーの氏名を入力してください" & Chr(13) & _
>    "姓と名の間にスペースを入力してください。", "ヘルパー登録", "例:あいう えお")
>    If b <> "" Then 'ボックスに入力されている場合
>      a = Worksheets.Count '現在のシート数を数える
>      Sheets("日程表 原本").Copy After:=Sheets(a) '原本をコピーし、末尾に移動する
>      a = a + 1 '新規シート選択のためaの値に1加算する
>      Sheets(a).Select
>      Range("F3") = b '新規シートのセルF3にbの値を代入する
>      c = InStr(1, b, " ")
>      Sheets(a).Name = "日程表 " & Left(b, c - 1)
>      Sheets("TOP").Select
>      Exit Sub
>    Else
>      MsgBox "入力されておりません", vbExclamation, "エラーメッセージ"
>      Sheets("TOP").Select
>      Exit Sub
>    End If

シートを追加して、新しいシートの名前を苗字だけにしてますが、フルネームにしちゃったらどうですか?
フルネームにして何か問題があって、苗字だけにしているのであれば、その理由などを提示すれば何か別の方法でも出てくるかもしれませんね。

【37940】Re:同一苗字の人の処理
回答  Kein  - 06/5/23(火) 21:23 -

引用なし
パスワード
   一つの条件分岐をするたびに、判定に合わなかったらマクロを中止する、
という書き方にした方が、可読性がよくなります。コードはこんな感じです。

Sub 日程表COPY()
  Dim b As String, Snm As String
  Dim WS As Worksheet
  Dim Cnt As Integer

  If MsgBox("新規ヘルパーの登録をしますか?", _
  vbYesNo + vbInformation, "ヘルパー新規登録") = vbNo Then Exit Sub
  Do
   b = InputBox("登録するヘルパーの氏名を入力してください" & _
   Chr(13) & "姓と名の間にスペースを入力してください。", _
   "ヘルパー登録", "例:あいう えお")
   If b = "" Then Exit Sub
  Loop While InStr(1, b, Chr(32)) = 0
  Snm = Split(b, Chr(32))(0)
  For Each WS In Worksheets
   If WS.Name Like Snm & "*" Then Cnt = Cnt + 1
  Next
  If Cnt > 0 Then
   Snm = Snm & "(" & Cnt + 1 & ")"
  End If
  Application.ScreenUpdating = False
  Worksheets("日程表 原本") _
  .Copy After:=Worksheets(Worksheets.Count) 
  With ActiveSheet
   .Range("F3").Value = b
   .Name = "日程表" & Snm
  End With
  Worksheets("TOP").Activate
  Application.ScreenUpdating = True
End Sub

【37941】Re:同一苗字の人の処理
発言  Kein  - 06/5/23(火) 21:25 -

引用なし
パスワード
   ちょっと訂正。
>If WS.Name Like Snm & "*" Then Cnt = Cnt + 1


If WS.Name Like "日程表" & Snm & "*" Then Cnt = Cnt + 1

【37951】Re:同一苗字の人の処理
回答  ハチ  - 06/5/24(水) 8:54 -

引用なし
パスワード
   ▼Cuore=Tane さん:

おはようございます。
無理やりやるとすれば、こんな感じでしょうか?

Sub test()

'変数の指定
  Dim a As Long
  Dim b As String
  Dim c As Integer
  Dim s As Worksheet
  Dim Cnt As Integer

'ダイアログボックスの表示
  If MsgBox("新規ヘルパーの登録をしますか?", vbYesNo + vbInformation, "ヘルパー新規登録") = vbYes Then
  
'インプットボックスを表示
    b = InputBox("登録するヘルパーの氏名を入力してください" & Chr(13) & _
    "姓と名の間にスペースを入力してください。", "ヘルパー登録", "例:あいう えお")
    If b <> "" Then 'ボックスに入力されている場合
      a = Worksheets.Count '現在のシート数を数える
      Sheets("日程表 原本").Copy After:=Sheets(a) '原本をコピーし、末尾に移動する
      a = a + 1 '新規シート選択のためaの値に1加算する
      Sheets(a).Select
      Range("F3") = b '新規シートのセルF3にbの値を代入する
      c = InStr(1, b, " ")
      
      Cnt = 1
      For Each s In Worksheets
        If Mid(s.Name, 5, c - 1) = Left(b, c - 1) Then Cnt = Cnt + 1
      Next s
      
      If Cnt = 1 Then
        Sheets(a).Name = "日程表 " & Left(b, c - 1)
        Sheets("TOP").Select
      Else
        Sheets(a).Name = "日程表 " & Left(b, c - 1) & "(" & Cnt & ")"
      End If
      
      Exit Sub
    Else
      MsgBox "入力されておりません", vbExclamation, "エラーメッセージ"
      Sheets("TOP").Select
      Exit Sub
    End If
  End If
    
End Sub

【38166】Re:同一苗字の人の処理
お礼  Cuore=Tane  - 06/5/28(日) 9:10 -

引用なし
パスワード
   ▼Kein さん:
お返事が遅くなりましたができました。
ありがとうございました。

【38167】Re:同一苗字の人の処理
お礼  Cuore=Tane  - 06/5/28(日) 9:13 -

引用なし
パスワード
   ▼ゆみ さん:
>シートを追加して、新しいシートの名前を苗字だけにしてますが、フルネームにしちゃったらどうですか?
>フルネームにして何か問題があって、苗字だけにしているのであれば、その理由などを提示すれば何か別の方法でも出てくるかもしれませんね。

私も最初、フルネームにしようと考えたのですが、同姓同名でなおかつ漢字も一緒の人が2人がいた場合はやはり必要になると判断したため、それなら苗字だけで…という結論で何とかできれば…と思いました。

【38168】Re:同一苗字の人の処理
お礼  Cuore=Tane  - 06/5/28(日) 9:14 -

引用なし
パスワード
   ▼ハチ さん:
お返事が遅くなりました。大変参考になりました。
ありがとうございました。

7579 / 13645 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free