Access VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


189 / 500 ページ ←次へ | 前へ→

【9490】Re:テキストボックスに≪#NAME?≫
回答  Gin_II  - 07/6/1(金) 0:27 -

引用なし
パスワード
   >テキストボックスに日本語を入力したいのですが、
> このコントロールは””に連結されているため、編集できません。
>というメッセージが下のほうに表示され、
>入力ができません。
>プロパティを見てみましたが、
>どこをどう直せば入力できるようになるのかがわかりません。

プロパティの
 名前
 コントロールソース
は、どうなっていますか?
・ツリー全体表示

【9489】テキストボックスに≪#NAME?≫
質問    - 07/5/31(木) 18:08 -

引用なし
パスワード
   テキストボックスについて教えてください。

テキストボックスに日本語を入力したいのですが、
 このコントロールは””に連結されているため、編集できません。
というメッセージが下のほうに表示され、
入力ができません。
プロパティを見てみましたが、
どこをどう直せば入力できるようになるのかがわかりません。

大変単純な質問で申し訳ありませんが、
アドバイスください。
よろしくお願いします。
・ツリー全体表示

【9488】Re:サブフォームのDLOOKUPを動かす方法
お礼  みみ  - 07/5/31(木) 18:05 -

引用なし
パスワード
   遅くなりすみません。
結局、サブフォーム内の記述をそのまま
ボタンを押したときの記述にコピーしました。

難しく考えすぎてました。ありがとうございました
・ツリー全体表示

【9487】Re:オートナンバーの更新
回答  クロ  - 07/5/31(木) 17:49 -

引用なし
パスワード
   どのように実行するのか分かりませんが…例として
コマンドボタン(コマンド1とします)のクリック時のイベントを
[イベントプロシージャ]としてVBエディタを開き

Private Sub コマンド1_Click()
DoCmd.RunSQL "Alter Table テーブル名 Alter Column 初期化したいオートナンバーフィールド名 Counter(1);"
End Sub

でどうでしょう?
・ツリー全体表示

【9486】オートナンバーの更新
質問  照さん  - 07/5/31(木) 16:49 -

引用なし
パスワード
   初心者です。
各レコードにオートナンバーで番号をつけたデータベースを編集したいと思っています。レコードを削除したり、レコードの並び替えを行った後に、オートナンバーで付与されたレコード番号を新たに1番から更新する方法をご教示ください。
・ツリー全体表示

【9485】Re:効率の良い書き方
お礼  探検  - 07/5/31(木) 12:01 -

引用なし
パスワード
   hatenaさんありがとうございます。

クエリで一致するデータを削除して、その後追加するですね。

なるほど。削除という考えが浮かびませんでした。

教えていただいた方法でやってみます。

ありがとうございました。
・ツリー全体表示

【9484】Re:フォームにコントロールが追加できない
回答  hatena  - 07/5/31(木) 11:16 -

引用なし
パスワード
   >すでにたくさんのコントロールがフォーム上にあり、さらにコントロールを追加しようとしても
>「このフォームまたはレポートにさらにコントロールを作成することはできません。以前このフォームまたはレポートの名前を変更してからコントロールをついかすることができます」
>
>とメッセージがでます。

>ファイル名を変えたんですがうまくいきませんでした

ファイル名ではなく、フォームの名前を、
[ファイル]-[名前を付けて保存]で、別の名前を付けて、
保存してください。その後、古いフォームは削除して、
名前を元に戻してください。

それで、だめなら、新規フォームを作成して、
古いフォームからすべてのコントロールを
コピーして貼り付けてください。
その後、フォームのプロパティ(レコードソース等)を
古いフォームと同じになるように設定します。

とりあえず、以上のことを試してみてください。

なお、上記の作業はバックアップを確実にとってから
行ってください。
・ツリー全体表示

【9483】Re:効率の良い書き方
回答  hatena  - 07/5/31(木) 11:09 -

引用なし
パスワード
   レコードセットで回すより、
クエリの方が速いしシンプルでしょう。

まず、
既存蓄積テーブル と テーブル1 をキーフィールドで内部結合して、
既存蓄積テーブル から テーブル1と一致するデータを削除する
削除クエリを作成します。

つぎに、テーブル1 のデータを既存蓄積テーブルに追加する追加クエリ
を作成します。

