質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.30%
Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

Q&A

解決済

2回答

520閲覧

レコードのアルファベットだけ半角にする

退会済みユーザー

退会済みユーザー

総合スコア0

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

0グッド

0クリップ

投稿2023/10/17 04:30

編集2023/10/18 04:06

実現したいこと

平仮名・片仮名・漢字は全角のまま、アルファベットだけ半角にする

前提

アルファベットは全角表記だとダサい、半角にしたい
1つのセルの中にアルファベットと片仮名と漢字と平仮名が混在している

発生している問題・エラーメッセージ

StrConvだと片仮名も巻き添えで半角になる

該当のソースコード

コードとかは特にない

試したこと

StrConvで変換→先述した通り片仮名も巻き添えを食らう
『Access アルファベットだけ 半角に置換』で検索
『Access アルファベットだけ 半角変換』で検索

補足情報(FW/ツールのバージョンなど)

初心者なので優しく教えて下さい
尚、Replace関数を用いてA→A、a→a、、、という回答は論外とさせて頂きます

広告と受け取られるような質問

この修正依頼した奴、両目ついてる?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

多分、正規表現を使った方が早いです。

VBA

1s = "対象文字列" 2Set re = CreateObject("VBScript.RegExp") 3re.Pattern = "[A-Za-z]" 4re.IgnoreCase = False 5re.Global = True 6For Each Match In re.Execute(s) 7 Mid(s, Match.firstindex + 1, 1) = StrConv(Match.Value, vbNarrow) 8Next Match

追記

グローバル変数?正規表現設定?専門用語が分からず回答がいまいちピンときません。
このコードをどこに配置したらいいんでしょうか?

とのことなので、サンプルです。ちょっと改善しておきました。
正規表現という概念を知らないということなので、コードの意味が分からないと思いますが。

VBA

1Dim re 'これがグローバル変数(VBA用語ではモジュールレベル変数)。モジュール内の全Sub/Functionから使える 2Sub メイン処理() 3 Set re = CreateObject("VBScript.RegExp") 4 re.Pattern = "[A-Za-z]+" 5 re.IgnoreCase = False 6 re.Global = True 7 8 ~~~~~ 9 x = conv(x) 10 ~~~~~ 11End Sub 12Function conv(s as String) as String 13 For Each Match In re.Execute(s) 14 Mid(s, Match.firstindex + 1, Match.Length) = StrConv(Match.Value, vbNarrow) 15 Next Match 16 conv = s 17End Function

追記2

初期化も関数内部で行うように変更。

VBA

1Function conv(s As String) As String 2 Static re As Object 3 If re Is Nothing Then 4 Set re = CreateObject("VBScript.RegExp") 5 re.Pattern = "[A-Za-z]+" 6 re.IgnoreCase = False 7 re.Global = True 8 End If 9 For Each Match In re.Execute(s) 10 Mid(s, Match.firstindex + 1, Match.Length) = StrConv(Match.Value, vbNarrow) 11 Next Match 12 conv = s 13End Function

投稿2023/10/17 07:00

編集2023/10/18 07:09
otn

総合スコア86324

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

otn

2023/10/18 00:40

関数にする場合は、re をグローバル変数にして、正規表現設定は関数の外で。
退会済みユーザー

退会済みユーザー

2023/10/18 04:03

グローバル変数?正規表現設定?専門用語が分からず回答がいまいちピンときません。 このコードをどこに配置したらいいんでしょうか?
退会済みユーザー

退会済みユーザー

2023/10/18 04:43

標準モジュール?というところに追記のコードをコピペしてみましたが何も変わっている感じがしません。
退会済みユーザー

退会済みユーザー

2023/10/18 04:45

標準モジュールに貼ってレポートを開きました
otn

2023/10/18 05:58

> 標準モジュール?というところに追記のコードをコピペしてみましたが何も変わっている感じがしません。 ??? 元々のコードはどこに書いているのでしょうか?
退会済みユーザー

退会済みユーザー

2023/10/18 06:04

元々のコードとは? 質問を投稿した時点ではコードはどこにも記述しておりません。
otn

2023/10/18 06:39

> 尚、Replace関数を用いてA→A、a→a、、、という回答は論外とさせて頂きます もし、Replace関数でやるとしたら、そのReplace関数はどこに書くつもりだったのでしょうか?
退会済みユーザー

退会済みユーザー

2023/10/18 06:53

レポートのレコードソースにするクエリのフィールドを更新クエリで書く予定でした!
otn

2023/10/18 07:07

そういうケースだと、モジュールレベル変数じゃなくてPublic変数ですね。 ちょっと初期化をどこでやった来意か分からないので、中に持つか。追記しておきます。
退会済みユーザー

退会済みユーザー

2023/10/18 07:16

度々すみませんが、初期化とはなんでしょうか? また、その初期化を行う理由はなんでしょうか?
otn

2023/10/18 08:32

単語にとらわれずにコードの意味を意味を考えましょう。 関数を何度も呼び出す訳ですが、毎回変数reの設定処理をするのは無駄なので、 関数が呼ばれた初回だけ変数reを設定して、2回目以降の呼び出しではreは設定済みなので設定をスキップします。
otn

2023/10/18 09:13

今回の文脈での「初期化」とは、変数への初回の代入の事です。 もちろん一般的な日本語の単語なので文脈で意味が変わりますが。
退会済みユーザー

退会済みユーザー

2023/10/19 00:45

If re Is Nothing Then ここで2回目以降reの設定を行わないようにしているということですね、理解できました。
otn

2023/10/19 02:11

はい。その通りです。 static と書くことで、前回関数呼び出し時の値を保持するので。 static を書かないと毎回関数呼び出す毎に re は Nothing の値です。 CreateObject("VBScript.RegExp") の処理が重そう(CPU使用量的な意味で)なので、毎回はしたくない。
guest

0

ベストアンサー

標準ではそのような関数や機能はないので、ユーザー定義関数を作成するか、変換テーブルを作成してそれを参照して変換するか、になりますね。

ユーザー定義関数なら例えば標準モジュールに下記のような関数を作成して、StrConvの代わりに使えばいいでしょう。

vba

1Function AlZenToHan(S As Variant) As String 2 Dim i As Long 3 Dim p As String 4 AlZenToHan = Nz(S, "") 5 For i = 1 To Len(AlZenToHan) 6 p = Mid(S, i, 1) 7 If p Like "[A-Za-z]" Then 8 Mid(AlZenToHan, i, 1) = StrConv(p, vbNarrow) 9 End If 10 Next 11End Function

投稿2023/10/17 05:21

hatena19

総合スコア34367

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2023/10/17 06:13

VBAあまり扱うのが得意ではないので置換用テーブルを作成してみます。
hatena19

2023/10/17 09:17

VBAは使えるようになっておくと、今後、いろいろ使い出があるので、これを機会に学習されることをお勧めします。 今回に要件なら、回答のコードをコピーして、標準モジュールを新規作成して、そこに貼り付けるだけが使えるようになります。 クエリで使うなら、下記のフィールド欄に下記にように式を設定すればご希望の変換結果になります。 式1: AlZenToHan([フィールド名])
hatena19

2023/10/18 05:13

フォームやレポートで使うなら、テキストボックスのコントロールソースに下記のように設定すればOKです。 =AlZenToHan([フィールド名])
退会済みユーザー

退会済みユーザー

2023/10/19 01:31 編集

レポートのレコードソースに使用するクエリで使いたかったので、式の中に配置しました。 使い方も教え下さりありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.30%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問