Access VBA質問箱 IV

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

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


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

【10726】Re:フラグ更新について(更新クエリ?)
質問  MAI  - 08/11/11(火) 21:25 -

引用なし
パスワード
   ▼neptune さん:

>パッと見だけですが、
>>クエリ式'Switch(DLookUp("出荷率","Q_出荷状況","注文NO='" & [注文NO]&
>                                  ↑
>クエリ式'Switch(DLookUp("出荷率","Q_出荷状況","注文NO='" & [注文NO] &
>は大丈夫ですか?

意味がわかりませんが?
注文NOですか?
注文NOは問題ありませんし
結果はだめです。
大丈夫??
なのですかこれで本当に??
・ツリー全体表示

【10725】Re:クエリデータをaddnewでテーブルに入...
発言  neptune  - 08/11/11(火) 12:34 -

引用なし
パスワード
   ▼ver45 さん:
横から失礼


>1行ごとに取得してみようと思ったのですがどうも上手くいかず、教えていただいた通りに列名を記載しましてやったのですが列のデータ型に日付型と数値型がテキスト型以外にも入っているのですがシングルクウォーテーションについてはどのような扱いになるのでしょうか?
シングルクウォーテーションは文字列のみに使用します。

最初から読んでるわけでないのでよく分かりませんが、
データ型はField オブジェクトのType プロパティで取得できます。
・ツリー全体表示

【10724】Re:クエリデータをaddnewでテーブルに入...
質問  ver45  - 08/11/11(火) 10:28 -

引用なし
パスワード
   ▼トキドキ徹 さん:
ありがとうございます。返事遅れて申し訳ありません。

1行ごとに取得してみようと思ったのですがどうも上手くいかず、教えていただいた通りに列名を記載しましてやったのですが列のデータ型に日付型と数値型がテキスト型以外にも入っているのですがシングルクウォーテーションについてはどのような扱いになるのでしょうか?
・ツリー全体表示

【10723】Re:フラグ更新について(更新クエリ?)
発言  neptune  - 08/11/11(火) 9:53 -

引用なし
パスワード
   ▼MAI さん:

パッと見だけですが、
>クエリ式'Switch(DLookUp("出荷率","Q_出荷状況","注文NO='" & [注文NO]&
                                  ↑
クエリ式'Switch(DLookUp("出荷率","Q_出荷状況","注文NO='" & [注文NO] &
は大丈夫ですか?
・ツリー全体表示

【10722】Re:エクセルに値渡ししたい
お礼  ON  - 08/11/11(火) 9:17 -

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

お手数おかけします

>先ずテストで使っているByVal_str2とByRef_str2は検証用としては
>全く不適当です。
>なぜなら、関数内では引数以外modoriが出てこない
>下記の2つの関数と等価です。


>理解できるまで考えないと、見通しのよいプログラムが書きにくいとか、
>この絡みでバグが出た時、大変困りますので、頑張って下さい。

了解です


>Visual Basicプログラミングのヒント
>  --引数の効率的な引き渡し
>に引数について説明しています。サンプルもあります

自宅のOffice2Kでは、上記ヘルプを見つけることが出来ましたが
会社のOffice2003には無いようです

ちょっと時間が掛かるかもしれませんが、ご紹介頂いたURL等参考に勉強してみます

>理解しにくい点があれば、質問してください。わかる範囲なら相談にのります。
お気遣いありがとうございます

解決できない疑問がでた場合は、またQさせて頂きたいと思います

その時には、よろしくお願い致します

とりあえずのお礼でした

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

【10721】Re:フラグ更新について(更新クエリ?)
質問  MAI  - 08/11/10(月) 22:11 -

引用なし
パスワード
   ▼neptune さん:
>▼MAI
>こんばんは
エラーです。

クエリ式'Switch(DLookUp("出荷率","Q_出荷状況","注文NO='" & [注文NO]& "'">=100,3,DLookUp("出荷率","Q_出荷状況",
"注文NO='" & [注文NO] & "'")>1,2,True,1)
WHERE (((T_受注.フラグ)<>9));の構文エラー:演算子がありません。
とでました。

>私の書いた操作で以下のようなSQLが出てきました。
>これで良いんですかね?検証はしてません。
・ツリー全体表示

【10720】Re:エクセルに値渡ししたい
発言  neptune  - 08/11/10(月) 21:52 -

引用なし
パスワード
   ▼ON さん:
