私は友人のために小さなアプリケーションを作成していますが、彼らはExcelをフロントエンドとして使用できるようにしたいと考えています。 (UIは基本的にExcelのユーザーフォームになります)。クエリできるようにしたいExcelのデータがたくさんありますが、Excelをデータベースとして使用したくないのは、その目的にふさわしくないと思い、Accessの使用を検討しています。 [ところで、Accessには欠点がありますが、利用可能な予算はゼロであり、Accessは既に友人のPCにあります]
要約すると、多数のデータをAccessにダンプし、Excelをフロントエンドとして使用してデータベースを照会し、ユーザーフォームスタイルの環境で結果を表示することを検討しています。
質問:
Excel VBAの強力なスキルがあり、Access VBAを非常に迅速に克服できると思いますが、Excel/Accessリンクを実際に実行したことはありません。データをExcelに挿入して準データベースとして使用することもできますが、それは価値がある以上に苦痛に思えます(堅牢な長期ソリューションではありません)
アドバイスをお願いします。
アレックス
「これをしないでください」という答えがたくさん得られると確信しています。それには、正当な理由があります。これは理想的な解決策ではありません。..
そうは言っても、主に仕事でそれが厳しい要件として指定されており、それについて話すことができなかったため、私はこの道(および同様のもの)を前に行ったことがあります。
これについて考慮すべきことがいくつかあります。
ADO/DAOを使用してExcelからAccessにリンクするのは簡単ですか?機能の面でかなり制限されていますか?
それはかなり単純です。 VBAおよびExcelフォームは、ほとんどの完全なプログラミング言語よりも制限が厳しいため、他のツールを使用して行うよりも制限がありますが、ショーストッパーとなるものはありません。それは動作します-時には少しいですが、動作します。私の最後の会社では、これを頻繁に行わなければなりませんでした。また、ExcelのVBAを介してAccessとOracleからデータを引き出すこともありました。
パフォーマンスのペナルティを支払いますか(vs. UIとしてAccessでフォームを使用する)?
私の経験では、間違いなくパフォーマンスがあります。これを行う場合のペナルティ。私は気にしませんでした(私の使用例では、物事は十分に小さくて合理的でした)が、ExcelにアクセスするのはAccessで直接作業するよりもずっと遅いです。その一部は、あなたが何をしたいかに依存します。
私の場合、絶対的に最も遅い(そして最も痛い)ように思えたのは、Accessデータに基づいてExcelスプレッドシートに入力しようとしていました。これは面白くなく、非常に遅いことがよくありました。この道を下る必要がある場合は、Excelの非表示/非表示を使用してすべてを実行してください。そうしないと、再描画によって完全に死亡します。
データベースが常にADO/Excel VBA内からのDAOコマンドを使用して更新されると仮定すると、その単一のAccessデータベースを使用して複数のExcelユーザーを持ち、同時実行の問題などに遭遇しないことを意味します。?
クライアントとしてExcelをほとんど使用しています-WinFormsアプリケーションまたは他のツールを使用するのと同じ方法です。 AccessのADO/DAOクライアントは非常に優れているため、同時実行性の問題は発生しません。
そうは言っても、Accessはうまく拡張できません。これは、2人または3人(または10人)のユーザーがいる場合に役立ちます。あなたが100人になるとしたら、おそらく問題に遭遇するでしょう。また、破損の問題が発生しないように、Accessには定期的なメンテナンスが必要であることがわかりました。 Access DBの定期的なバックアップは必須です。私の経験では、定期的にアクセスデータベースを圧縮すると、データベースの破損を防ぐのに役立ちます。
他に知っておくべきことはありますか?
あなたはこれを難しい方法でやっています。 Excelを使用してAccessをヒットすることは、Accessを直接使用する場合よりも多くの作業が必要になります。
Access VBA APIを検討することをお勧めします。そのほとんどはExcelと同じであるため、学習曲線はわずかです。異なる部分は、これを簡単にするだけです。また、Excelに比べてはるかにデータ指向のAccessレポートとフォームのすべての利点があります。レポートはこのようなものに最適である可能性があり、マクロとレポートがあると、長期的には楽になります。ユーザーがフォームを使用してすべてを管理する場合、Accessでフォームを実行することはExcelでフォームを実行することに非常によく似ており、ほとんど同じように見えますが、すべてがより速くスムーズになります。
私はいつもこれをしています。 ADOを使用している場合、実際にはAccessではなく、基になるデータベースであるJetを使用しています。つまり、Excelを持っている人なら誰でもアプリを使用できます-アクセスは不要です。言及する必要があります、私が働いている場所はたくさんのOffice Small Businessライセンスを購入しました-Accessはありません。ここで働く前に、Excelを持っている人は誰でもAccessを持っていると想定していました。そうではありません。
Accessのテーブルごとに1つのクラスを作成します。 ADOを介してクエリを実行することはほとんどなく、代わりにそのロジックをクラスモジュールに保持します。 SELECTステートメントで読み取り、ADODB.ConnectionオブジェクトのExecuteメソッドを使用してUPDATEまたはINSERTで書き込みます。
http://www.dailydoseofexcel.com/archives/2008/12/21/vba-framework-ii/ を参照してください
コードの設定方法を確認したい場合。
質問に答えるには:Excel VBAを既に知っている場合、それは小さな学習曲線になりますが、やることがいくつかあります。 Accessですべてを実行するとパフォーマンスが低下しますが、それほど悪くはなく、価値があるかどうかを判断できるのはユーザーだけです。また、複数の人がデータベースにアクセスすることができます。
Excelの部分をスキップするだけ-Excelのユーザーフォームは、より堅牢なAccessフォームの貧弱なバージョンです。また、Access VBAはExcel VBAと同じです-Accessのオブジェクトモデルを学習するだけです。単純なアプリケーションを使用すると、とにかく多くのVBAを記述する必要がなくなります。Accessでは、非常に簡単に接続できるためです。
エンドユーザーがAccessを持っている場合、Accessですべてを開発する方が簡単かもしれません。 Accessには、WYSIWYGフォームデザインツールが組み込まれています。
ユーザーフォームをExcelで実行することに大きな利点がない限り、レポートとデータをアドホックベースでExcelにエクスポートする100%Accessソリューションを使用します。
あなたが説明していることから、Accessはデータを操作するために構築されているため、より強力な候補のようです:
データの問題を解決するために、Excelの制限を回避してAccessになるために必要なものよりもはるかに多くのツールを使用できます。
ご質問について:
非常に簡単。その主題に関してSOについて他の質問がいくつかありました。
たとえば this one および that one を参照してください。
わからないが、小さなペナルティがあるかもしれないと思う。
最大の難関は、Accessが提供するすべての機能を取得し、これらの一部をExcelで再作成することです。
はい。複数のExcelユーザーと1つのAccessデータベースを使用できます。
ここでも、Accessをフロントエンドとして使用し、ネットワーク上のリンクされたAccessデータベースにデータを保持する方が理にかなっており、円グラフのように簡単です。 わずか1クリックで離れます 。
実際、他のほとんどの人が言っているように、Accessに慣れるには少し時間をかけるだけで、時間と手間を大幅に節約できます。
。
Accessでそれを行う他の利点: Access 2007ランタイムは無料 。つまり、アプリを1台または30台のPCに展開する場合、同じコストがかかります:nothing。
開発作業に必要なAccessのフルバージョンは1つだけです(ランタイムにはデザイナーがありません)。
本当にアプリケーションに依存します。通常のプロジェクトでは、Accessのみを使用することをお勧めしますが、場合によってはニーズが特定であり、Excelスプレッドシートがより適切な場合があります。
たとえば、私が元雇用主のために開発しなければならなかったプロジェクトでは、フォーム上でさまざまな人にアクセス権を与え(各人ごとに異なるデータが事前に入力されている)、それらを完成させてから再インポートする必要がありましたデータ。
フォームは重い数値演算を使用していたため、Excelで作成する方が理にかなっています。
さまざまな人のためのExcelブックは、VBAを使用してテンプレートから構築され、適切な場所に保存され、フォルダーに対するアクセス権が付与されます。
すべてのワークブックは、名前付き範囲を使用して、外部テーブルとしてワークブックに添付されました。その後、Accessアプリケーションからワークブックを照会できます。管理用のものはすべてデータベースから作成されましたが、エンドユーザーはそれぞれのワークブックにのみアクセスできました。
この方法でExcel/Accessアプリケーションを開発するのは楽しい経験であり、UIはAccessを使用するよりもユーザーフレンドリーでした。
この場合、Excelを使用するよりもAccessで実行する方がはるかに時間がかかると言わざるを得ません。また、ExcelではAccessよりもApplication Object Modelの方が優れているようです。
Excelをフロントエンドとして使用する場合は、すべてのセルをロックすることを忘れないでください。ただし、編集可能なセルをロックし、マスクされた行と列を使用することを恐れないでください(アクセスデータベースの出力テーブルを構築して、計算など)。
また、データのインポート中は自動計算をオフにする必要があります。
ExcelをAccessデータのレポートツールとして使用するのは非常に簡単で効率的です。簡単な「非プログラミング」アプローチは、外部データソースにリンクされたリストまたはピボットテーブルを設定することです。しかし、これはStackoverflowの範囲外です。
プログラムによるアプローチは非常に簡単です。
strProv = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & SourceFile & ";"
Set cnn = New ADODB.Connection
cnn.Open strProv
Set rst = New ADODB.Recordset
rst.Open strSql, cnn
myDestRange.CopyFromRecordset rst
それでおしまい !
Accessの使いやすさを考えると、数値演算のためにデータをエクスポートする以外にExcelを使用する説得力のある理由はありません。 Accessはデータフォームを簡単に作成できるように設計されており、Excelを使用するよりもはるかに簡単で時間もかかりません。 Accessオブジェクトモデルを習得するのに数時間かかると、時間と労力の面で何倍もの費用がかかります。
私は私の1つのプロジェクトでそれをしました。 MDBを使用して請求書に関するデータを保存し、Excelを使用して請求書をレンダリングし、ユーザーがそれを調整できるようにしました。
この場合、最適なソリューションは次のとおりです。
ExcelでADO/DAOを使用しない。すべてをMDBモジュールのパブリック関数として実装し、Excelから直接呼び出しました。必要な引数を指定してMDB関数を呼び出すことにより、文字列の配列などの複雑なデータオブジェクトも返すことができます。これは、最新のWebアプリケーションのクライアント/サーバーアーキテクチャに似ています。Webアプリケーションはレンダリングとユーザー操作を行うだけで、データベースと中間層はサーバー側にあります。
ユーザーとのやり取りやデータの視覚化にExcelフォームを使用します。
通常、設定用の名前領域を含む最後のシートがあります。MDBファイルへのパス、設定(現在のユーザー、必要に応じてパスワードなど)-Excelの実装を異なる場所に簡単に適合させることができます。終了」データ。
それは、Excel <-> Acessソリューションによって期待される機能の量に依存します。完全なアプリケーションソリューションを得るための予算がない多くの場合、これらの小さなユーティリティは機能します。プロジェクトの範囲が限られている場合は、Excelを使用すると、ニーズに応じてスプレッドシートを柔軟に設計でき、ユーザーが使用できるように事前に設計されたシートを使用できるため、このソリューションを選択します。 Accessでフォームのようなスプレッドシートを設計するのはより時間がかかり、困難であり、ActiveXが必要です。このオブジェクトは、データを処理するだけでなく、形式のようなスプレッドシートで表示する場合があるため、このソリューションは限られた範囲で機能します。
VBAを使用してExcelをAccessに接続することは非常に便利です。私は毎日仕事でそれを使用しています。私が使用する接続文字列は、以下のリンクにあるプログラムに従っています。プログラムは、複数の接続またはタスクをオンショットで実行するように自動化できますが、基本的な接続コードは同じに見えます。がんばろう!