[[20190121121029]] 『名簿データ管理』(ひらこ) ページの最後に飛ぶ

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

 

『名簿データ管理』(ひらこ)

エクセルのシート1に名簿リストを作成しています。
シート2にボタンを作成し、クリックしたらフォーム形で
開くようにしたいのですが、
ボタンをクリック、無地のフォームを開くまでは作成できたのですが、
シート1のデータのひっぱり方がわかりません。
リストボックスでしょうか。

氏名 「 」
住所 「 」
電話番号「 」
生年月日「 」

「」内にデータを出すにはどう設定すれば良いでしょうか。
あとフォームにはレコードを移動するボタンや、各項目での
検索も出来たら、と考えています。
エクセルに組み込まれたフォーム機能は都度範囲指定があるの
で面倒とのことで、マクロで出来ないかと思いました。

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


 >エクセルに組み込まれたフォーム機能
 これをマクロの記録に取ればいいんじゃないですか?
(稲葉) 2019/01/21(月) 12:29

 >エクセルに組み込まれたフォーム機能は都度範囲指定があるの で面倒とのことで

 そんなのありましたっけ?
 というか、ご自身では試してないのですか?

(コナミ) 2019/01/21(月) 12:32


コナミさん
試しました。
リストを範囲指定してからフォームをクリックでしたが。

稲葉さん
それも考えましたが、フォームが小さいので見にくいようです。
大きくできますでしょうか。
(ひらこ) 2019/01/21(月) 12:36


 コナミさん。
 EXCEL2007からはメニューから外されている。
 クイックアクセスツールバーの設定でリボンにないコマンドから「フォーム...」を追加して使用する。
(ねむねむ) 2019/01/21(月) 12:40

 リスト内の1セルを選択してからフォームのボタンを押しても
 普通にできると思いますけど。

 ねむねむさん
 はい。私はクイックアクセスツールバーに配置してます。
 でも、範囲指定しないとできない訳じゃないですよね。
 あ、機能自体があるの?と聞いたのではなく範囲指定しないと
 できないの?と聞いたのです。すみません。
(コナミ) 2019/01/21(月) 12:42

 正直機能として全く面白くないので、やりたくないのですが・・・

http://www.atmarkit.co.jp/ait/articles/1404/04/news037.html

 ここに簡単な作り方あるので、自分で作成されてみてはどうでしょう?
(稲葉) 2019/01/21(月) 12:49

皆様ありがとうございます。
頑張ってエクセルシートのデータをボタンに登録したフォーム側のテキストボックスに連動することはできました。

●エクセルシート名→名簿
A列からM列まで項目があります。

フォーム側はラベルとテキストボックスで作成しましたが、
この方法であっているのかわかりません(笑)

(フォーム)
連番→名簿!A2
氏名→名簿!B2
フリガナ→名簿!C2
住所→名簿!D2
以上、M2まで項目あり。

でもここからが問題でA3の行〜をフォーム側で
表示するにはどうしたら良いでしょうか。
スピンボタン、スクロールボタン色々試してはいるのですが
設定がよくわからなくて。