すみません。今見たら誤記がありました。
誤:先ずテストで使っているByVal_str2とByRef_str2は検証用としては
正:先ずテストで使っているByVal_strとByRef_strは検証用としては
・ツリー全体表示

【10719】Re:フラグ更新について(更新クエリ?)
発言  neptune  - 08/11/10(月) 21:48 -

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

私の書いた操作で以下のようなSQLが出てきました。
これで良いんですかね?検証はしてません。

UPDATE T_受注
SET T_受注.フラグ =
Switch(DLookUp("出荷率","Q_出荷状況","注文NO='" & [注文NO]& "'">=100,3,DLookUp("出荷率","Q_出荷状況",
"注文NO='" & [注文NO] & "'")>1,2,True,1)
WHERE (((T_受注.フラグ)<>9));

>笑わないで下さい。初心者の悩みです。
頑張れ。
・ツリー全体表示

【10718】Re:フラグ更新について(更新クエリ?)
質問  MAI  - 08/11/10(月) 20:31 -

引用なし
パスワード
   ▼MAIです。

こんばんは
笑わないで下さい。初心者の悩みです。
WHERE (((T_受注.フラグ)<>9));と
UPDATE T_受注
SET T_受注.フラグ =
Switch(DLookUp("出荷率","Q_出荷状況","注文NO='" & [注文NO] & "'")>=100,3,DLookUp("出荷率","Q_出荷状況","注文NO='" & [注文NO] & "'")>1,2,True,1);
の組合せが出来ません。
宜しくお願いします。
・ツリー全体表示

【10717】Re:エクセルに値渡ししたい
回答  neptune  - 08/11/10(月) 18:50 -

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

この辺りは非常に大事ですから落ち着いてゆっくり考えてください。

先ずテストで使っているByVal_str2とByRef_str2は検証用としては
全く不適当です。
なぜなら、関数内では引数以外modoriが出てこない
下記の2つの関数と等価です。
Function ByVal_str2(ByVal idx1 As String, ByVal idx2 As String) As String
  ByVal_str2 = idx1 & idx2
End Function

Function ByRef_str2(ByVal idx1 As String, ByVal idx2 As String) As String
  ByRef_str2 = idx1 & idx2
End Function

次にsut testですが、長くなるので必要部分のみ引用しますが、上に記したように
関数によって、outは変更されません。従って、以下のようになります。

    str1 = "hoge"
    str2 = " fuga"
    out = "123"     '代入A
 
    ' 変数outは渡しているが、Functionで処理されていない。
    '従って、変数outの内容はByVal_strの戻り値には全く関係ない。
    Debug.Print "Test1:" & ByVal_str(str1, str2, out)
    Debug.Print out '追記※1 ←は代入Aで代入したデータが全く変化していない

    '上記と同じ
    Debug.Print "Test2:" & ByRef_str(str1, str2, out)
    Debug.Print out '追記※2 ←は代入Aで代入したデータが全く変化していない
 
    '結果としてはByVal_st、ByRef_strは同じ処理をしている。
    'ByVal、ByRefは関係ない。

で、冷静に考えればこの程度はそんなにややこしくないので、
Helpの
Visual Basicプログラミングのヒント
  --引数の効率的な引き渡し
に引数について説明しています。サンプルもあります。
この辺りを冷静に読んでみてはいかがですか?

それと、「VB 値渡し 参照渡し」でググって見たんですが、沢山解説も
ヒットします。それらもご覧になって下さい。
ht tp://www001.upp.so-net.ne.jp/yoshihiro/gram4.htm
は判りやすそうです。

ちょっと難しくなり、言語もvb.netですが、概念も用語もVBAと同じです。
ht tp://msdn.microsoft.com/ja-jp/library/ddck1z30(VS.80).aspx

理解できるまで考えないと、見通しのよいプログラムが書きにくいとか、
この絡みでバグが出た時、大変困りますので、頑張って下さい。

理解しにくい点があれば、質問してください。わかる範囲なら相談にのります。
・ツリー全体表示

【10716】Re:エクセルに値渡ししたい
発言  ON  - 08/11/10(月) 17:12 -

引用なし
パスワード
   追記です


ご提示頂いたコードで下記 追記※ をしてみました
結果
    ' 変数outは渡しているが、Functionで処理されていない。
    '従って、変数outの内容はByVal_strの戻り値には全く関係ない。

    '結果としてはByVal_st、ByRef_strは同じ処理をしている。
    'ByVal、ByRefは関係ない。
となっているのですが

  Debug.Print "S_ByVal:" & str  'S_ByVal:Val '値渡し(ByVal) 元値
の動作とは異なっている・・・
頭がうにうにの状態です・・・
何かありましたらよろしくお願い致します


追記コード

Sub Test()
' ByValの時は123のようになるよな気がするのですが hoge fuga になってしまいます

    Dim str1 As String
    Dim str2 As String
    Dim out As String
    Dim ret As Long
 
    str1 = "hoge"
    str2 = " fuga"
    out = "123"
  
    ' 変数outは渡しているが、Functionで処理されていない。
    '従って、変数outの内容はByVal_strの戻り値には全く関係ない。
    Debug.Print "Test1:" & ByVal_str(str1, str2, out)
    Debug.Print out '追記※1
 
    '上記と同じ
    Debug.Print "Test2:" & ByRef_str(str1, str2, out)
    Debug.Print out '追記※2
  
    '結果としてはByVal_st、ByRef_strは同じ処理をしている。
    'ByVal、ByRefは関係ない。
  
    '参照渡しの戻り値を使い且つ、関数の戻り値を使う場合はこんな場合
    'もあります。(たまにですが)
    ret = sample(str1, str2, out)
    Debug.Print "sample : sample(str1, str2, out)"
    Debug.Print "結合された文字列 :" & out
    Debug.Print "結合された文字列の文字数 :" & ret & "個"
  
End Sub

'sample:渡された文字列を結合した文字列を返す
'引数 pret:pa、pb を結合したデータを格納する
Function sample(ByVal pa As String, ByVal pb As String, ByRef pret As String) As Long
  On Error GoTo trap
  pret = pa & pb
  sample = Len(pret)
  Exit Function
trap:
  sample = 0
End Function
Function ByVal_str(ByVal idx1 As String, ByVal idx2 As String, ByVal modori As String) As String

  ByVal_str = idx1 & idx2
  Debug.Print "ByVal_str:" & ByVal_str
  Debug.Print "ByVal_str modori:" & modori '追記※3
  
End Function

Function ByRef_str(ByVal idx1 As String, ByVal idx2 As String, ByRef modori As String) As String

  ByRef_str = idx1 & idx2
  Debug.Print "ByRef_str:" & ByRef_str
  Debug.Print "ByRef_str modori:" & modori '追記※4
  
End Function
・ツリー全体表示

【10715】Re:エクセルに値渡ししたい
質問  ON  - 08/11/10(月) 16:11 -

引用なし
パスワード
   解説ありがとうございます

"一番大きな違い" は、文言として理解できます・・・
折角コードをアップ頂いていますが頭が固くて (T_T)

お手数ですが下記が理解できないと前に進めそうもありません
'F_ByValS:6 元値でなく加工値はなぜ??
アドバイス頂けるとうれしいです よろしくお願い致します

Sub ByRef_ByVal()

  Dim str As String
  
  str = "Ref"
  S_ByRef str
  Debug.Print "S_ByRef:" & str  'S_ByRef:123 '参照渡し(ByRef) 加工値
  Debug.Print
  
  str = "Val"
  S_ByVal str
  Debug.Print "S_ByVal:" & str  'S_ByVal:Val '値渡し(ByVal) 元値
  Debug.Print
  
  Debug.Print "F_ByRefS:" & F_ByRef(2) 'F_ByRefS:4 加工値
  Debug.Print
  
  Debug.Print "F_ByValS:" & F_ByVal(2) 'F_ByValS:6 元値でなく加工値はなぜ??
  

End Sub

Sub S_ByRef(ByRef arg1 As String)  '参照渡し(ByRef)
  Debug.Print "S_ByRef_S:" & arg1 'S_ByRef_S:Ref
  arg1 = "123"
  Debug.Print "S_ByRef_E:" & arg1 'S_ByRef_E:123
  Debug.Print
End Sub


Sub S_ByVal(ByVal arg1 As String)  '値渡し(ByVal)
  Debug.Print "S_ByVal_S:" & arg1 'S_ByVal_S:Val
  arg1 = "123"
  Debug.Print "S_ByVal_E:" & arg1 'S_ByVal_E:123
  Debug.Print
End Sub


Function F_ByRef(ByRef arg1 As Integer)  '参照渡し(ByRef)

  F_ByRef = arg1 * 2
  Debug.Print "F_ByRefF:" & F_ByRef 'F_ByRef:4
  Debug.Print

End Function

Function F_ByVal(ByVal arg1 As Integer)  '値渡し(ByVal)

  F_ByVal = arg1 * 3
  Debug.Print "F_ByValF:" & F_ByVal 'F_ByValF:6
  Debug.Print
  
End Function
・ツリー全体表示

【10713】Re:テーブルの同一項目の取得について
回答  飛男  - 08/11/10(月) 15:08 -

引用なし
パスワード
   取り敢えず、回答らしきものを提示します。
ユニオンクエリ:Q_Aで正規化
(このクエリを実行して表示される結果が正しいテーブルの形です。
SELECT 品番
   , 不良コード1
   , 不良数1
  FROM 不良商品
 UNION ALL
SELECT 品番
   , 不良コード2
   , 不良数2
  FROM 不良商品
  :
 UNION ALL
SELECT 品番
   , 不良コード30
   , 不良数30
  FROM 不良商品; 

追加クエリで再生テーブルに追加
INSERT INTO 再生テーブル(品番, 不良コード, 不良数)
SELECT 品番, 不良コード1, 不良数1
  FROM Q_A
 WHERE 不良コード1 IN (再生テーブルに送る不良コードリスト);

廃棄テーブルへの追加クエリも同様に。 
・ツリー全体表示

【10712】Re:テーブルの同一項目の取得について
発言  飛男  - 08/11/10(月) 14:58 -

引用なし
パスワード
   テーブルの構造が悪いです。
31番目の不良コードが出てきたらまたテーブルその他を作り直すつもりですか?
正規化について学んで今の内にテーブルを作り直した方が賢明ですよ。
・ツリー全体表示

【10711】Re:エクセルに値渡ししたい
発言  neptune  - 08/11/10(月) 13:38 -

引用なし
パスワード
   ▼ON さん:
訂正
誤:'sample:渡された文字列を結合した文字列を返す
正:'sample:渡された文字列を結合した文字列の文字数を返す
・ツリー全体表示

【10710】Re:エクセルに値渡ししたい
回答  neptune  - 08/11/10(月) 13:36 -

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

////////////一番大きな違い////////////
値渡し:
渡したいデータをコピーして、コピーしたデータへの参照を渡す。
従って、コピーしたデータを関数などで弄くっても元のデータには影響を及ぼさない

参照渡し:
渡したいデータが格納されているデータへの参照を渡す。
関数などでこのデータ弄くると、元のデータを弄くることになり、
元のデータに影響を及ぼすことになる。
////////////////////////////////////
↑を踏まえた上で下記を読んで下さい。

解説をちょっと書いてみました。
Sub Test()
' ByValの時は123のようになるよな気がするのですが hoge fuga になってしまいます

    Dim str1 As String
    Dim str2 As String
    Dim out As String
    Dim ret As Long
  
    str1 = "hoge"
    str2 = " fuga"
    out = "123"
    
    ' 変数outは渡しているが、Functionで処理されていない。
    '従って、変数outの内容はByVal_strの戻り値には全く関係ない。
    Debug.Print "Test1:" & ByVal_str(str1, str2, out)
  
    '上記と同じ
    Debug.Print "Test2:" & ByRef_str(str1, str2, out)
    
    '結果としてはByVal_st、ByRef_strは同じ処理をしている。
    'ByVal、ByRefは関係ない。
    
    '参照渡しの戻り値を使い且つ、関数の戻り値を使う場合はこんな場合
    'もあります。(たまにですが)
    ret = sample(str1, str2, out)
    Debug.Print "sample : sample(str1, str2, out)"
    Debug.Print "結合された文字列 :" & out
    Debug.Print "結合された文字列の文字数 :" & ret & "個"
    
End Sub

'sample:渡された文字列を結合した文字列を返す
'引数 pret:pa、pb を結合したデータを格納する
Function sample(ByVal pa As String, ByVal pb As String, ByRef pret As String) As Long
  On Error GoTo trap
  pret = pa & pb
  sample = Len(pret)
  Exit Function
trap:
  sample = 0
End Function
Function ByVal_str(ByVal idx1 As String, ByVal idx2 As String, ByVal modori As String) As String

  ByVal_str = idx1 & idx2
  Debug.Print "ByVal_str:" & ByVal_str
End Function

Function ByRef_str(ByVal idx1 As String, ByVal idx2 As String, ByRef modori As String) As String

  ByRef_str = idx1 & idx2
  Debug.Print "ByRef_str:" & ByRef_str
End Function
・ツリー全体表示

【10709】Re:エクセルに値渡ししたい
質問  ON  - 08/11/10(月) 11:14 -

引用なし
パスワード
   遅くなりました

▼neptune さん 検証して頂きありがとうございます

>で、確認しましたが、問題なく動作しました。
>VB6でも上記で検証しましたが、やはり、問題は発生しませんでした。
>なので、何故、エラーが出るかは?です。

>念の為、Bookの破損を切り分ける為、
>新しいBookを作成して、検証をやり直してみてはどうですか?
>この辺りしか思い付きません。

再起動後、同一ブックでエラーは発生しなくなりました
これで、他のアプリケーションに、引数渡しすることが出来るようになりました
ありがとうございました。


今まで、同一アプリケーション内では通常
function関数で処理させ戻り値を利用することばかりでした
ということで、これらは
特に意識することなく参照渡し ByRefで使用していました
今回の件名で、値渡ししたいということで、この辺がわからないまま
ためしていたので??の状態だったようです


>ググッたり、試したりしているうちに、大変遅くなってしまいました
について理解のないままではまずいと振り返ってみました

通常は
  Function new_str(n_str1 As String, n_str2 As String) As String
    
    new_str = n_str1 & str2
    
  End Function

  Sub get_str()
  
    Dim str1 As String
    Dim str2 As String
    
    str1 = "hoge"
    str2 = " fuga"
    
    Debug.Print new_str(str1, str2)
    
  End Sub
のような利用の仕方しています

今回の
>なぜだか、うまく動かせずに
は、下記のような場合で、下記、変に加工するとすぐエラーになってしまい
うまく修正することは出来ないのですが

ByValの時は123のようになるよな気がするのですが hoge fuga になってしまいます

基本がわかっていないので、コード自体が変かもしれませんが
アドバイス頂けるとうれしいですよろしくお願い致します

  Sub Test()
  
    Dim str1 As String
    Dim str2 As String
    Dim out As String
    
    str1 = "hoge"
    str2 = " fuga"
    out = "123"
        
    'Call ByVal_str(str1, str2, out)
    Debug.Print "Test1:" & ByVal_str(str1, str2, out)
    
    'Call ByRef_str(str1, str2, out)
    Debug.Print "Test2:" & ByRef_str(str1, str2, out)


  End Sub

  Function ByVal_str(ByVal idx1 As String, ByVal idx2 As String, ByVal modori As String) As String
    
    ByVal_str = idx1 & idx2
    Debug.Print "ByVal_str:" & ByVal_str
    
  End Function
  
  
  Function ByRef_str(ByVal idx1 As String, ByVal idx2 As String, ByRef modori As String) As String
    
    ByRef_str = idx1 & idx2
    Debug.Print "ByRef_str:" & ByRef_str
    
  End Function


ByVal_str:hoge fuga
Test1:hoge fuga
ByRef_str:hoge fuga
Test2:hoge fuga

  
・ツリー全体表示

【10708】Re:ありがとうございます
発言  飛男  - 08/11/9(日) 23:36 -

引用なし
パスワード
   >以最後の%と"の空白を開けたところ改善しました。
それは必要ないですね。
>スペル間違いよりこーゆー間違いは見つけずらいですね。
そうですか?
生成されたstrSQLをDebug.?すればすぐ見つかりますよ。
私はスペル間違いの方が見つけづらいです。
・ツリー全体表示

【10707】テーブルの同一項目の取得について
質問  ゆみちゃん E-MAIL  - 08/11/9(日) 17:02 -

引用なし
パスワード
   ACCESS2003 ADOでのテーブルの同一項目の取得についてお尋ねします。
不良商品テーブルの内容は下記のようになっています。
品番
不良コード1

不良コード30
不良数1

不良数30
不良コードの内容により再生テーブルに不良コードと不良数
不良コードの内容により廃棄テーブルに不良コードと不良数
をそれぞれ書き出しています。
if文で不良コードの内容を確認して再生テーブルと不良コードに30回のif文を使用して書き出していますが、もっと簡潔にできる方法はありませんでしょうか。
例えばfor next 文で不良コードを1つずつ順次確認できればよいのですが。
なにとぞよろしくお願いいたします。
・ツリー全体表示

【10706】ありがとうございます
お礼  まる子  - 08/11/9(日) 10:16 -

引用なし
パスワード
   以前指摘いただいた空白を意識して確認したところ、"とwhereの空白と最後の%と"の空白を開けたところ改善しました。ありがとうございます。
スペル間違いよりこーゆー間違いは見つけずらいですね。
・ツリー全体表示

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