[[20161128095917]] 『VBAユーザーフォームの使い方』(JINJI) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『VBAユーザーフォームの使い方』(JINJI)

VBA初心者ですが、下記のようなことができないか質問です。

●目的:社員の評価一覧を作成する(一覧表にはすでに社員番号・氏名・等級は入力済み)

●社員等級は1-8等級まである

●評価は一次評価/二次評価とあり、採点はA-Eまで5段階

●評価項目は等級により異なる(大きくわけて2項目(技能・取組態度)のなかに全部で各10項目あり、等級により組み合わせが異なるが、各5項目の選択となる

※評価シートは

社員番号  氏名  等級   技能一次評価(10項目)・・・ 技能二次評価(10項目)・・・  取組一次評価(10項目)・・・・ 取組二次評価(10項目)・・・・   全体点数  最終 ランク  

というように非常に横に長いシートとなっています。

社員により入力するセルが異なるので、その等級に該当する欄に入力するのが大変手間なため、ユーザーフォームを作り、社員番号を入力すると該当する等級をひっぱってきて、さらに該当等級の評価項目にのみ入力するというようなことはできるのでしょうか?

非常に乱雑な文章でお恥ずかしいのですが、どうかお知恵をお貸しください。

   

< 使用 Excel:Excel2010、使用 OS:Windows7 >


マクロを使えば、大抵の事は実現可能です。ただし、貴方のやる気次第です。

しかしながら、ユーザーフォームを使う(画面レイアウトを作ったり、切替を実現するコーディングを書く)のは結構面倒。等級毎の入力用シートを作り、それを集計するようなマクロを作る方が、楽なのではないかと思いますよ。シートに集計ボタンを1つ貼るだけでレイアウトは終わりますから。
(???) 2016/11/28(月) 11:05


ご回答ありがとうございます!

やはり相当な技術・労力がかかるのですね・・・。
ご提案いただいた、集計マクロの作り方をよろしければお教えいただけませんか?

納期がなく焦っております。

(JINJI) 2016/11/28(月) 11:32


納期が無いからコードを教えろ、というのは、丸投げと言って、恥ずべき依頼になります。 過去に沢山、フォルダの中のファイルを順次開いて値を抜き出すコードは出ていますので、ご自分で探して、作成してください。

そもそも、作ると言っても、等級毎のシートのレイアウトさえ決まっていないのに、順番が逆ですよ。入力フォーマットさえ決めてしまえば、集計は後から完成させても良いし、手で転記しても良いし、マクロが書けなくても何とでもできるでしょう。
(???) 2016/11/28(月) 11:41


>評価項目は等級により異なる
>というように非常に横に長いシートとなっています
>該当等級の評価項目にのみ入力

想像するに
等級別に評価項目が異なるが、列にはすべての等級に対する評価項目が並んでいる
なので入力する際に飛び飛びに行う必要がある
という事でしょうか?

そうであるなら
等級を選んだ際に入力不要の列を非表示にしてしまえば良いのですよね

焦っているとの事ですので以下、簡単な作成方法である
マクロ記録を使っての方法です

 記録開始(開始方法がもし分からなければググりましょう)
 ?@A列から最終列まで選択し右クリック、再表示
 ?A1等級で入力不要な列を選択し右クリック、非表示
 記録終了

 フォームボタンを作成し、ボタン名を1にして、記録で作ったマクロを登録

 ボタンを押すと1等級での不要列が非表示になります

これを8等級まで行い、それぞれボタン名を等級と一致させる
ボタン2を押すと2等級での不要列が非表示
ボタン3を押すと3等級での不要列が非表示〜

違ってたら御免なさい

(京子) 2016/11/28(月) 22:23


 アップ済みのコード、ロジックはかえていませんが、コントロールの名前が、ちょっとメンテナンス上
 わかりにくかったので、シート上の項目の列番号とTextBox●やLabel●の番号を一致させました。
 説明文の当該場所をなおし、コードも、それにあわせたものに入れ替えしておきます。 
 (社員番号、氏名、等級は、あくまで表示項目なので、ラベルのほうがいいのですが
  これらもテキストボックスにして、コード内で表示専用に設定しています) 12/01 11:25

 皆さんのアドバイスの通り、JINJIさんが、あまりVBAになれていない、
少なくとも ユーザーフォームになれていないということなら、シート上の処理で進めるのがベストだと思います。

 なので、以下は、あくまで、感触をつかむためのサンプルです。
本来なら、入力項目の妥当性チェックであったり、入力の必須チェックであったり、
そういうものも盛り込む必要があるでしょう。

 また、機能は、既存データを読みこみ、項目に入力したものを、そのデータに上書き、つまり更新機能のみに限定しています。

 以下のようなシートレイアウトを想定しています。

     |[A]     |[B] |[C] |[D]    |[E]    |[F]    |[G]    |[H]    |[I]    |[J]    |[K]    |[L]    |[M]     |[N]    |[O]    |[P]    |[Q]    |[R]    |[S]    |[T]    |[U]    |[V]    |[W]     |[X]    |[Y]    |[Z]    |[AA]   |[AB]   |[AC]   |[AD]   |[AE]   |[AF]   |[AG]    |[AH]   |[AI]   |[AJ]   |[AK]   |[AL]   |[AM]   |[AN]   |[AO]   |[AP]   |[AQ]    |[AR]    |[AS]|[AT]  
 [1] |社員番号|氏名|等級|技能1-1|技能1-2|技能1-3|技能1-4|技能1-5|技能1-6|技能1-7|技能1-8|技能1-9|技能1-10|技能2-1|技能2-2|技能2-3|技能2-4|技能2-5|技能2-6|技能2-7|技能2-8|技能2-9|技能2-10|取組1-1|取組1-2|取組1-3|取組1-4|取組1-5|取組1-6|取組1-7|取組1-8|取組1-9|取組1-10|取組2-1|取組2-2|取組2-3|取組2-4|取組2-5|取組2-6|取組2-7|取組2-8|取組2-9|取組2-10|全体点数|最終|ランク
 [2] |      01|nm1 |g1  |       |       |       |       |       |       |       |       |       |        |       |       |       |       |       |       |       |       |       |        |       |       |       |       |       |       |       |       |       |        |       |       |       |       |       |       |       |       |       |        |        |    |      
 [3] |      02|nm2 |g2  |       |       |       |       |       |       |       |       |       |        |       |       |       |       |       |       |       |       |       |        |       |       |       |       |       |       |       |       |       |        |       |       |       |       |       |       |       |       |       |        |        |    |      
 [4] |      03|nm3 |g3  |       |       |       |       |       |       |       |       |       |        |       |       |       |       |       |       |       |       |       |        |       |       |       |       |       |       |       |       |       |        |       |       |       |       |       |       |       |       |       |        |        |    |      
 [5] |      04|nm4 |g4  |       |       |       |       |       |       |       |       |       |        |       |       |       |       |       |       |       |       |       |        |       |       |       |       |       |       |       |       |       |        |       |       |       |       |       |       |       |       |       |        |        |    |      
 [6] |      05|nm5 |g5  |       |       |       |       |       |       |       |       |       |        |       |       |       |       |       |       |       |       |       |        |       |       |       |       |       |       |       |       |       |        |       |       |       |       |       |       |       |       |       |        |        |    |      
 [7] |      06|nm6 |g1  |       |       |       |       |       |       |       |       |       |        |       |       |       |       |       |       |       |       |       |        |       |       |       |       |       |       |       |       |       |        |       |       |       |       |       |       |       |       |       |        |        |    |      
 [8] |      07|nm7 |g2  |       |       |       |       |       |       |       |       |       |        |       |       |       |       |       |       |       |       |       |        |       |       |       |       |       |       |       |       |       |        |       |       |       |       |       |       |       |       |       |        |        |    |      
 [9] |      08|nm8 |g3  |       |       |       |       |       |       |       |       |       |        |       |       |       |       |       |       |       |       |       |        |       |       |       |       |       |       |       |       |       |        |       |       |       |       |       |       |       |       |       |        |        |    |      
 [10]|      09|nm9 |g4  |       |       |       |       |       |       |       |       |       |        |       |       |       |       |       |       |       |       |       |        |       |       |       |       |       |       |       |       |       |        |       |       |       |       |       |       |       |       |       |        |        |    |      

 また、これとおなじタイトル行を持った、等級別入力項目規定シートを準備します。(このシートは、通常 非表示にしておいてかまいません)
4列目(D列)から右の各セルに、当該等級で必要な項目に何か値をいれます。(どんな値でもOK)

    |[A]     |[B] |[C] |[D]    |[E]    |[F]    |[G]    |[H]    |[I]    |[J]    |[K]    |[L]    |[M]     |[N]    |[O]    |[P]    |[Q]    |[R]    |[S]    |[T]    |[U]    |[V]    |[W]     |[X]    |[Y]    |[Z]    |[AA]   |[AB]   |[AC]   |[AD]   |[AE]   |[AF]   |[AG]    |[AH]   |[AI]   |[AJ]   |[AK]   |[AL]   |[AM]   |[AN]   |[AO]   |[AP]   |[AQ]    |[AR]    |[AS]|[AT]  
 [1]|社員番号|氏名|等級|技能1-1|技能1-2|技能1-3|技能1-4|技能1-5|技能1-6|技能1-7|技能1-8|技能1-9|技能1-10|技能2-1|技能2-2|技能2-3|技能2-4|技能2-5|技能2-6|技能2-7|技能2-8|技能2-9|技能2-10|取組1-1|取組1-2|取組1-3|取組1-4|取組1-5|取組1-6|取組1-7|取組1-8|取組1-9|取組1-10|取組2-1|取組2-2|取組2-3|取組2-4|取組2-5|取組2-6|取組2-7|取組2-8|取組2-9|取組2-10|全体点数|最終|ランク
 [2]|        |    |g1  |x      |x      |x      |       |       |       |       |       |       |        |       |       |       |       |       |       |       |       |       |        |x      |x      |x      |       |       |       |       |       |       |        |       |       |       |       |       |       |       |       |       |        |x       |x   |x     
 [3]|        |    |g2  |x      |x      |x      |x      |x      |x      |x      |x      |x      |x       |       |       |       |       |       |       |       |       |       |        |x      |x      |x      |x      |x      |x      |x      |x      |x      |x       |       |       |       |       |       |       |       |       |       |        |x       |x   |x     
 [4]|        |    |g3  |x      |x      |x      |x      |x      |x      |x      |x      |x      |x       |x      |x      |       |       |       |       |       |       |       |        |x      |x      |x      |x      |x      |x      |x      |x      |x      |x       |x      |x      |       |       |       |       |       |       |       |        |x       |x   |x     
 [5]|        |    |g4  |x      |x      |x      |x      |x      |x      |x      |x      |x      |x       |x      |x      |x      |x      |       |       |       |       |       |        |x      |x      |x      |x      |x      |x      |x      |x      |x      |x       |x      |x      |x      |       |       |       |       |       |       |        |x       |x   |x     
 [6]|        |    |g5  |x      |x      |x      |x      |x      |x      |x      |x      |x      |x       |x      |x      |x      |x      |x      |x      |x      |x      |x      |x       |x      |x      |x      |x      |x      |x      |x      |x      |x      |x       |x      |x      |x      |x      |x      |x      |x      |x      |x      |x       |x       |x   |x     

 ●ユーザーフォーム要件

 ・ComboBox1  データ選択用。ドロップダウンには 社員番号、氏名、等級 を表示しますので、横を長めにしてください。
 ・TextBox1〜TextBox46 (A列から最終列までの列数にあわせて。コードではとりあえずAT列までにしているので46)
 ・Label1〜Label46  項目名表示用。各TextBoxの左側に配置。項目名はシートのタイトルを自動セット。
 ・CommandButton1  更新用

 これだけの項目ですから、慣れていなければ作成そのものに時間がかかると思いますが。

 ●ユーザーフォームモジュール

  ★部分は実際の値にしてください。
  

 Option Explicit

 Const DNM As String = "Sheet1" 'データシート名 '★
 Const MNM As String = "Sheet2" 'マスタシート名 '★
 Const COLS As Long = 46        'シートの列数   '★

 Private Sub UserForm_Initialize()
    Dim x As Long
    Dim ctrl As MSForms.Control
    Dim w As Variant

    With Sheets(DNM).Range("A1").CurrentRegion
        w = .Offset(1).Resize(.Rows.Count - 1).Value
    End With

    With ComboBox1
        .MatchRequired = True
        .ColumnCount = 3
        .List = w
    End With

    For x = 1 To COLS
        With Me.Controls("Label" & x)
            .Caption = Sheets(DNM).Cells(1, x).Value
            .TextAlign = fmTextAlignRight
        End With
    Next

    For x = 1 To 3
        With Me.Controls("TextBox" & x)
            .Locked = True
            .TabStop = False
        End With
    Next

 End Sub

 Private Sub ComboBox1_Change()
    Dim i As Long
    Dim x As Variant
    Dim y As Long

    Dim r As Range

    If ComboBox1.ListIndex < 0 Then Exit Sub

    i = ComboBox1.ListIndex + 2 'シート上の行番号

    With Sheets(MNM)
        Set r = .Range("C2", .Range("C" & Rows.Count).End(xlUp))
    End With

    With Sheets(DNM).Rows(i)
        x = Application.Match(.Columns("C"), r, 0)
        If IsError(x) Then  '念のため
            MsgBox "このデータの等級が正しくないので処理できません"
            Exit Sub
        End If
        x = x + 1   'シート上の行番号
        For y = 1 To COLS
            If y < 3 Or Sheets(MNM).Cells(x, y) <> "" Then
                Me.Controls("TextBox" & y).Value = Sheets(DNM).Cells(i, y).Value
                Me.Controls("TextBox" & y).Enabled = True
                Me.Controls("TextBox" & y).BackColor = vbWhite
            Else
                Me.Controls("TextBox" & y).Value = ""
                Me.Controls("TextBox" & y).Enabled = False
                Me.Controls("TextBox" & y).BackColor = Me.Controls("TextBox" & y - 3).BorderColor
            End If
        Next
    End With

 End Sub

 Private Sub CommandButton1_Click()
    Dim i As Long
    Dim j As Long

    If ComboBox1.ListIndex < 0 Then
        MsgBox "データが未選択です"
        Exit Sub
    End If

    i = ComboBox1.ListIndex + 2 'シート上の行番号

    For j = 1 To COLS
        Sheets(DNM).Cells(i, j).Value = Me.Controls("TextBox" & j).Value
        Me.Controls("TextBox" & j).Value = ""
        Me.Controls("TextBox" & j).Enabled = True
        Me.Controls("TextBox" & j).BackColor = vbWhite
    Next

    ComboBox1.Value = ""

 End Sub

(β) 2016/11/29(火) 22:51


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.