この2つを順に実行します。

一つめのクエリは、
既存蓄積テーブル と テーブル1 をキーフィールドで内部結合して、
既存蓄積テーブル を テーブル1 のデータで更新する更新クエリ
でもいいですね。

キーフィールドが主キーかインデックス(重複無し)に設定しておけば、
重複するデータははじかれて追加されますので。

クエリは、SQLでコード上に直接記述してもOKです。
・ツリー全体表示

【9482】効率の良い書き方
質問  探検  - 07/5/31(木) 9:09 -

引用なし
パスワード
   おはようございます。
Access2002でプログラムを作成しております。

Excelで作成されたデータをアクセスで取込み、そのデータを保存用テーブルに移し変えるプログラムを作成しています。
保存用テーブルに既に同じ情報がある場合はデータの更新を、同じ情報が無い場合は新規に追加をするようにしているつもりです。

作成してみて、一応思い通りに動くのですが、作り方がヘタなのでプログラムが長々となってしまっています・・・

同じようなパターンのプログラムを後いくつか作るつもりなのですが、もう少し効率の良いプログラムの書き方があったらアドバイスをお願いします。

以下作成したプログラム

Private Sub 給与勤怠取込_Click()

Dim myDB1 As DAO.Database
Dim myRS1 As DAO.Recordset
Dim mySQL1 As String
Dim myDB2 As DAO.Database
Dim myRS2 As DAO.Recordset
Dim mySQL2 As String
Dim R_Flg As Integer


  DoCmd.TransferSpreadsheet acImport, , _
           "テーブル1", "c:\勤怠.xls", True

  R_Flg = 0
  Set myDB1 = CurrentDb
  Set myRS1 = myDB1.OpenRecordset("テーブル1", dbOpenDynaset)
  Set myDB2 = CurrentDb
  Set myRS2 = myDB1.OpenRecordset("既存蓄積テーブル", dbOpenDynaset)
    Do Until myRS1.EOF
      myRS2.MoveFirst
      Do Until myRS2.EOF
        If myRS2!社員コード = myRS1!社員_コード Then
         If myRS2!支給年月 = myRS1!支給年月 Then
         myRS2.Edit
         If IsNull(myRS1!弁当代) Or myRS1!弁当代 = "" Then
          myRS2!控除4 = 0
         Else
          myRS2!控除4 = myRS1!弁当代
         End If
         If IsNull(myRS1!特別手当) Or myRS1!特別手当 = "" Then
          myRS2!手当4 = 0
         Else
          myRS2!手当4 = myRS1!特別手当
         End If
         If IsNull(myRS1!その他_支給額) Or myRS1!その他_支給額 = "" Then
          myRS2!手当9 = 0
         Else
          myRS2!手当9 = myRS1!その他_支給額
         End If
         If IsNull(myRS1!その他_控除額) Or myRS1!その他_控除額 = "" Then
          myRS2!控除5 = 0
         Else
          myRS2!控除5 = myRS1!その他_控除額
         End If
         If IsNull(myRS1!出勤_日数) Or myRS1!出勤_日数 = "" Then
          myRS2!出勤日数 = 0
         Else
          myRS2!出勤日数 = myRS1!出勤_日数
         End If
         If IsNull(myRS1!所定労働_時間) Or myRS1!所定労働_時間 = "" Then
          myRS2!所定内労働通常時間 = 0
         Else
          myRS2!所定内労働通常時間 = myRS1!所定労働_時間
         End If
         If IsNull(myRS1!普通_残業) Or myRS1!普通_残業 = "" Then
          myRS2!普通残業時間数 = 0
         Else
          myRS2!普通残業時間数 = myRS1!普通_残業
         End If
         If IsNull(myRS1!深夜_残業) Or myRS1!深夜_残業 = "" Then
          myRS2!深夜残業時間数 = 0
         Else
          myRS2!深夜残業時間数 = myRS1!深夜_残業
         End If
         If IsNull(myRS1!総労働_時間) Or myRS1!総労働_時間 = "" Then
          myRS2!総労働時間数 = 0
         Else
          myRS2!総労働時間数 = myRS1!総労働_時間
         End If
         If IsNull(myRS1!有給_日数) Or myRS1!有給_日数 = "" Then
          myRS2!有給 = 0
         Else
          myRS2!有給 = myRS1!有給_日数
         End If
         If IsNull(myRS1!欠_勤) Or myRS1!欠_勤 = "" Then
          myRS2!欠勤日数 = 0
         Else
          myRS2!欠勤日数 = myRS1!欠_勤
         End If
         R_Flg = 1
        
         myRS2.Update
         End If
        End If
       If R_Flg = 1 Then
        Exit Do
       End If
       myRS2.MoveNext
      Loop
      If R_Flg = 0 Then
        myRS2.AddNew
         myRS2!役職コード = myRS1!役職コード
         myRS2!所属コード = myRS1!所属コード
         myRS2!社員コード = myRS1!社員_コード
         myRS2!支給年月 = myRS1!支給年月
         myRS2!氏名 = myRS1!氏名
         If IsNull(myRS1!弁当代) Or myRS1!弁当代 = "" Then
          myRS2!控除4 = 0
         Else
          myRS2!控除4 = myRS1!弁当代
         End If
         If IsNull(myRS1!特別手当) Or myRS1!特別手当 = "" Then
          myRS2!手当4 = 0
         Else
          myRS2!手当4 = myRS1!特別手当
         End If
         If IsNull(myRS1!その他_支給額) Or myRS1!その他_支給額 = "" Then
          myRS2!手当9 = 0
         Else
          myRS2!手当9 = myRS1!その他_支給額
         End If
         If IsNull(myRS1!その他_控除額) Or myRS1!その他_控除額 = "" Then
          myRS2!控除5 = 0
         Else
          myRS2!控除5 = myRS1!その他_控除額
         End If
         If IsNull(myRS1!出勤_日数) Or myRS1!出勤_日数 = "" Then
          myRS2!出勤日数 = 0
         Else
          myRS2!出勤日数 = myRS1!出勤_日数
         End If
         If IsNull(myRS1!所定労働_時間) Or myRS1!所定労働_時間 = "" Then
          myRS2!所定内労働通常時間 = 0
         Else
          myRS2!所定内労働通常時間 = myRS1!所定労働_時間
         End If
         If IsNull(myRS1!普通_残業) Or myRS1!普通_残業 = "" Then
          myRS2!普通残業時間数 = 0
         Else
          myRS2!普通残業時間数 = myRS1!普通_残業
         End If
         If IsNull(myRS1!深夜_残業) Or myRS1!深夜_残業 = "" Then
          myRS2!深夜残業時間数 = 0
         Else
          myRS2!深夜残業時間数 = myRS1!深夜_残業
         End If
         If IsNull(myRS1!総労働_時間) Or myRS1!総労働_時間 = "" Then
          myRS2!総労働時間数 = 0
         Else
          myRS2!総労働時間数 = myRS1!総労働_時間
         End If
         If IsNull(myRS1!有給_日数) Or myRS1!有給_日数 = "" Then
          myRS2!有給 = 0
         Else
          myRS2!有給 = myRS1!有給_日数
         End If
         If IsNull(myRS1!欠_勤) Or myRS1!欠_勤 = "" Then
          myRS2!欠勤日数 = 0
         Else
          myRS2!欠勤日数 = myRS1!欠_勤
         End If
         myRS2.Update
       
      End If
      
      R_Flg = 0
      myRS1.MoveNext
    Loop
  Set myRS1 = Nothing
  Set myDB1 = Nothing
  Set myRS2 = Nothing
  Set myDB2 = Nothing

  CurrentDb.Execute "DELETE * FROM テーブル1;"
 
  MsgBox "取込処理終了"
 