(ひらこ) 2019/01/21(月) 19:48


 ガンバリマシタネ。
 仕事終わったので、ちょっと作ってみました。
 思ったより手こずった・・・
 テストデータは以下の通りです。
 1)A列は1から始まる連番にしてください。
 2)欠番はなしです。(スピンボタンの移動で、番号使います。)
 3)データが無くても連番だけはずーーーーっと下まで作っておいてください。(新規作成はA列に連番があるセルのみとします)
 4)途中で空白の行があると正しくデータが取れません
   >Sheets("Sheet1").Range("A1").CurrentRegion
   A1を選択して、Ctrl+*を押したときの動作です。
   連続する範囲を選択するコマンドです。

     |[A] |[B]       |[C] |[D]         |[E]       
 [1] |連番|氏名      |性別|電話番号    |生年月日  
 [2] |   1|栗山浩寿  |男  |06-1400-7285|1994/3/8  
 [3] |   2|生田美名子|女  |0983-66-0201|1988/12/13
 [4] |   3|梶亜矢    |女  |03-6066-3221|1978/3/21 
 [5] |   4|長浜秀樹  |男  |087-056-5328|1975/1/2  
 [6] |   5|青木幸仁  |男  |0565-79-1042|1994/5/8  
 [7] |   6|諏訪亜依  |女  |0184-33-9531|1973/6/20 
 [8] |   7|堀彰      |男  |0173-26-5040|1974/8/1  
 [9] |   8|脇田文子  |女  |059-781-2993|1981/3/17 
 [10]|   9|相川真司  |男  |082-002-9306|1988/6/18 
 [11]|  10|門田勝男  |男  |0859-03-5325|1984/5/23 
 [12]|  11|          |    |            |          
 [13]|  12|          |    |            |          
 [14]|  13|          |    |            |          
 [15]|  14|          |    |            |          
 [16]|  15|          |    |            |          
 [17]|  16|          |    |            |          
 [18]|  17|          |    |            |          
 [19]|  18|          |    |            |          
 [20]|  19|          |    |            |          
 [21]|  20|          |    |            |          

 新しいユーザーフォームを作ってください。
 そこに以下のコードを入れてください。
 データ範囲は★のところを書き換えてください。
    Option Explicit

    Private WithEvents applyBtn As MSForms.CommandButton
    Private WithEvents moveSpn As MSForms.SpinButton
    Private rc_range As Range
    Private rc As Variant
    Private rc_mirror As Variant
    Private txbarray() As MSForms.TextBox

    '//登録ボタン
    Private Sub applyBtn_Click()
        Dim i As Long
        Dim flgChange As Boolean
        For i = 2 To UBound(txbarray)
            If CStr(rc(txbarray(1) + 1, i)) <> txbarray(i) Then
                rc_mirror(txbarray(1) + 1, i) = txbarray(i)
                flgChange = True
            End If
        Next i
        If flgChange Then
            If MsgBox("変更がありました。更新しますか?", vbYesNo) = vbYes Then
                rc_range.Value = rc_mirror
                rc = rc_mirror
            End If
        End If
    End Sub

    '//スピンボタン レコード移動
    Private Sub moveSpn_SpinDown()
        MoveRc No:=WorksheetFunction.Max(txbarray(1) - 1, 1)
    End Sub
    Private Sub moveSpn_SpinUp()
        MoveRc No:=WorksheetFunction.Min(txbarray(1) + 1, UBound(rc) - 1)
    End Sub
    Private Sub MoveRc(ByVal No As Long, Optional ByVal DataChk As Boolean = True)
        Dim i As Long
        If DataChk Then
            applyBtn_Click '登録ボタンクリックと同じ動作
        End If
        For i = 1 To UBound(txbarray)
            txbarray(i).Value = rc(No + 1, i)
        Next i
    End Sub
    '//ここまでレコード移動

    '//コントロール配置
    Private Sub UserForm_Initialize()
        Dim i As Long
        Dim cTop As Long
        Dim MaxLen As Long '項目の最大文字数
        Dim n As Long
        Dim lblDummy As MSForms.Label
        Dim txbDummy As MSForms.TextBox

        Const fSize = 12

        'レコードの取得
        Set rc_range = Sheets("Sheet1").Range("A1").CurrentRegion '★ここを実際の範囲に設定
        rc = rc_range.Value
        rc_mirror = rc
        '登録ボタンの設置
        Set applyBtn = Controls.Add("forms.commandbutton.1", , True)
        With applyBtn
            .Caption = "登録"
            .Top = 10
            .Width = 100
            .Height = 20
            cTop = .Top + .Height + 10
            'leftは最後に設定
        End With
        Set moveSpn = Controls.Add("forms.spinbutton.1", , True)
        With moveSpn
            .Top = 10
            .Width = 20
            .Height = 20
            cTop = .Top + .Height + 10
            'leftは最後に設定
        End With

        '項目の最大文字数
        For i = 1 To UBound(rc, 2)
            MaxLen = IIf(MaxLen < LenB(rc(1, i)), LenB(rc(1, i)), MaxLen)
        Next i

        For i = 1 To UBound(rc, 2)
            'ラベルの設定
            Set lblDummy = Controls.Add("forms.label.1", , True)
            With lblDummy
                .Left = 10
                .Top = cTop
                .Width = MaxLen * fSize
                .Height = 20
                .TextAlign = fmTextAlignRight
                .Font.Size = fSize
                .Caption = rc(1, i)
            End With

            'テキストボックスの設定
            Set txbDummy = Controls.Add("forms.textbox.1", , True)
            With txbDummy
                If i = 1 Then
                    .Enabled = False
                    .BackColor = lblDummy.BackColor
                End If
                .Left = lblDummy.Left + lblDummy.Width + 10
                .Top = cTop
                .Width = 200
                .Height = 20
                .Font.Size = fSize
                cTop = cTop + .Height + 10
            End With
            ReDim Preserve txbarray(1 To i)
            Set txbarray(i) = txbDummy
        Next i

        '微調整
        With txbDummy
            Me.Width = .Left + .Width + 10
            Me.Height = cTop + 50
            applyBtn.Left = .Left
            moveSpn.Left = applyBtn.Left + applyBtn.Width + 10
        End With

        'スピンボタン押した動作と同じ
        MoveRc No:=1, DataChk:=False
    End Sub

