- 締切済み
エクセルやアクセスでこういった操作を実現できますか?
はじめまして。業務で使うためにエクセルやアクセスで以下の操作を 実現できればと考えているのですが出来るでしょうか? -------------------------------------------------------- 質問1)例えばエクセルやアクセスで商品名を選んで 単価を表示することは出来ると思いますが、 ドラックアンドドロップでセルの中にその商品を 選んで入れることは出来るでしょうか? (選択肢がすごく多く、IDでの入力や商品名を リストから選ぶと時間がかかるため、タブを使って 商品をグループ分けをして選びたいため) 質問2)上記が出来ない場合、商品の名前を打つたびにリスト表示 が出来るようにできますか? (例えば”あ”と入力すると頭文字が”あ”のものがリスト 表示され、次の”い”を入力すると頭文字2文字の”あい” が絞り込まれて表示されるようにです) -------------------------------------------------------------- 以上、わかりにくい質問かもしれませんが、よろしくお願いいたします
- みんなの回答 (4)
- 専門家の回答
みんなの回答
s_husky です。 先のは、時間がなかったので Access.adp で自作している関数を示したものです。イベントで用います。 エクセルは、一度も操作したことがありませんので判りません。 が、私ならば、多分、 Private Sub Worksheet_Change(ByVal Target As Range) End Sub で、当該リストを検索・表示することになると思います。 ※絞込み検索といっても、実現の仕方は実に多様です。 ※データベースから検索する、データシートを用意する、データメニューの入力規則を利用するetc. ※また、システムの構築作法も様々です。 ※データ管理はAccess、作表はExcel と割り切るか否かで大きく違ってきます。 ※また、あらゆるケースを想定した関数パッケージを用意するHusky流も是であり非です。 ※一つの関数の不具合は、全システムをストップさせます。 ※一番良いのは、自らのスタイルを確立されることです。 ご奮闘を祈っています。
あくまでも素人のやり方です... <1のやり方> ・タイマーで監視します。 ・選択されたら、マウスの下に影を表示します。 ・影をマウス座標に連動して動かします。 ・マウスがオフになったら、その座標に位置するコントロールを改定するルーチンへ。 ・確定したコントロールに値を代入し影を消します。 プロは、もっと、スマートなやり方をすると思います。 <2のやり方> ・Chengeイベントで 次のような DBSelect関数を利用して値リストを更新します。 ' ------------------------------------------------------------------------------------------------------- ' DBSelect(列リスト, ' 表名, ' グループ指定文, ' 条件文, ' 並び替え文, ' isOneSentence, ---- 列データをセミコロン(;)で連結して1文にするか否か? ' isConvert) -------- 列データを表示形式に変換してから配列に代入するか否か? ' ------------------------------------------------------------------------------------------------------- Public Function DBSelect(ByVal strFields As String, _ ByVal strTable As String, _ Optional strGroupBy As String, _ Optional strWhere As String, _ Optional strOrderBy As String, _ Optional isOneSentence As Boolean = False, _ Optional isConvert As Boolean = False) As Variant On Error GoTo Err_DBSelect Dim I As Integer Dim J As Integer Dim R As Integer ' データを代入する配列 DataValue(,) のインデックスを決める行カウンター Dim C As Integer ' データを代入する配列 DataValue(,) のインデックスを決める列カウンター Dim M As Integer ' データを代入する配列 DataValue(,) の一つ目の添字の最大値=行総数 - 1 Dim N As Integer ' データを代入する配列 DataValue(,) の二つ目の添字の最大値=列総数 - 1 Dim strQuerySQL As String Dim rst As ADODB.Recordset Dim fld As ADODB.Field Dim strList As String ' 全てのデータをセミコロン(;)で区切った1行の文字列を格納する変数 Set rst = New ADODB.Recordset strQuerySQL = "SELECT " & strFields & " FROM " & strTable If Len(strGroupBy) > 0 Then strQuerySQL = strQuerySQL & " GROUP BY " & strGroupBy End If If Len(strWhere) > 0 Then strQuerySQL = strQuerySQL & " WHERE " & strWhere End If If Len(strOrderBy) > 0 Then strQuerySQL = strQuerySQL & " ORDER BY " & strOrderBy End If ' ================= ' Begin With: rst ' ----------------- With rst .Open strQuerySQL, _ CurrentProject.Connection, _ adOpenStatic, _ adLockReadOnly If Not .BOF Then ' -------------- ' 配列を再宣言 ' -------------- M = .RecordCount - 1 N = .Fields.Count - 1 If M > 99 Then MsgBox "読込む行総数を100行に下方修正しました。(DBSelect)", vbInformation, " お知らせ" M = 99 End If ReDim DataValues(M, N) ' ------------------------------------ ' 列情報を For-Next で配列に代入する ' ------------------------------------ .MoveFirst For R = 0 To M C = -1 For Each fld In .Fields ' ================= ' Begin With: fld ' ----------------- With fld C = C + 1 If Not isConvert Then DataValues(R, C) = Nz(.Value, "") Else ' -------------------------- ' 列データを表示形式に変換 ' ------------------------- Select Case .Type Case adBoolean ' ブール型 DataValues(R, C) = IIf(.Value = -1, "Yes", "No") Case adChar, adVarChar ' 文字列型 DataValues(R, C) = Nz(.Value, "") Case adDBDate, adDBTimeStamp ' 日付型(yyyymmdd)、日付/時刻型(yyyymmddhhmmss + 1/10億) DataValues(R, C) = .Value Case adSmallInt, adInteger ' 整数 DataValues(R, C) = FormatNumber(.Value, 0) Case adSingle, adDouble ' 浮動小数点型 DataValues(R, C) = FormatNumber(.Value, 2) Case adCurrency ' 通貨型 DataValues(R, C) = FormatCurrency(.Value, 2) Case Else DataValues(R, C) = .Value End Select End If End With ' --------------- ' End With: fld ' =============== Next fld .MoveNext Next R Else ReDim DataValues(0, 0) DataValues(0, 0) = "" strList = "" End If End With ' --------------- ' End With: rst ' =============== If isOneSentence Then ' ------------------------------- ' セミコロン(;)で連結して1文に ' ------------------------------- For I = 0 To M For J = 0 To N strList = strList & DataValues(I, J) & ";" Next J Next I End If Exit_DBSelect: On Error Resume Next rst.Close Set rst = Nothing DBSelect = IIf(isOneSentence, strList, DataValues()) Exit Function Err_DBSelect: MsgBox "SELECT 文の実行時にエラーが発生しました。(DBSelect)" & Chr$(13) & Chr$(13) & _ "・Err.Description=" & Err.Description & Chr$(13) & _ "・SQL Text=" & strQuerySQL, _ vbExclamation, " 関数エラーメッセージ" Resume Exit_DBSelect End Function
私が、素人ですので、ちょうど良いかと思って答えます。 1、私には、無理です。 ・模擬的に絵を飛ばすことはできます。 ・が、絵がツツーゥと移動する前にコピーは終わります。 ・そういう訳で、クリックアンドクリックでコピーするように仕組むと思います。 2、可能です。 ・だが、件数次第と思います。 ・検索・表示時間を短縮するために最大表示件数を決めるでしょう。 ・あ->で20件を表示。[一部]or[全部]を明示。 ・あい->で再び表示。[一部]or[全部]を更新。 ・あいう->で、更に絞りこむ。[一部]or[全部]を更新。
お礼
回答ありがとうございます 2については具体的にはどうやればよいのでしょうか?
- akio_myau
- ベストアンサー率34% (515/1480)
ExcelでもAccessでもどちらでも可能です。 例えばExcelではデータメニューの入力規則を使い 設定タブの入力値の種類をリストを選ぶことで 同じシート内の範囲や、直接表示させる値を入れることで可能になります。
補足
回答ありがとうございます 入力規則を使う方法は私にも出来るのですが それですと検索対象が多くなるとリストが長くなるので 余計に入力しにくくなってしまいました そこでタブで検索対象を分け、一つのセルに入力する時 複数のタブからの一つのタブを選び、それからリスト入力が 出来ないかと思ったものですから・・・
お礼
回答ありがとうございます 私自身、素人で詳しくないんですが、 ご回答いただいたものはVBAだと思っていますが、 このVBAをイベントとしてブックに反映させるということでしょうか? それともセルに指定するのでしょうか?