Microsoft Access 掲示板

views
4 フォロー
6,283 件中 2,441 から 2,480 までを表示しています。
2

下記でどうでしょう。

Shell """" & A & """ """ & B & C & """"

複数バージョンをインストールしているとか、特別なことをしてなければ、excel.exeはたいていパスが通っているので、下記でも大丈夫かと。

Shell "excel.exe """ & B & C & """"
1
りんご 2022/06/09 (木) 16:42:09 c564b@0e907

ちょっと上手く動くか分かりませんが。
Shell """" & 変数A & """" & """" 変数B & 変数C & """"
もしくは
Shell """" & 変数A & """""" 変数B & 変数C & """"

8
ほり 2022/06/09 (木) 15:55:11 10b1e@0e92c

hatenaさん、りんごさん、アドバイスありがとうございます。
まず、オプショングループを設置してでのクエリを開くは無事作成することができました。

今まではクエリの抽出指定する時などは非連結のテキストボックスやプルダウンリストを使っていましたが、オプショングループは使用者にとって視覚的にもわかりやすいですね。
今までの知識だと今回のようなケースはあらかじめ年別、月別、日別、全期間でグループ化しておいたクエリを作って、フォームにそれぞれを開くボタンを設置していましたがとてもシンプルになりました。

結果は今までの方法でも得られたと思いますが、クエリやフォーム上のボタンなど乱立もせず、ボタンのイベントも複数個所メンテナンスする必要がなくなるのでしっかり身に着けたいと思います。ありがとうございました。

9
もちっこ 2022/06/09 (木) 14:30:31 b2348@20787

Dim WshObj As Object
Dim UN As String
Set WshObj = CreateObject("WScript.Network")
UN = WshObj.UserName

をいれて UsernameをUNにしたら できました
回答をしてくれた方ありがとうございました

8
hatena 2022/06/09 (木) 14:09:44 修正

質問では「任意のフォルダにエクセルで出力したい」とのことですが、この「任意のフォルダー」とは何でしょうか。
具体的に説明してください。

ログインユーザー名は
Environ("USERNAME")
で取得できますが、それは任意のフォルダーとは言わないと思います。

7
もちっこ 2022/06/09 (木) 13:44:46 b2348@20787

①と②を試したところUserNameが取得できていませんでした
表示させるとC:\Users\○○○リスト2022****.xlsx となってしまいます
どうすれば UserNameをうまく取得できるのでしょうか

3
りんご 2022/06/09 (木) 13:32:27 c564b@0e907

>> 1
Aテーブル.詳細フィールドとBテーブル.内容フィールドを内部結合する、これでも差し障りないと思いますか?

7
りんご 2022/06/09 (木) 13:16:15 c564b@0e907

>> 3
横にそれます。あえて、年月別のテーブルに持つ、という選択肢もあるようです。組み方はちょっと分かりませんが。

6
りんご 2022/06/09 (木) 13:05:18 c564b@0e907

横からすみません。>> 4の "\○○○リスト"でも駄目でしたか?
しっかり把握していませんが、取り敢えず、下記をやっておくと解決に近づくかもしれません。
①変数UserNameとFormat関数の部分を手打ちに置き換える。結果、問題なく開ける?
②変更UserNameとFormat関数の中身をMsgboxやDebug.Printで表示。結果、①の手打ちと同じ?

5
もちっこ 2022/06/09 (木) 11:49:12 b2348@20787 >> 3

strPath = "C:\Users\" & UserName & "○○○リスト" & Format(Now(), "yyyymmdd") & ".xlsx"
としましたが
今度は実行時エラー’2220’
ファイルC:\Users\" & UserName & "○○○リスト2022****.xlsx"を開くことができませんと表示されます

4

上記でダメなら下記も試してみてください。

strPath = "C:\Users\" & UserName & "\○○○リスト" & Format(Now(), "yyyymmdd") & ".xlsx"
3
strPath = "C:\Users\" & UserName & "○○○リスト" & Format(Now(), "yyyymmdd")

の部分ですが、ファイルパスに拡張子をつけてみてください。

strPath = "C:\Users\" & UserName & "○○○リスト" & Format(Now(), "yyyymmdd") & ".xlsx"
2
もちっこ 2022/06/09 (木) 09:57:58 b2348@20787 >> 1

Excel出力のVBAを以下のように書きました

Private Sub Excel出力_Click()

'変数宣言

Dim strPath As String

'Excelエクスポート先のファイルパス
strPath = "C:\Users\" & UserName & "○○○リスト" & Format(Now(), "yyyymmdd")

'Excelファイルの出力
DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel12Xml, "○○○リスト出力", strPath, False

