Access VBA質問箱 IV

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

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


800 / 2272 ツリー ←次へ | 前へ→

【9987】フィールドのデータの一部を置き換えたいのですが教えてください TAKE 07/11/16(金) 17:23 質問[未読]
【9988】Re:フィールドのデータの一部を置き換えたい... Gin_II 07/11/16(金) 17:32 回答[未読]
【9990】Re:フィールドのデータの一部を置き換えたい... TAKE 07/11/19(月) 9:35 質問[未読]
【9998】Re:フィールドのデータの一部を置き換えたい... 小僧 07/11/21(水) 10:08 回答[未読]
【10024】Re:フィールドのデータの一部を置き換えた... TAKE 07/11/29(木) 9:51 質問[未読]
【10026】Re:フィールドのデータの一部を置き換えた... 小僧 07/11/29(木) 14:12 発言[未読]
【10027】Re:フィールドのデータの一部を置き換えた... VBWASURETA 07/11/29(木) 15:18 発言[未読]
【10029】Re:フィールドのデータの一部を置き換えた... TAKE 07/11/29(木) 18:04 質問[未読]
【10030】Re:フィールドのデータの一部を置き換えた... VBWASURETA 07/11/29(木) 19:23 発言[未読]
【10033】Re:フィールドのデータの一部を置き換えた... 小僧 07/11/30(金) 9:34 発言[未読]
【10034】Re:フィールドのデータの一部を置き換えた... VBWASURETA 07/11/30(金) 9:46 発言[未読]
【10035】Re:フィールドのデータの一部を置き換えた... 小僧 07/11/30(金) 9:57 発言[未読]
【10036】Re:フィールドのデータの一部を置き換えた... VBWASURETA 07/11/30(金) 10:31 発言[未読]
【10037】Re:フィールドのデータの一部を置き換えた... TAKE 07/11/30(金) 10:47 質問[未読]
【10038】Re:フィールドのデータの一部を置き換えた... VBWASURETA 07/11/30(金) 11:24 回答[未読]
【10039】Re:フィールドのデータの一部を置き換えた... VBWASURETA 07/11/30(金) 11:46 発言[未読]
【10040】Re:フィールドのデータの一部を置き換えた... 小僧 07/11/30(金) 12:02 回答[未読]
【10054】Re:フィールドのデータの一部を置き換えた... TAKE 07/12/4(火) 13:49 お礼[未読]

【9987】フィールドのデータの一部を置き換えたい...
質問  TAKE  - 07/11/16(金) 17:23 -

引用なし
パスワード
   データにX1日本があります。
テーブルには
X1 (株)
X2 (有)
があり
更新して
(株)日本にしたいのです。
よろしくお願いします。

【9988】Re:フィールドのデータの一部を置き換えた...
回答  Gin_II  - 07/11/16(金) 17:32 -

引用なし
パスワード
   ▼TAKE さん:
>データにX1日本があります。
>テーブルには
>X1 (株)
>X2 (有)
>があり
>更新して
>(株)日本にしたいのです。

(1) テーブルのデータシートビューで置換を行う
(2) 更新クエリを作成して実行する

のどちらかで。

【9990】Re:フィールドのデータの一部を置き換えた...
質問  TAKE  - 07/11/19(月) 9:35 -

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

氏名テーブルと変更テーブルがあり
氏名テーブルには
氏名
x1日本
日本x1
東京x2
東京x2日本x1
変更テーブルには
記号  変更後記号
x1    (株)
x2    (有)

更新して
氏名テーブルを
(株)日本
日本(株)
東京(有)
東京(有)日本(株)
にしたいのです。


(1) テーブルのデータシートビューで置換を行う
(2) 更新クエリを作成して実行する
のどちらかで作成可能なのでしょうか?
よろしくお願いします。

【9998】Re:フィールドのデータの一部を置き換えた...
回答  小僧  - 07/11/21(水) 10:08 -

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