(稲葉) 2019/01/21(月) 20:12


 あ、ミスった
 キャンセル押したときのどうさ入れ忘れました
 パソコン閉じちゃったので、明日修正します
(稲葉) 2019/01/21(月) 20:30

稲葉さん、ありがとうございます。
すごいですね。正直何がなんだかわかりません(笑)
今のユーザーフォームを削除して、新しいのにこのマクロを
登録するだけで宜しいのでしょうか。
やはりテキストボックスにはテキストボックスのコードで、
スピンボタンにはスピンボタンのコードって感じですよね?
初歩的すぎてすみません。

(ひらこ) 2019/01/21(月) 20:52


 なにもおかなくていいです
 実行すれば勝手にコントロール設置されるので、
 まっさらなユーザーフォームを作って、ユーザーフォームのなかコードいれて
 シートにおいたボタンから、Userform1.showとするだけです
(稲葉) 2019/01/21(月) 21:26

え〜、すごいですね!
私にハッキリわかるのは
シートにおいたボタンから、Userform1.showくらいです。
すみません、本当に無知で申し訳ないのですが、
★の範囲というのはリストの列数とか行数でしょうか。
会社のパソコンで仕事の合間に作成しているので
明日確認しますが、
確か列はA〜M,行数は200行くらいかとは思いますが。
(ひらこ) 2019/01/21(月) 22:43

 >★の範囲というのはリストの列数とか行数でしょうか。
 (稲葉) 2019/01/21(月) 20:12
 の投稿の4)を読んでください
(稲葉) 2019/01/21(月) 22:54

 修正お待たせしました。
 登録ボタンのコードを、そのまま入れ替えてください。
    '//登録ボタン
    Private Sub applyBtn_Click()
        Dim i As Long
        Dim flgChange As Boolean
        For i = 2 To UBound(txbarray)
            If CStr(rc(txbarray(1) + 1, i)) <> txbarray(i) Then
                rc_mirror(txbarray(1) + 1, i) = txbarray(i)
                flgChange = True
            End If
        Next i
        If flgChange Then
            If MsgBox("変更がありました。更新しますか?", vbYesNo) = vbYes Then
                rc_range.Value = rc_mirror
                rc = rc_mirror
            Else
                rc_mirror = rc
            End If
        End If
    End Sub