'Excelファイルをエクスポートした旨を通知する。
MsgBox "○○○リストを出力しました。" & vbCrLf & "C:\Users\" & UserName & "\OUT\", vbInformation

End Sub

を実行すると
実行時エラー’3051’
ファイル’C¥Users¥○○○リスト2022****’を開くか、書き込むことができませんでした。ほかのユーザーが排他的に開いているか、データーの表示と書き込みを行う権限がありません。

とメッセージがでてしまいます
どうしtら解消できるでしょうか

よろしくお願いします

6

下記の手順で簡単にオプショングループを設置できます。

コントロールウィザードがONの状態でフォーム上にオプショングループを配置します。
ウィザードで、ラベル名を下記のように設定すれば、あとは、次へボタンをクリックしていけば完成します。

画像1

あとは、クエリを開くコマンドボタンを配置すればいいでしょう。

画像1

5
ほり 2022/06/08 (水) 17:57:56 10b1e@0e92c

早速上記のフィールドを作成して試してみました!
まだフォームでの切り替え制御までは手を付けられていませんが、既にクエリ実行時に表示されるダイアログで1~4を指定すればグループの間隔を1つのクエリで制御できました!基幹システムに備わっている集計機能の煩わしさをこれでフォローできてしまいそうです…勉強になりました。

4

年別、月別、日別、全期間などグループ化する重点をどこかに置くかの違いだけで似たようなクエリが続出していきます。

下記のようなフィールドを作成してそれでグループ化すれば一つのクエリで可能です。

間隔: Format([年月日],Choose([年別:1, 月別:2, 日別:3, 全期間:4],"yyyy","yyyy/mm","yyyy/mm/dd","全期間"))

[年別:1, 月別:2, 日別:3, 全期間:4]というパラメータが出ますので1~4の数値を入力することでグループ間隔を指定できます。

フォームにオプショングループを配置しておいて、それを参照するようにすれば、フォームでオプションを選択すればグループ間隔を切り替えて表示できます。

間隔: Format([年月日],Choose([Forms]![フォーム1]![フレーム1] ,"yyyy","yyyy/mm","yyyy/mm/dd","全期間"))
3
ほり 2022/06/08 (水) 16:19:33 10b1e@0e92c

早速のご回答ありがとうございました。
上記方法ですぐに求めていることが実現できました、助かりました。

追記に関してですが、かえって混乱をさせてしまいました。解決済みです。
集計するのに年単位、月単位で見れるようにしたいというのが希望でしたが、それに関しては2つのクエリを作成して年別クエリには年だけのフィールド、月別クエリには年、月を用意しておけば良いとわかっていました。

月別売上実績
年 月 顧客名 売上額 粗利額 粗利率
2022 4 A株式会社 10000 8000 80%
2022 5 A株式会社 20000 8000 40%
2022 6 A株式会社 30000 8000 27%
2022 4 有限会社B 5000 4000 80%
2022 5 有限会社B 6000 3000 50%
2022 6 有限会社B 7000 2000 29%

年別売上実績
年 顧客名 売上額 粗利額 粗利率
2022 A株式会社 60000 24000 40%
2022 有限会社B 18000 9000 50%

すごく初歩的なお話になってしまうのですが、こういったデータ分析をするのにAccessクエリを使うことは過去にもよくありましたが上記例のように年別、月別、日別、全期間などグループ化する重点をどこかに置くかの違いだけで似たようなクエリが続出していきます。クエリが増えていくこと自体は業務で必要なことなので構わないのですが、これってスマートなやり方なの?と思うときがあります。

2

追記に関しては、現状の 年:Year([売上計上日)]と月:Month([売上計上日]) の設定では希望と異なるのですか。
具体的にどのような出力になってほしいのでしょうか。
希望の出力を例示してもらえますか。

1

クエリのデザインビューで下記のように設定してください。

フィールド: 粗利率: SUM([粗利額])/SUM([売上額])
テーブル: 明細
グループ化: 演算
1

設定ダイアログで、ファイル形式で、拡張子が .xls のものを選択してませんか。
Excel Workbook(
.xlsx) に変更して試してみてください。

2
もちっこ 2022/06/08 (水) 12:26:23 b2348@20787

ありがとうございます
できました

1

クエリを新規作成して、AテーブルとBテーブルを追加します。
[詳細]フィールドの抽出条件に下記のように設定してください。

Like "*" & [Bテーブル].[内容] & "*"

これでご希望の結果になると思います。
SQLビューなら下記になります。

SELECT Aテーブル.*
FROM Aテーブル, Bテーブル
WHERE Aテーブル.詳細 Like "*" & Bテーブル.[内容] & "*";
1
nanana 2022/06/07 (火) 09:02:24 e48ae@6eb0c