End Sub
・ツリー全体表示

【9481】Re:フォームにコントロールが追加できない
お礼  ぬっち  - 07/5/30(水) 13:27 -

引用なし
パスワード
   ▼たん さん
ありがとうございました。
やってみましたがうまくいかなかったのでフォームなどの構造を見直してみます。
・ツリー全体表示

【9480】Re:フォームにコントロールが追加できない
回答  たん  - 07/5/30(水) 11:36 -

引用なし
パスワード
   >すでにたくさんのコントロールがフォーム上にあり、さらにコントロールを追加しようとしても
>「このフォームまたはレポートにさらにコントロールを作成することはできません。以前このフォームまたはレポートの名前を変更してからコントロールをついかすることができます」

1個のフォームが管理出来るコントロールの数は、
754(ヘルプにもあります)ですが、

この値は、実際には、削除されたコントロールの数も含まれますので、
(内部の管理の都合と思われる)

新規mdbにインポートし直す等で、フォーム内で有効なコントロールの数を
整理し直すしかないでしょう。

ただ、上記のメッセージが出る時点で、フォームの構造の見直し及び
フォームに連結しているテーブルの構造の見直しをしないと

根本的な解決にならないでしょう。
・ツリー全体表示

【9479】フォームにコントロールが追加できない
質問  ぬっち  - 07/5/30(水) 10:14 -

