![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
初めて質問させていただきます。よろしくお願い致します。
現在、老人施設に勤務しておりまして、エクセルにて名簿一覧がありますが、使いにくくて、見にくい状態で困っています。そんなときに、VBAというものがあるということを知り、色々調べている最中ですが、初心者のためさっぱりな状態です。
現在、エクセルの名簿にて(sheet1→”基本データ”)として B お部屋の番号 C 氏名 D生年月日 E年齢 F保険 G介護度 H入所日 I住所・・・などを記載しており、
(sheet2→”家族情報”)として、(B:お部屋の番号 C氏名 は同じように記載) D(1)家族の名前 E(1)続柄 F(1)住所 G(1)電話番号 F(2)電話番号 G(2)家族の名前・・・と 記載しております。
そして、(sheet3→”保険情報”)として、(B:お部屋の番号 C氏名は同様に記載)D保険者番号 E介護保険の有効期限・・・など記載しています。
これらの情報を元に、VBAを利用して
(1)名前を入力すると(一文字でも当てはまった文字があれば候補が出てくる)その方の情報だけが抽出される。(名前だけではなく、例えば、住所で検索しても同じような検索方法ができるような形も)
(2)その抽出された画面をそのまま印刷できるようにする
(3)今後のデータ登録をVBAベースで簡単に登録していけるシステムにしたい
(4)沢山の項目があるので、一画面にすべての情報を見やすく載せるために、タブstripなど、色々とうまく組み合わせて作っていきたい(家族情報など)
(5)H22.1.1という表記でエクセル内で入力しているのに、抽出すると、2010.1.1という表記になってしまうので、できれば、そのままH22.1.1という表示で抽出したい。
(6)このシステムを立ち上げたと同時にVBAが立ち上がってすぐ動かせるようにしたい
など色々やりたいと思う部分があるのですが、勉強不足で、よくわからないのが現状で
Private Sub リスト氏名_Click()
ラベル性別.Caption = Range("基本データ!D5").Offset(リスト氏名.ListIndex).Value
ラベル生年月日.Caption = Range("基本データ!E5").Offset(リスト氏名.ListIndex).Value
ラベル年齢.Caption = Range("基本データ!F5").Offset(リスト氏名.ListIndex).Value
ラベル保険.Caption = Range("基本データ!G5").Offset(リスト氏名.ListIndex).Value
ラベル要介護度.Caption = Range("基本データ!I5").Offset(リスト氏名.ListIndex).Value
・・・・
という コードを入力しているだけの状態で、その後、どのようにすれば良いかわかりません。
アドバイスであったり、参考になるサイトであったり、私の考えていることが可能か、どうか、なども踏まえてご教授いただければと思います。よろしくお願い致します。
No.4ベストアンサー
- 回答日時:
このようなシステムを確立するには、まずエクセルの一般機能を理解することをお勧めします。
これらの機能を利用しても、実現できない部分だけVBAで対応するようにします。
例えば、
>(1)名前を入力すると(一文字でも当てはまった文字があれば候補が出てくる)その方の情報だけが抽出される。(名前だけではなく、例えば、住所で検索しても同じような検索方法ができるような形も)
各シートから必要データを抽出するなら関数でも実行することが可能です。
>(2)その抽出された画面をそのまま印刷できるようにする
単純にデータ表示用シートを印刷するだけでOKですね。
>(3)今後のデータ登録をVBAベースで簡単に登録していけるシステムにしたい
入力用フォームを作成してこのデータをデータベースに登録するならVBAを使う必要がありますが、単純にデータベースシートに直接入力して、このシートからすべての必要データを表示用シートに取り出す設計にするのでもよいと思います。
>(4)沢山の項目があるので、一画面にすべての情報を見やすく載せるために、タブstripなど、色々とうまく組み合わせて作っていきたい(家族情報など)
基本は表示用シートに各項目を一覧できるようにするのが一般的です(タブのあるユーザーフォームでは印刷などができません)。
>(5)H22.1.1という表記でエクセル内で入力しているのに、抽出すると、2010.1.1という表記になってしまうので、できれば、そのままH22.1.1という表示で抽出したい。
これは単純に表示形式の問題と思われます(VBAに関係ありません)。
>(6)このシステムを立ち上げたと同時にVBAが立ち上がってすぐ動かせるようにしたい
これはブックを開いたときに、例えばユーザーフォームなどを表示させる設定にします。
Private Sub Workbook_Open()
Userform1.Show
End Sub
今回のような複数の事項に関する一般的なご質問では、皆さんから具体的な回答が得られないと思います。
このような掲示板では、1つの質問には1つの質問内容だけにして、具体的なシートのレイアウトなどを例示して、わからない部分をポイントを絞って質問するようにしましょう。
早速のご回答ありがとうございます。
>今回のような複数の事項に関する一般的なご質問では、皆さんから具体的な回答が得られないと思います。このような掲示板では、1つの質問には1つの質問内容だけにして、具体的なシートのレイアウトなどを例示して、わからない部分をポイントを絞って質問するようにしましょう。
初めての質問で何をどのようにお聞きして良いかわからず、このような質問になってしまいました。皆様から色々とアドバイスを頂きまして、こちらで一つ一つ文をゆっくりと解読していきたいと考えます。
また、その時に、わからない部分などありましたら、アドバイス頂いた通り、ポイントを絞って質問するように致します。具体的なご回答ありがとうございました。
No.5
- 回答日時:
掲示板では、作成依頼のような質問は達成が難しいです。
基本的には、私は回答していません。AccessかExcelかというような選択的な問題は、ほとんど関係ありません。自分が得意なものでやればよいです。>(1)名前を入力すると(一文字でも当てはまった文字があれば候補が出てくる)その方の情報だけが抽出される。(名前だけではなく、例えば、住所で検索しても同じような検索方法ができるような形も)
これは、フィルタオプションを使えばよいです。記録マクロでも、ほとんど変わりません。昔のままの機能です。3万件程度なら、まったくストレスは感じません。しかし、それをUserFormなどを使うとなると、環境はかなり変わってきます。
>(2)その抽出された画面をそのまま印刷できるようにする
特に範囲が設定していれば、これも何の問題もありません。
ActiveSheet.PrintOut などを使います。
>(3)今後のデータ登録をVBAベースで簡単に登録していけるシステムにしたい
この部分だけ、掲示板に新たにレイアウトを出して質問を出してください。入門者には難しいですが、初級の範囲です。
>(4)沢山の項目があるので、一画面にすべての情報を見やすく載せるために、タブstripなど、色々とうまく組み合わせて作っていきたい(家族情報など)
掲示板では、この部分はうまく伝わらないと思います。
>(5)H22.1.1という表記でエクセル内で入力しているのに、抽出すると、2010.1.1という表記になってしまうので、できれば、そのままH22.1.1という表示で抽出した
二つの方法がありますが、なるべくシリアル値で処理したほうがよいです。Format関数を使います。
>(6)このシステムを立ち上げたと同時にVBAが立ち上がってすぐ動かせるようにしたい
ThisWorkbookモジュールのThisWorkbook_Openか、標準モジュールのAuto_Openを利用します。過度な期待は、挫折しやすいです。あまりイメージ化させないで、積み上げていくことが完成の近づきます。
>ラベル性別.Caption = Range("基本データ!D5").Offset(リスト氏名.ListIndex).Value
ラベル生年月日.Caption = Range("基本データ!E5").Offset(リスト氏
基本的な書き方が間違いのようです。List は、最初にして、List に登録し、Listから呼び出します。VBAを真面目に勉強して、2ヶ月目か3ヶ月目ぐらいのレベルに出てきます。
'UserForm に登録する例です。氏名データがシート1の12行がある場合
'その対応データがシート2のデータがA1:C12まであり、B列は日付データがあるとします。
'UserForm, ListBox1, Label1,Label2, Label3 を設定。Sheet1--A1:A12氏名, Sheet2--A1:C12 データ
Private Sub UserForm_Initialize()
Dim i As Integer
For i = 1 To 12
ListBox1.AddItem Worksheets("Sheet1").Cells(i, 1).Value
Next
End Sub
Private Sub ListBox1_Click()
Dim i As Integer
i = ListBox1.ListIndex + 1
With Worksheets("Sheet2").Range("A1:C12") 'データ範囲
Label1.Caption = .Cells(i, 1).Value
Label2.Caption = Format$(.Cells(i, 2).Value, "GE.M.D") '年号.月.日
Label3.Caption = .Cells(i, 3).Value
End With
End Sub
早速のご回答ありがとうございます。一つ一つ具体的な案を頂きましたので、ゆっくり解読して自分のものにしていきたいと思います。
>掲示板では、作成依頼のような質問は達成が難しいです。基本的には、私は回答していません。AccessかExcelかというような選択的な問題は、ほとんど関係ありません。自分が得意なものでやればよいです。
ホントそうですよね。こちらが初心者でどのように質問して良いかわからない状況での質問文のためご回答者様方は回答にご苦労されるかと思います。皆様から色々アドバイスを頂き、自分のやりたいことをできるために、同時に基礎から勉強していきたいと改めて思いました。
No.3
- 回答日時:
通常はそういう処理の場合はAccessやOracleなどのデータベースを使うのが一般的です。
が、どうやらそういう環境が無いとのことなので。
ExcelVBAでやるのであれば、力技でやっていくしかないですね。
各シートをデータベースで言うところの、テーブルとして扱う方法が一番無難だと思います。
ただ、やりたいことが結構複雑なので工夫が必要です。
やり方はいろいろあると思いますが。
まず現在の情報とは別に、検索結果をおいておくシートを用意します。
同様に印刷用のシートも用意。
(1)で検索した結果を上記の検索結果用シートに出力します。
検索結果シートの情報で選択の判断となる情報をリストとして表示。
リストで選択した人の情報を検索し、印刷用シートに出力
こんな感じになるのではないかな。
出力の工夫に関しては出力レイアウト等がかかわってくるので、そこは設計次第かと。
(5)に関してはエクセルのセルの書式が標準(Excelが勝手に判断)となっているのが原因なので、
文字列等、書式タイプを明確にすれば良いかと。
(6)はうろ覚えですが、main()という関数をThisWorkBookに作れば、そこから起動します。
他のポイントとして、複数のデータから単一データを表示させるのであれば、
「一意性」が確保されているかがポイントとなります。
つまり、この情報があれば、この人の情報だと断定できる情報が存在するか。
(データベースで言うところのプライマリ・キー)
無いのであれば、その情報を追加する必要があります。(曖昧検索を許可するなら必須)
たとえば、名前だけでは同姓同名が居た場合、判別不能。
電話番号だけでは、同じ家の人が複数人入っていた場合、どちらの情報なのか判別不能。
なので、この情報とこの情報があれば、特定できるという情報の選定をする必要があり、
検索を行う場合、それらの情報は特定に必要な情報として、検索時に、完全一致で必ず入力させるようにしなければなりません。
(もしくは何らかの方法で内部で持つか)
これを最初の検索の時点でやれば、検索結果用シートは要らないと思いますが、内容的に、途中で曖昧検索が入るので、ワンクッション取らざるを得ないです。
検索処理に関してては、検索対象文字をキーとして、
全データをループで回して一致するかどうかチェックしていくしか方法は無いです。
なので、力技になってしまいます。
Accessであれば、クエリという機能でこの辺りを簡単に作れますし、
印刷用のフォーム等の機能も有りますし。
データリンク等を使えば、かなり楽に作れます。
(当然データベースの考え方を知っておく必要はありますが)
ですがそういう環境が無いなら力技で地道にやっていくしかないです。
(フリーのデータベースソフトもありますが、Oracleクラスの知識を必要とするのでこちらは薦めません)
まぁ他にもいろいろ方法はあると思うので一例として。ご参考まで。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) ユーザーフォーム「frm_基本❶」を立ち上げると新規で入力する行数を右下のNoとして表示しています。 1 2023/03/16 19:02
- C言語・C++・C# c言語の問題です 2 2023/07/21 10:51
- Visual Basic(VBA) VBA Userformで一部別シートに転記がしたいのですが 2 2023/05/24 13:08
- Visual Basic(VBA) 検索のユーザーフォームの表示について 1 2023/03/27 23:31
- Visual Basic(VBA) VBAでoutlook365が起動しません。 4 2022/08/25 13:31
- Excel(エクセル) 並べ替え、ソートの構文がわからない。 お世話になります。VBA超初心者です。 エクセルでワークシート 2 2023/06/28 21:00
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
- Visual Basic(VBA) 列と行の名前(重複あり)が交差するセルに、データを入力したい 2 2022/06/25 22:42
- Visual Basic(VBA) VBAが止まります。 3 2022/08/31 14:09
- Visual Basic(VBA) Changeイベントで複数セルへの貼り付けおよび値削除時に1個目のセルのみエラーになる 3 2022/12/21 09:07
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Excelでシートの違うデータでグ...
-
複数シートからデータを拾って...
-
エクセルファイルのシート毎の容量
-
excelの不要な行の削除ができな...
-
VBAで CTRL+HOMEの位置へ移動...
-
シート削除して同名シート追加...
-
エクセル 縦に長い表の印刷時...
-
EXCELで2つのファイルから重複...
-
EXCEL 複数行のデータを1行にま...
-
ファンモータが作動しない。
-
トランジスタの選び方
-
LiberaOfficeでグラフを別シー...
-
時間帯の重複を除いた集計について
-
【Excel】プルダウン用リストの...
-
オートフィルタで抽出したデー...
-
Excelで日付変更ごとに、自動的...
-
ExcelマクロのSendkeysで処理途...
-
コンボボックスの参照先(ListF...
-
別々のシートの表をピボットテ...
-
エクセル VBA VLOOKUP
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
複数シートからデータを拾って...
-
excelの不要な行の削除ができな...
-
エクセルファイルのシート毎の容量
-
Excelでシートの違うデータでグ...
-
シート削除して同名シート追加...
-
Excelで日付変更ごとに、自動的...
-
VBAで CTRL+HOMEの位置へ移動...
-
【エクセルマクロ】複数シート...
-
トランジスタの選び方
-
EXCEL 複数行のデータを1行にま...
-
EXCELで2つのファイルから重複...
-
別々のシートの表をピボットテ...
-
エクセル VBA VLOOKUP
-
他のシートの一番下の行データ...
-
エクセルのカメラ機能について
-
時間帯の重複を除いた集計について
-
EXCEL の表を一行ずつシートに...
-
ファンモータが作動しない。
-
エクセルで名簿を50音で切り分ける
-
エクセル マクロ "特定の日付...
おすすめ情報