自己解決ですみません。
    .Sheets(1).Cells(2, 1) = PONUM
    .Sheets(1).Cells(2, 2) = PRNUM
右辺と左辺が逆でした。
    PONUM = .Sheets(1).Cells(2, 1)
    PRNUM = .Sheets(1).Cells(2, 2)
でできるようになりました。
お騒がせしてすみませんでした。

8
Kanto 2022/06/06 (月) 17:18:14 e48ae@6eb0c

みなさまありがとうございます!
今、hirotonさんに教えて頂いた魔法使いの開発工房さんのやつをやってみて、できました!
今後データ件数はかなり増えることが予想されるので、りんごさん、hatenaさんのご提案もこれから試してみます!

こちらのサイトは本当に勉強になります!
ありがとうございました!

7

あ!よくみたら、りんごさんの式とは違いましたね。

ただ、この方法はインデックスが無効になるので、データ数が多いときは、避けたい方法ですね。
(フィールドが関数内に入っているので)

抽出条件でインデックスが無効になる場合 - hatena chips

2
りんご 2022/06/03 (金) 17:17:41 c564b@0e907

しっかり試してないけど、入力制限を外して、フォーカス喪失時に

If Len(Me.ほにゃららテキストボックス)=>10 Then
Me.ほにゃららテキストボックス.Undo
End If

Undoが駄目ならsetfocusでフォーカスを戻す。(10未満になるまでフォーカス喪失出来ないようにするとか)
エラーメッセは、適当なオブジェクトででっち上げて非表示から表示にするとか。ー

1
hiroton 2022/06/03 (金) 16:22:41 4c8c1@f966d

定型入力を使用してデータ入力形式を制御する

例えばCCCCCCCCCCと指定すれば10文字までになります
数字に限定するなら9999999999など

6
hiroton 2022/06/03 (金) 14:37:33 4c8c1@f966d >> 5

魔法使いの開発工房さんところのはフィールドでTrue/Falseを作る手法なのでNullなレコードも抽出対象ですよ(抽出条件はTrueだけ)

5
hatena 2022/06/03 (金) 13:55:36 修正

方法としては、主に下記の2つになります。

  1. クエリで抽出条件を設定する。そのクエリをフォームのレコードソースにして、再クエリで抽出条件を反映させる。
    このクエリをDoCmd.TransferText メソッドでエクスポートする。

  2. フォームのFilterプロパティに抽出条件を設定して、フィルタリングする。
    VBAでクエリのWHERE句をフォームのFilterプロパティで書き換える。
    このクエリをDoCmd.TransferText メソッドでエクスポートする。

前者は、シンプルですが対象フィールドが複数になると条件が複雑になりがちです。(PCTipsさんのリンク先参照)
魔法使いの開発工房さんの方法(=りんごさんの回答)は、割とシンプルですが、Null値のレコードは抽出されません。(それでも問題ない、あるいはNull値はないないら、これでいいでしょう。)

現状は、フォームのFilterプロパティに抽出条件を設定しているのて、2.の方法のサンプルを提示しておきます。

'Microsoft Office XX.X Access Database Engine Object Library に参照設定必用
Private Sub エクスポートボタン_Click()
    Dim db As DAO.Database
    Dim qd As DAO.QueryDef
    Dim strFilter As String
    Dim strSQL As String

    'フィルターが設定されてなかったら実行しない
    If Me.Filter = "" Or Me.Filter = "False" Then Exit Sub

    'クエリのSQLにWHERE句を追加
    Set qd = db.QueryDefs("クエリ1")
    strSQL = Replace(qd.SQL, ";", "")
    qd.SQL = strSQL & " WHERE " & Me.Filter & ";"

    'テキストエクスポート
    DoCmd.TransferText acExportDelim, "エクスポート定義1", "クエリ1", _
             "C:\Test\Output.txt"

    'クエリのSQLを元に戻す
    qd.SQL = strSQL & ";"
End Sub

クエリ1 はWHERE句のないシンプルなもの。
事前にクエリ1でエクスポートして、エクスポート定義を作成しておく。
エクスポート定義で、タブ区切り、やデータ型などを設定する。

4
りんご 2022/06/02 (木) 21:52:13 c564b@0e907

IIf([Forms]![txt出力]![コンボボックスA]="",Like "*",[Forms]![txt出力]![コンボボックスA])

Like IIf(IsNull([Forms]![txt出力]![コンボボックスA]),"*",[Forms]![txt出力]![コンボボックスA])

試してないから失敗したら、ごめんなさい。

3
hiroton 2022/06/02 (木) 14:48:54 b3eaf@f966d