(稲葉) 2019/01/22(火) 08:09

無事にフォームが立ち上がりました!
ありがとうございます。

すみません、ご相談なのですが、
●スピンボタンですが、上下で表示されていて
「上向の矢印」を押すと次レコードに行くようになっておりますが、
「下向の矢印」に変更可能でしょうか。
●レコード移動をしていて決まったレコードで「変更が〜」のメッセージが
出るのですが、リストを確認しましたらかなり文字数が長いレコードでした。
「更新する」にすると切れてしまうようです。
文字数を今より余裕をもって長めに設定は可能でしょうか。

自分でもテキストボックスの長さなど変更をしてみて、
うまく行く部分もありましたが、基本レベルが高すぎて
私にはかなり難しいです(笑)

このフォームに関しては
「検索」「印刷」ボタンも欲しいと考えています。
「検索」は各項目で検索をかけたり、項目に○など
抽出対象マークや文字を入れていり対象レコードを検索によって抽出し、
その人だけを「印刷」したりしたいんですが。

印刷のパターンは
●「郵便番号」「住所」「部署」「会社名」「氏名」→長3封筒レイアウト
●「郵便番号」「住所」「部署」「会社名」「氏名」→角2封筒レイアウト
あとは上記2パターンを元に「氏名」だけで出力とか「2回目発送」などの文字入り
で印刷も出来たらと思います。
こうなると印刷用のフォームを新しく作る方が良いかもしれないと考えたりして。

考えているだけで実力が全然伴って無いんですが(笑)
Excelマクロではかなりレベル高いですよね。
前ソフトではレイアウト作成機能が自由で、
元データからデータをレイアウトにはめ込むフィールド機能がありましたので、
結構簡単に出来てはいたのですが。
(ひらこ) 2019/01/23(水) 07:58


 何か勘違いされているようなので、はっきり申しておきますが、
 「質問」掲示板であって、「作成依頼」ではありません。
 いただいた情報を元に、お手伝いする立場ですので、お忘れなく。

 >「下向の矢印」に変更可能でしょうか。 
 提示したコードの '//スピンボタン レコード移動 部分にそれらしい記述があるので、
 コードを入れ替えてください。

 >こうなると印刷用のフォームを新しく作る方が良いかもしれないと考えたりして。 
 フォームは印刷できません。
 シートにレイアウトして、シートを印刷する形になります。
 こちらは別途ご自身で別シートに作成していただくしかありません。
 封筒サイズごとにシートを分けてください(シート名例 「長3」「角2」)
 マクロからレイアウトへのデータ出力は、連番のみになります。
 「氏名」「住所」等は、ご自身でVLOOKUP関数などを使って自分で作成してください。

 >抽出対象マークや文字を入れていり対象レコードを検索によって抽出し、 
その人だけを「印刷」したりしたいんですが。 
 今回ご依頼いただいたのは単票フォームです。
 ○を付けた人のみ印刷でされば、シートに直接書き込んでいただいたほうが早いです。
 ○を付ける列を指定してください。

 >「検索」は各項目で検索をかけたり、
 具体的にはどうしたいのですか?
 具体例を出してください。

 >●レコード移動をしていて決まったレコードで「変更が〜」のメッセージが
 再現できません。
 該当するレコードをこちらに張り付けてください。

 以上、ご回答いただくまで先に進めません。
 また追加仕様があれば先に言ってください。
 次回投稿が最後の追加仕様としてください。 

 ご要望いただいている内容は、アクセスのほうが向いてそうですね。
 むしろエクセルの必要がありません。
 変更を検討してください。

(稲葉) 2019/01/23(水) 08:38


稲葉さん
お忙しい中、回答をありがとうございます。
ご指示頂いている件、頑張ってみます。
仕様がまとまっておらず、申し訳ございませんでした。
まとめなおして回答させてただきます。

(ひらこ) 2019/01/23(水) 08:55


コメント返信:

[ 一覧(最新更新順) ]


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