質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

2回答

245閲覧

EXCELからのデータベース更新

yuujiMotoki

総合スコア90

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2018/09/24 14:46

EXCELからのデータベース更新について教えてください。

現在、外部キーを使って構成したマスターデータがあります。
マスターデータは外部キーだけでは意味不明なため、
クエリを使って、外部キーとそれに紐付けされたフィールドデータの両方を
読み込んでいます。

|データ1|データ2|データ3|id1|id2|id3|
|:--|:--:|--:|--:|--:|
||||

EXCELシートには、データ13を表示させて、id1id3は非表示にしております。

データはコンボボックスで入力しますが、その際は、データ1(id1)、データ2(id2)、データ3(id3)の組み合わせを、DICTIONARYを使って内部に保持しており、
データ1~3を選ぶことで、ID1-ID3を書き換える方法をとっています。

マスターデータの更新時には、ID1-ID3のフィールドのみを書きこんでいます。

このような処理は、外部キーを使ったデータベースアプリとして、
理にかなったものでしょうか?

もっとうまいやり方があるような気がしてなりません。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2018/09/24 14:54

その「データベース」の種類は何でしょうか。この質問内容だけでは何も見えてこないのですが・・・。実際のコードや環境情報など、質問者さんが試したことが再現できる情報が必要に思います。
guest

回答2

0

もっとうまいやり方ってどこに対するどういうイメージでしょうか?

ユーザーには名称で選択させ、プログラムはIDで処理する、
よくある基本パターンだと思います。

ただ、リストの持ち方には幾つかのパターンがあるかもですね。
・リスト用のシートにもっておく
・起動時にDBからリストをもらい、シートにもっておく
・処理毎にDBからリストをもらい、処理する(シートにはもたない)
※シート上のリストは、A列:名称、B列:コード、、D列:名称・・・というイメージです。
※リストには名前の定義をつけて、かつ、動的範囲(OFFSET+COUNTA等)にしておきます。

ケースバイケースですし、
非表示列にシートの保護をかければ、値の編集はできなくすることもできます。
列の定義はEnumを使う事が多いですね。

まだなにか不自由を感じているのであれば、
あなたの設計に改善すべき点が多く残っているのでしょう。

投稿2018/09/25 01:02

ExcelVBAer

総合スコア1175

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

理にかなったものでしょうか?

理にかなっている場合もあり、そうでない場合もあり。要件の複雑さ次第です。
私見ではありますが、id列をわざわざ破壊するようなユーザーがいないのであれば十分だと思います。

これはExcelの問題というよりは、DBやアプリの設計、業務の理解にかかる問題です。
今の時点で使えているのであれば一旦満足(妥協)し、今後不満が出てくればその具体的な問題に応じて考える、でも良いのではないかと思います。

問題の例:
- データとidの組み合わせを変える必要が出てきた。過去のデータをどうする?

  • 既存入力分のデータ表示はしたいが、新規入力はさせたくないidがある

 - 上司のチェックを逃れるため等の理由で、id列を手入力する輩がいる

あまり先回りした実装をすると、後々複雑さの波に呑まれ、手詰まりになりかねないです。
勉強のために、非公開の派生版を作ってみるのは良いと思います。

投稿2018/09/24 15:16

morinatsu

総合スコア395

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yuujiMotoki

2018/09/24 21:34

アドバイスありがとうございます。 ID列のセキュリティ面については、まったく現在の思考に及んでおらず 実使用後にも、いろんな問題が出てきそうなので、新たな視点でも 考えないといけないかなと思いました。 今回はEXCELベースなので、DBアプリのUIとしては、ユーザーに触らせるのが前提になっていて、 どちらかというと、中身がばれたり、壊れてもユーザー責任の部分はあります ただ、少々の手荒なコード改造なども想定しているのですが、いかんせん今のDB設計自体と、 それを取り巻くDB⇔EXCELシート(UI)、EXCELシート⇔VBA内部コードの部分で、 かなり複雑なコードになってしまい、ゆくゆく自分ですらメンテナンスが大変な気がしています。 今回の質問内容については、これが他の言語やSQL言語だったら、おそらくDB変数表から、かなり検討しなければならない内容かもしれません。 ACCESS,EXCELですので、データベース構造とUIを触りながら、 VBA、シート関数、クエリなどを駆使して、使い心地とすぐに動くものを優先するという 体制になっています(これがやれてしまうのも、逆な利点でもありますが) 要件定義など、モデリングなど、必要な手続きをやっていない。これはシステム開発の現場の方から言えば、本当にテストモデルなのかもしれません。 ただVBAでやれることと、素人への普及を考えた場合には、今回取り入れた方法が、ひとつの開発事例になるかもしれません。その際に、DB設計の段階で、ID列を使わずに直接文字列のほうが、100倍は分かりやすいです。(一方では、データが膨らんでくることや、他言語での大規模リファクタリングを考えた場合は、データの正規化はしておかないと太刀打ちできないとは考えています) 今回の質問にはなりますが、一般的なデータアプリの場合、開発段階でデータベースの フィールドが変更になったりする場合に、コードを変更する際に、どこまで事前に設計できたりするのか、もしくは外部データなどを読み込んで、テーブル生成からシステム的にDB構造を動的に変えたりするのか、そのあたりを知りたいと思っています。(質問が分かりにくくてすみませんでした)
morinatsu

2018/09/25 02:08

なるほど。お知りになりたいことは分かりました。 質問者さんの知りたいことに簡潔に答えるのはとても難しく、質問に回答を返す的なサイトで扱える範疇を超えています。 皆、過去の経験や試行錯誤、書籍やWebからの情報を通じて「なんとかアンチパターンに陥るのを避ける」ようにしているのが現状だと思います。 『一般的なデータアプリ』というのは未だ存在しておらず、それぞれの用途と環境での利用に耐えるアプリを個別に設計しているのです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問