よくある手法
【Access】複数テキストボックスが空の場合は無視して値がある時だけ抽出できるクエリってできないの?(PCTipsさん)

汎用性の高い手法
MS-Access97超入門>絞込みの仕組みを作る(魔法使いの開発工房さん)

VBAで動的にクエリを作るとか、フォームのデータを直接テキストファイルとして吐き出す(VBA)とかもありますね

そもそもクエリの抽出条件を付加したり、外したりといった分岐ができるのでしょうか?

VBAで動的にクエリを作るならできます

2
Kanto 2022/06/02 (木) 14:48:02 e48ae@6eb0c

フォームのフィルターは以下をボタンに埋め込んでいます。

Private Sub 絞込みボタン_Click()

    Dim strFilter As String

    '[材質・メーカー]の条件の指定
    If Nz(Me![コンボボックスA], "") <> "" Then
         strFilter = strFilter & _
                     " AND (CSVエクスポート_クエリ.[材質] Like '" & Replace(Me![コンボボックスA], "'", "''", , , vbBinaryCompare) & "')"

    End If

    '[発注先]の条件の指定
    If Nz(Me![コンボボックスB], "") <> "" Then
         strFilter = strFilter & _
                     " AND (CSVエクスポート_クエリ.[仕入先] Like '" & Replace(Me![コンボボックスB], "'", "''", , , vbBinaryCompare) & "')"

    End If

    '先頭の" AND "を取り除く
    strFilter = Mid(strFilter, 6)

    'フィルター条件がひとつでもあったら
    If strFilter <> Null Or strFilter <> "" Then
        'フィルター条件の設定
        Me.Filter = strFilter
        'フィルターの実行 (もしくは解除)
        Me.FilterOn = (strFilter <> "")

    'フィルター条件がなにもなかったら、レコードを全件非表示にする
    Else
        Me.Filter = "False"
        Me.FilterOn = True
    End If
End Sub

これと同じことを、全く同じフィールドを持つ別のクエリを作り、抽出条件に書こうとしています。その後クエリを実行してtxtファイルにエクスポートしようとしています。
よろしくお願いします。

1

フォームでのフィルタリングはどのようにしているのでしょうか。

レコードソースのクエリに抽出条件を設定している。
あるいは、
フォームのフィルター機能を使っている。

フォームには対象フィールドの異なるコンボボックスが2つあり、コンボボックスAが空白だった場合、フィルター条件から外しています。

これは、どのように実現しているのでしょうか。
それとも、この設定方が分からないということでしょうか。

2
nanana 2022/06/01 (水) 15:58:47 e48ae@6eb0c

ありがとうございます。
申し訳ございません。

原因はフォームモジュールのレコードソースに設定したクエリの作り方でした。
エラーメッセージは【このレコードセットは更新できません】でした。

クエリを修正したらご指摘の内容で解決しました。
お門違いな質問で申し訳ございませんでした。

1

通常は、

Me.番号 = Format(Me.伝票日付, "mmdd")

でOKです。
Formatは ”0501” という文字列を返します。
それを数値型フィールドに代入すれば、自動で数値型に変換されますので。

ということで、下記の情報を提示してください。

エラーメッセージを提示してください。
このコードをどこに記述していますか。(標準モジュール? フォームモジュール?)
コードの一部ではなく、 プロシージャ全体を提示してください。

2
nanana 2022/06/01 (水) 08:58:49 e48ae@6eb0c

ご回答ありがとうございます!
DCount("*","TESTテーブル","ID <=" & [ID] & "and F3='" & [F3] & "' and F4 =#" & [F4] & "#")
でいけました!すごいです!

いつもありがとうございます!

4

「キーボードイベント取得」を「はい」にして

Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
    Select Case KeyCode
    Case vbKeyLeft, vbKeyUp, vbKeyRight, vbKeyDown
        KeyCode = 0
    End Select
End Sub
3
hatena 2022/05/31 (火) 22:29:25 修正 >> 2

KeyCode As Integer なので、KeyCode=Null だとエラーになります。

KeyCode = 0 でなかったことになります。

7

フォームの「キーボードイベント取得」を「はい」に設定。
フォームのキークリック時のイベントプロシージャに下記を記述。

Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
    If (Shift And acShiftMask) > 0 Then
        Select Case KeyCode
        Case vbKeyLeft To vbKeyDown
            KeyCode = 0
        End Select
    End If
End Sub
1
りんご 2022/05/31 (火) 21:13:52 c564b@0e907

上手くいけばいいのですが。
DCount("*","テーブル","ID<=" & [ID] & "and F3='" & [F3] & "' and F4 =#" & [F4] "#")