Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(指定なし : Microsoft 365)
職員名簿の作成
投稿日時: 23/10/27 12:34:58
投稿者: zekaruha

職員名簿の作成中です。
新規入社した職員を部署毎の「部署計の1行上」に配置するようにしたいのですが、そのコードをご教授頂きたいと思います。
フォームで各項目を入力し「登録ボタン」を押下した際の処理でできればと思います。
部署は、フォームで「コンボボックス」から選択するようにしたいです。
登録と修正の処理はすでにできていますので追加の処理のみをお願いいたします。
 
横列に部署・氏名・生年月日・就職年月日等を配置
縦行に部署別(7部署)で100名弱の職員を下記表のように入力した表にしたいと思います。
 
 
   A1     B1     C1     D1  
 1 部署    氏名   生年月日  就職年月日
 
 2 事務   ○○○○  ○○○○  ○○○○
 3 事務   ○○○○  ○○○○  ○○○○
 4 事務の計
 
 5 営業   ○○○○  ○○○○  ○○○○
 6 営業   ○○○○  ○○○○  ○○○○
  7 営業の計
   ・
   ・
   ・

回答
投稿日時: 23/10/27 13:40:37
投稿者: taitani
投稿者のウェブサイトに移動

■ 禁止事項
https://www.moug.net/faq/kiyaku.html#link4
 
コード制作依頼
「●●●を実行するようなマクロを作りたいのですが」「●●●をする方法を教えてください」といった、コード制作依頼ともとれるような質問はおやめください。
 
は、いったん置いておいて、
質問1. あなたはどこまでコードを作成しましたか?
質問2. フォームは作成済みですか?
質問3. 今後運用が変わった時も、同じように質問するのですか?

回答
投稿日時: 23/10/27 16:04:31
投稿者: WinArrow

ヒント
 
1.Comboboxのドロップダウンリスト作成
次のいづれかの方法で、「○○の計」の行を取得し、行番号と「○○」を配列に格納します。
格納してた配列を、Combobox1.Listに代入すればよいです。
 
取得する方法
(1)オートイルタで「の計」で抽出します。
(2)「の計」を検索キーで、Find 〜FineNextで抽出します。
 
2.シートへの転記
Combobox1の行番号を使って、行挿入します。
空白の行ができるので、その行のセルに、フォームのコントロールの「値」を代入します。
 
※「○○の計」の行で合計しているセルが、SUM関数を使っている場合、
集計範囲が自動で更新されるかは分かりません。
自分で確認してみてください。
 
 
疑問点
>登録と修正の処理はすでにできています
↑の「登録」と今回の「追加」とン違いは?
 
お勧め版
「○○の計」の行は、印刷などする時に、あればよいと思うので、表から削除したら如何ですか?

回答
投稿日時: 23/10/28 12:15:38
投稿者: simple

遅ればせながら気づいたことをメモします。
 
1.コンボボックスのセット。
  7組織は固定でしょうから、別シートに一覧を作っておいて

  Private Sub UserForm_Initialize()
      ComboBox1.RowSource = "Sheet2!A1:A7"
  End Sub
のようにするのが簡単かと思います。
 
2.続けて追加する場合など、挿入する行位置は可変ですから、
  その都度、検索したほうが良いと思います。
  コマンドボタンのクリックイベントプロシージャは以下のような感じで。
    Dim s     As String
    Dim pos   As Variant
    Dim group As String

    If Me.ComboBox1.ListIndex < 0 Then
        MsgBox "ComboBoxで組織を選択してください"
        Exit Sub
    Else
        group = Me.ComboBox1.Value
        s = group + "の計"
        With Sheet1
            pos = Application.Match(s, .Columns("A"), 0)
            If IsNumeric(pos) Then
                '■pos行に一行挿入するコードをここに追加します。
                '■マクロ記録で調べてください。セル範囲をRows(pos)に修正します。
                .Cells(pos, "A") = group
                .Cells(pos, "B") = TextBox1.Text
                .Cells(pos, "C") = CDate(TextBox2.Text)
                .Cells(pos, "D") = CDate(TextBox3.Text)
            End If
        End With
    End If

回答
投稿日時: 23/10/28 18:01:10
投稿者: simple

s = group + "の計"

s = group & "の計"
の間違いです。動作はしますが、推奨されません。
(別の言語と混同しました。)

投稿日時: 23/11/02 11:39:16
投稿者: zekaruha

ありがとうございました。
とても参考になり、解決いたしました。