>(1) テーブルのデータシートビューで置換を行う

テーブルを開いて

Ctrl + H を押すと置換のダイアログが出ると思います。


>(2) 更新クエリを作成して実行する

更新クエリで行うと複雑になりがちなので
VBAを使って変更したほうが良さそうですね。


>本サイトの基本方針をまとめました。こちら をご一読ください。

の こちら のリンク先をお読みになって下さい。

> してはいけない質問について

の 丸投げに相当しない用に気をつけて下さい。

【10024】Re:フィールドのデータの一部を置き換え...
質問  TAKE  - 07/11/29(木) 9:51 -

引用なし
パスワード
   小僧 さん
こんにちは
すいません。丸投げにしたつもりはないのですが、
私の説明が悪かったのですいますん。

テーブルでの置き換えの考え方はわかりましたが
やはりVBAを使用して作成したいと思います。

その中で文字列に全角と半角が混合している場合半角だけを取り出す方法はあるのでしょうか?

データに
日本(カ東京(yu
ある場合
テーブルに
(カ
(yu
にしたいのです。
よろしくお願いします。
これも丸投げになってしまうのでしょうか?

【10026】Re:フィールドのデータの一部を置き換え...
発言  小僧  - 07/11/29(木) 14:12 -

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

>データに
>日本(カ東京(yu
>ある場合
>テーブルに
>(カ
>(yu
>にしたいのです。


>>変更テーブルには
>>記号  変更後記号
>>x1    (株)
>>x2    (有)

ちょっと仕様が解りづらいのですが、
ただ単に (カ 、(yu が入力されていれば (カ 、(yu にしてしまえば良いのか、
変換テーブルが用意してあって

日本(カ
東京(yu



日本(株)
東京(有)

の様に変換したいのかによって
随分意味合いが変わってくるかと思われます。

もうちょっとやりたい事が具体的にでてくると
回答がつきやすくなるかと思われます。

【10027】Re:フィールドのデータの一部を置き換え...
発言  VBWASURETA  - 07/11/29(木) 15:18 -

引用なし
パスワード
   ▼小僧 さん:
>こんにちは。

見ていて多分ですが、データに「日本(カ」というString型のデータが
あったとして、それを全角文字の「日本」を取り除いた「(カ」の
半角データだけにしたいということではないでしょうか?

例えば
置換前:フィールド1「日本(カ」
    フィールド2「東京(yu」

置換後:フィールド1「(カ」
    フィールド2「(yu」


違っていたらすみません。

【10029】Re:フィールドのデータの一部を置き換え...
質問  TAKE  - 07/11/29(木) 18:04 -

引用なし
パスワード
   VBWASURETA さん,小僧 さん:
ありがとうございます。
うまく説明できなくてすいません。

データを変換してAccessのテーブルに置き換えたら
氏名のフィールドに全角と半角が混ざってしまい
氏名は全部全角なので半角の文字を抽出したいのです。
氏名には
日本XLS 一VV朗
東京XA 次郎
に変換されていて
まずはじめに
半角だけのデータだけ取り出し
それに対応する文字をテーブルに追加して
その文字を更新したいのです。
そのためにもまず
文字が半角か全角か判断する方法がありますか?
あればLEN関数とMID関数を使用してどうにかできそうな気がします。
よろしくお願いします。

【10030】Re:フィールドのデータの一部を置き換え...
発言  VBWASURETA  - 07/11/29(木) 19:23 -

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

もしかするとその関数があるのかもしれませんが、
以前そのような場合は一文字ずつ見る関数を定義して抽出しました。
ただ、膨大なレコードがあるとかなりの遅さになります・・・。

例:
○モジュール
Function StrMojiChk(strwk as String) as String
 Dim Setstr As String '戻り値となる変数
 Setstr = ""
 'ここから一文字ずつ見る処理
 'バイトで見る場合はLenB(StrConv(取り出した1文字, vbFromUnicode))です
 StrMojiChk = Setstr
End Function

○クエリー
Select StrMojiChk(Field1) From Testテーブル


ような感じです。参考までに。

【10033】Re:フィールドのデータの一部を置き換え...
発言  小僧  - 07/11/30(金) 9:34 -

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

まだ仕様がはっきりとしないのですが、

>日本XLS 一VV朗
>東京XA 次郎


半角だけを抜き出す関数というのはありませんので、
VBWASURETA さんの仰るとおり、1文字ずつチェックする
ユーザ定義関数を作成する事になるかと思われますが、

XLSVV
XA

でなく、

XLS
VV
XA

という結果が必要になるのではないでしょうか。
それでしたら

ユーザ定義関数を使ってクエリで抽出

という考え方でなく

ワークテーブル(作業用の一時的に使うテーブル)を作って
そちらに追加していった方が良さそうな気がします。

【10034】Re:フィールドのデータの一部を置き換え...
発言  VBWASURETA  - 07/11/30(金) 9:46 -

引用なし
パスワード
   ▼TAKE さん、小僧 さん:
こんにちは。

確かにわかりづらいところはありますね^^;


>XLSVV
>XA
>
>でなく、
>
>XLS
>VV
>XA

もしかするとこいうことでしょうか?

例:
<元>
フィールド1:XLSテスト

<変換後>
フィールド1:XLS
フィールド2:テスト


フィールド1には半角のみ、フィールド2には全角文字のみで、
フィールド1にある文字列を分割して、二つのフィールドに
別けるような感じでしょうか?

自分だと関数関係に弱いので定義して別けてしまいます・・・

【10035】Re:フィールドのデータの一部を置き換え...
発言  小僧  - 07/11/30(金) 9:57 -

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

>例:
><元>
>フィールド1:XLSテスト

1フィールドに連続した半角文字が1回だけ出現した場合ですと
そのような感じで良いのですが、

>> 氏名には
>>日本XLS 一VV朗

この様に2回以上の連続した半角文字が出現した場合に
どうやって処理するのか、ですね。


その後やりたい事として、

>>> 変更テーブルには
>>> 記号  変更後記号
>>> x1    (株)
>>> x2    (有)

の様な半角文字から全角文字への変換テーブル…という事が挙げられていましたので

>>日本XLS 一VV朗

の結果が

XLSVV



XLS,VV (,以外でもなんか適当な区切り文字)

であるとその後の処理がまた面倒になるかなと…。

【10036】Re:フィールドのデータの一部を置き換え...
発言  VBWASURETA  - 07/11/30(金) 10:31 -

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

あー、複数回半角文字が全角文字と混在で含まれた場合の結果ですか。

そうなってくると簡単に解消してしまおうと関数定義にして入れてしまいそうです。


因みに

>○モジュール
>Function StrMojiChk(strwk as String) as String

この関数の戻り値としてString型にしている訳ですが、
1文字だけを抜き出してチェックするだけの意味だけではなく
この場合、半角だけを結合した結果や全角文字だけを結合した結果の
文字列を返す等の意味で、やり方次第ということで間を省いています。
そこまで書いてしまうと理解しないまま解決となりかねませんから。
あ、関数名も悪いようです^^;

Function Fnc_1ByteStrOnlyGet(strwk as String) as String



Function Fnc_2ByteStrOnlyGet(strwk as String) as String

等でも良いです。


>○クエリー
>Select StrMojiChk(Field1) From Testテーブル

ですが、例としてSelectにしただけでして、Insert、Create等でも良いです。

【10037】Re:フィールドのデータの一部を置き換え...
質問  TAKE  - 07/11/30(金) 10:47 -

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

小僧さんの記述のように
データが"日本XLS 一VV朗"の場合

xls
vv
データを追加していきテーブルを作成していきたいです。
Lenで文字数を算出しその文字数だけLoopして
MIDで一文字ずつ半角を&で追加して全角がきたらテーブルに出力したいのです。他にいい方法があればいいのですが・・・
半角の区別がわかりません
よろしくお願いします

【10038】Re:フィールドのデータの一部を置き換え...
回答  VBWASURETA  - 07/11/30(金) 11:24 -

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

見づらくてすみません。以下の部分がそうだったのですが・・・
>'バイトで見る場合はLenB(StrConv(取り出した1文字, vbFromUnicode))です


例:
int strlength as Integer

'この場合"あ"は全角なので戻り値は2を返します。
strlength = LenB(StrConv("あ", vbFromUnicode))

'この場合"ア"は半角なので戻り値は1を返します。
strlength = LenB(StrConv("ア", vbFromUnicode))


この処理は文字列をUnicodeからシステムの既定のコード ページに変換し
文字列をバイト単位でサイズを取得します。
後は何とかなりますでしょうか?

【10039】Re:フィールドのデータの一部を置き換え...
発言  VBWASURETA  - 07/11/30(金) 11:46 -

引用なし
パスワード
   すみません訂正です、、。

>例:
>int strlength as Integer

strlength as Integer

です^^;

【10040】Re:フィールドのデータの一部を置き換え...
回答  小僧  - 07/11/30(金) 12:02 -

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

まずワーク用のテーブルとして W_Temp1 を用意します。

Create Table W_Temp1(F1 Varchar(50) CONSTRAINT PKEY PRIMARY KEY)


後は下記を標準モジュールにでも書いて実行させてみて下さい。

Sub 半角だけ取り出す()
'要参照 Microsoft DAO x.x Object Library
Const T_Name = "テーブル名"
Const F_Name = "フィールド名"

Dim strSQL As String
Dim RS As DAO.Recordset

  strSQL = "DELETE FROM W_Temp1"
  CurrentDb.Execute strSQL, dbFailOnError

  Set RS = CurrentDb.OpenRecordset(T_Name, dbOpenSnapshot)
    Do Until RS.EOF
      If Len(RS(F_Name)) * 2 <> _
       LenB(StrConv(RS(F_Name), vbFromUnicode)) Then
        Call widthcheck(RS(F_Name))
      End If
    RS.MoveNext
  Loop
  RS.Close: Set RS = Nothing
  
  MsgBox "終了"

End Sub


Function widthcheck(strData As String)
Dim i As Long
Dim strWord As String
Dim FLG As Long

  For i = 1 To Len(strData)
    If LenB(StrConv(Mid(strData, i, 1), vbFromUnicode)) = 1 Then
      strWord = strWord & Mid(strData, i, 1)
    Else
      If strWord <> "" Then
        FLG = True
      End If
    End If
    
    If FLG Or i = Len(strData) Then
      CurrentDb.Execute "INSERT INTO W_Temp1(F1)" _
                & "VALUES('" & strWord & "');"
      strWord = ""
      FLG = False
    End If
  Next i

End Function


> Lenで文字数を算出しその文字数だけLoopして
> Midで一文字ずつ半角を&で追加して
> 全角がきたらテーブルに出力したいのです。

もう1点、全角がこなくても文字列が終了の場合は
テーブルへの追加条件になりますよね。


また既にテーブルへ登録されているかのチェック時間を省く為、
重複不可のインデックス(上記例では主キー)を張って
Execute メソッドでSQL を発行させています。

ご参考になれば幸いです。

【10054】Re:フィールドのデータの一部を置き換え...
お礼  TAKE  - 07/12/4(火) 13:49 -

引用なし
パスワード
   小僧 さん、VBWASURETA さん
本当にありがとうございます。
皆さんの協力でうまくいきました。
また何かありましたら質問させていただきます。
いろいろ説明がうまくいかないにもかかわらず、
親切丁寧に教えていただきありがとうございました。

800 / 2272 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
1078200
(SS)C-BOARD v3.8 is Free