引用なし
パスワード
   すでにたくさんのコントロールがフォーム上にあり、さらにコントロールを追加しようとしても
「このフォームまたはレポートにさらにコントロールを作成することはできません。以前このフォームまたはレポートの名前を変更してからコントロールをついかすることができます」

とメッセージがでます。

一応4このコントロールを消して、6こ追加したいんですが、1つも追加できません。
ファイル名を変えたんですがうまくいきませんでした
なにか方法はないでしょうか
よろしくおねがいします。
Access2000です。
・ツリー全体表示

【9478】Re:TransferText がうまく実行できません。
お礼  仲村  - 07/5/30(水) 9:29 -

引用なし
パスワード
   小僧さん、おはようございます。

>
>TransferText の間違えでしょうか。
>
>
>入社日順に並び替えたクエリを
>TransferTextメソッドでテキストファイル変換すると
>恐らく入社日でソートされたファイルができると思われますがいかがでしょうか。

できました。

マクロ作成時のアクション引数の指定欄に「テーブル名」とありましたので、
クエリは指定できないものと勝手に思い込んでいました。

ありがとうございました。
・ツリー全体表示

【9477】Re:SQLの記述
お礼  hiro  - 07/5/30(水) 9:07 -

引用なし
パスワード
   小僧 さん:

返信ありがとうございます。
教えていただいた通り作成し、思った結果になりました。
確かにテーブルを作る段階である程度想定しておかないと
いけませんね。とても参考になりました。
ありがとうございました。
・ツリー全体表示

【9476】Re:TransferText がうまく実行できません。
回答  小僧  - 07/5/30(水) 8:17 -

引用なし
パスワード
   ▼仲村 さん:
こんにちは。

> 題名:TransferText がうまく実行できません。
> b. DoCmd.RunMacro "nyuusyabi_export"

TransferText の間違えでしょうか。


入社日順に並び替えたクエリを
TransferTextメソッドでテキストファイル変換すると
恐らく入社日でソートされたファイルができると思われますがいかがでしょうか。
・ツリー全体表示

【9475】Re:SQLの記述
回答  小僧  - 07/5/30(水) 8:12 -

引用なし
パスワード
   ▼hiro さん、たんさん:
こんにちは。

> 番号  商品名  在庫数 工程1 工程2
> 01  A完成品  50  5   25
> 02  B完成品  10       5


この形をクロス集計クエリを最終形にされたいのであれば、
その基になるクエリはどの様なものが必要かを考えてみましょう。


番号 商品名  xxx   数量
01 A完成品 在庫数  50
01 A完成品 工程1  5
01 A完成品 工程2  25
02 B完成品 在庫数  10
02 B完成品 工程2  5

こんなデータが必要になってくるはずです。

SELECT Left([番号],2) AS 種別,
    テーブル1.商品名,
    IIf(Len([番号])=2,"在庫数","工程" & Right([番号],1)) AS xxx, テーブル1.在庫数 AS 数量
FROM テーブル1;


このクエリをクロス集計し、Q_Temp という名前で保存します。

TRANSFORM Sum(テーブル1.在庫数) AS 数量
SELECT Left([番号],2) AS 種別
FROM テーブル1
GROUP BY Left([番号],2)
PIVOT IIf(Len([番号])=2,"在庫数","工程" & Right([番号],1));


このクエリと基のテーブルを結合します。
SELECT Q_Temp.種別,
    テーブル1.商品名,
    Q_Temp.工程1,
    Q_Temp.工程2,
    Q_Temp.在庫数
FROM Q_Temp
INNER JOIN テーブル1 ON Q_Temp.種別 = テーブル1.番号;


こんな感じで結果を出せますが、あくまでも結果が返るというだけであり
できる事でしたら基のテーブル構造を見直されたほうが良い気がします。


T_商品マスタ
商品コード 商品名
01     A
02     B


T_状態マスタ
状態コード  状態名
00      完成品
01      工程1
02      工程2


T_商品テーブル
ID 商品コード 状態コード 数量
1  01     00      50
2  01     01      10
3  01     02       5
4  02     00      25
5  02     02       5


上記は1例ですが、今までのテーブル構成よりはSQLでの算出をやりやすくなるかと思われます。
興味を持たれましたら「テーブルの正規化」というキーワードを基に
色々Web検索をされてみてはいかがでしょうか。
・ツリー全体表示

【9474】Re:TransferText がうまく実行できません。
質問  仲村  - 07/5/29(火) 18:43 -

引用なし
パスワード
   すみません。
質問内容に抜けがありましたので追記します。

OSはWindowsXP SP2 Access2003
です。

▼仲村 さん:
>ご教授をお願いします。
>やりたい事は
>a. 社員番号が主キーのA_Tblを、入社日順に並び替える。
>  (1)選択クエリを作成して実行しました。
>  (2)確認のためテーブルを開きましたが、見た目は
>   入社日順に並び替えられていました。
>b. DoCmd.RunMacro "nyuusyabi_export" で Txt.Fileへ
>  エキスポートする。
>  (1)確認のため、Txt.Fileを開きましたが社員番号順
>   のままでした。
>※選択クエリとエクスポート定義を何度も確認して繰り返し
> ましたが、結果は同じです。
> a.及び、b. の考え方に誤りがあるのでしょうか?
>
>以上が今の状況です。
>よろしくお願いします。
・ツリー全体表示

【9473】TransferText がうまく実行できません。
質問  仲村  - 07/5/29(火) 18:35 -

引用なし
パスワード
   ご教授をお願いします。
やりたい事は
a. 社員番号が主キーのA_Tblを、入社日順に並び替える。
  (1)選択クエリを作成して実行しました。
  (2)確認のためテーブルを開きましたが、見た目は
   入社日順に並び替えられていました。
b. DoCmd.RunMacro "nyuusyabi_export" で Txt.Fileへ
  エキスポートする。
  (1)確認のため、Txt.Fileを開きましたが社員番号順
   のままでした。
※選択クエリとエクスポート定義を何度も確認して繰り返し
 ましたが、結果は同じです。
 a.及び、b. の考え方に誤りがあるのでしょうか?

以上が今の状況です。
よろしくお願いします。
・ツリー全体表示

【9472】Re:SQLの記述
質問  hiro  - 07/5/29(火) 17:29 -

引用なし
パスワード
   たんさん
返信ありがとうございます。
おしゃる通りですね。

クロス集計クエリで

TRANSFORM Sum(テーブル1.在庫数) AS 在庫数の合計
SELECT Mid([番号],1,2) AS 区分
FROM テーブル1
GROUP BY Mid([番号],1,2)
ORDER BY Mid([番号],1,2)
PIVOT Mid([番号],3,1);

のようにしたら、ほぼ思っている感じになりました。
でも商品名を入れると商品名でグループ化されるので
結局同じ結果になりますね。
出来れば商品名も表示したいのですが、良い方法あれ
ば教えていただければと思います。
・ツリー全体表示

【9471】Re:レポートの設定
お礼  カダワン  - 07/5/29(火) 16:49 -

引用なし
パスワード
   有難う御座いました。
まだそこまで行っていないので、お礼がおくれました。
ACCESS2000ですが最適化後ではなく、突発的にレポート設定が崩れるので
非常に困っています。
ですので、なるべくデフォルトの設定を使用したレポートを使用していますが、
どうしてもデフォルト設定外のレポートをプレビューする前に強制的に設定し
たいと思っています。
VBAでさらっと書く事は出来ないのでしょうか??
とりあえずお教えいただいたサイトをよく熟読してみます。
・ツリー全体表示

189 / 500 ページ ←次へ | 前へ→
ページ:  ┃  記事番号:
1084621
(SS)C-BOARD v3.8 is Free