アレルギー対策、自宅でできる効果的な方法とは?

こんにちは。

Excel2013を使用しています。
カタカナは全角、英数記号は半角で表示を統一したく、ネットで検索したサンプルコードを範囲や条件等を変更して下記コードを作成しました。
(サンプルコードが記載されていたページに簡易な例で全ての場合に対応できていないとの但し書きがありました。)

下記コードを実行すると、記号のうち、括弧、中点については半角表示になりますが、#については全角表示のままです。
Mid(rData, i, 1) Like "#" の Like を = に変更して、Mid(rData, i, 1) = "#" とすると、#についても半角表示になりました。
“全ての場合に対応できていない”に該当するものなのかもしれませんが、Like では希望する結果を得られない理由は何なのか気になり、質問させていただきました。
よろしくお願いします。

--------------------------------------------------
Sub test()
Dim c As Range
Dim i As Integer
Dim rData As Variant, ansData As Variant

For Each c In Range(Cells(3, "D"), Cells(Cells(Rows.Count, "D").End(xlUp).Row, "D"))
ansData = ""
For i = 1 To Len(c.Value)
rData = StrConv(c.Value, vbWide)
If Mid(rData, i, 1) Like "[A-z]" Or Mid(rData, i, 1) Like "[0-9]" _
Or Mid(rData, i, 1) Like "(" Or Mid(rData, i, 1) Like ")" _
Or Mid(rData, i, 1) Like "・" Or Mid(rData, i, 1) Like "#" Then
ansData = ansData & StrConv(Mid(rData, i, 1), vbNarrow)
Else
ansData = ansData & Mid(rData, i, 1)
End If
Next i
c.Value = ansData
Next c
End Sub

このQ&Aに関連する最新のQ&A

A 回答 (4件)

こんにちは。

お邪魔します。

テーマはLike演算子の扱い方、という理解でお応えします。

#以下Excel2010で確認した内容を基にします。

ヘルプを読んだのでしたら話は早いですが、
キャラセットとして"[角括弧]"の内側にマッチングパターンを書けば、
特別な意味を持つ記号=メタ文字【*?!#[-】も
エスケープした普通の文字として扱えます。

 If Mid(rData, i, 1) Like "[A-z]" Or Mid(rData, i, 1) Like "[0-9]" _
 Or Mid(rData, i, 1) Like "(" Or Mid(rData, i, 1) Like ")" _
 Or Mid(rData, i, 1) Like "・" Or Mid(rData, i, 1) Like "#" Then
と書く代わりに、
 If Mid(rData, i, 1) Like "[・#()0-9A-z]" Then
のように済ませるのが、Like演算子本来のマッチングの仕方で、必要十分なパターンです。
Or演算子で複数のマッチング結果を繋いでいるのは、
ビギナー向けの解説のイントロとしてはある意味正しいようにも思えますが
逆にLike演算子に熟れている人から見ると、何か訳があるのかな?と、
穿った目で見られそうな感、というか却って解り難く扱い難い気もします。
パターンがあまりにも長いとか、系統で分けて書くという時には、
Or演算子で繋ぐのもアリ、です。

一般的なパターンの書き方として、
ヘルプにもあるように文字コードの順番さえ頭に入っていれば、
"[角括弧]" の内側に 
連続した部分には区間を表す"-"ハイフンを挟むようにして、
ひたすら文字コード順に列挙していけばいいだけです。

加えて、
StrConv()関数の引数ConversionにvbNarrowを指定した場合は、
半角に変換できない文字はそのままの全角文字を返すという点や、
使われない文字コードは通常考慮する必要がない点を、
合わせて理解しておけば、簡素な(省略した)パターンを書くことが出来ます。

取り敢えず、半角・全角互換の文字種を文字コード順に並べてみます。
Excelシートに貼り付け[データ][区切り文字]を使ってスペース区切りで展開すれば、
そのまま一覧表になります。

全角 コード
‘ U+2018
’ U+2019
” U+201D
  U+3000 x
、 U+3001 x
。 U+3002 x
「 U+300C x
」 U+300D x
ァ U+30A1 x
ア U+30A2 x
ィ U+30A3 x
イ U+30A4 x
ゥ U+30A5 x
ウ U+30A6 x
ェ U+30A7 x
エ U+30A8 x
ォ U+30A9 x
オ U+30AA x
カ U+30AB x
ガ U+30AC x
キ U+30AD x
ギ U+30AE x
ク U+30AF x
グ U+30B0 x
ケ U+30B1 x
ゲ U+30B2 x
コ U+30B3 x
ゴ U+30B4 x
サ U+30B5 x
ザ U+30B6 x
シ U+30B7 x
ジ U+30B8 x
ス U+30B9 x
ズ U+30BA x
セ U+30BB x
ゼ U+30BC x
ソ U+30BD x
ゾ U+30BE x
タ U+30BF x
ダ U+30C0 x
チ U+30C1 x
ヂ U+30C2 x
ッ U+30C3 x
ツ U+30C4 x
ヅ U+30C5 x
テ U+30C6 x
デ U+30C7 x
ト U+30C8 x
ド U+30C9 x
ナ U+30CA x
ニ U+30CB x
ヌ U+30CC x
ネ U+30CD x
ノ U+30CE x
ハ U+30CF x
バ U+30D0 x
パ U+30D1 x
ヒ U+30D2 x
ビ U+30D3 x
ピ U+30D4 x
フ U+30D5 x
ブ U+30D6 x
プ U+30D7 x
ヘ U+30D8 x
ベ U+30D9 x
ペ U+30DA x
ホ U+30DB x
ボ U+30DC x
ポ U+30DD x
マ U+30DE x
ミ U+30DF x
ム U+30E0 x
メ U+30E1 x
モ U+30E2 x
ャ U+30E3 x
ヤ U+30E4 x
ュ U+30E5 x
ユ U+30E6 x
ョ U+30E7 x
ヨ U+30E8 x
ラ U+30E9 x
リ U+30EA x
ル U+30EB x
レ U+30EC x
ロ U+30ED x
ワ U+30EF x
ヲ U+30F2 x
ン U+30F3 x
・ U+30FB
! U+FF01
# U+FF03
$ U+FF04
% U+FF05
& U+FF06
( U+FF08
) U+FF09
* U+FF0A
+ U+FF0B
, U+FF0C
- U+FF0D
. U+FF0E
/ U+FF0F x
0 U+FF10
1 U+FF11
2 U+FF12
3 U+FF13
4 U+FF14
5 U+FF15
6 U+FF16
7 U+FF17
8 U+FF18
9 U+FF19
: U+FF1A
; U+FF1B
< U+FF1C
= U+FF1D
> U+FF1E
? U+FF1F
@ U+FF20
A U+FF21
B U+FF22
C U+FF23
D U+FF24
E U+FF25
F U+FF26
G U+FF27
H U+FF28
I U+FF29
J U+FF2A
K U+FF2B
L U+FF2C
M U+FF2D
N U+FF2E
O U+FF2F
P U+FF30
Q U+FF31
R U+FF32
S U+FF33
T U+FF34
U U+FF35
V U+FF36
W U+FF37
X U+FF38
Y U+FF39
Z U+FF3A
[ U+FF3B
] U+FF3D
^ U+FF3E
_ U+FF3F
a U+FF41
b U+FF42
c U+FF43
d U+FF44
e U+FF45
f U+FF46
g U+FF47
h U+FF48
i U+FF49
j U+FF4A
k U+FF4B
l U+FF4C
m U+FF4D
n U+FF4E
o U+FF4F
p U+FF50
q U+FF51
r U+FF52
s U+FF53
t U+FF54
u U+FF55
v U+FF56
w U+FF57
x U+FF58
y U+FF59
z U+FF5A
{ U+FF5B
| U+FF5C x
} U+FF5D
~ U+FF5E x
¥ U+FFE5

(上から4番目は全角空白)
(\から\ \から¥ のように全→半、半→全と変換を繰り返すと違う文字になるもの、
 StrConv()関数で変換できないもの、は省く)
(教えて!gooのIDでの投稿に際し、すべての文字種が正しく表示できるかは未確認)
(もし怪しいものがあれば、コードを参照してIMEパッド(Unicode)等で確認してください)

こちらで試しに仮定したものですが、
抽出対象から外す(半角に置換しない)文字種
(全角空白、句読点、かぎ括弧【 、。「」】全角カタカナ【ァ-ン】他【/|~】)
について、上の表での3列めに "x"を付けてみました。
この設定でのパターンは
 str Like "[‘-" & ChrW(&H201D) & "・-.0-{}¥]"
のように書くことも出来ます。
本来は "[‘-”・-.0-{}¥]" ですが、
VBEに全角の”をタイプすることが出来ない為、
ChrW()関数を使って代用しています。
例示としては「ただ列挙するだけなんです」と強調する意図です。

また、上の表を見ながら、
"[A-z]"
というパターンを見直すと、実はこれ、全角アルファベットとイコールでないことに気付くと思います。
余分な文字[]^_を拾っちゃいますから、
"[A-Za-z]"
という風に、無駄なく正確に全角アルファベットを指定してみようかな?とか、
コツさえ掴めば、色々な工夫が出来るようになると思います。

"簡易な例"という説明文の意味する、簡易と簡易でないものの違いは
以上の説明で理解できるのではないでしょうか?

尚、
ご提示のコードは英数字と幾つかの記号を 半角に置換するコードです。
カタカナは既に全角で書かれている、のか、
これから書き足す、のか、判りませんが、もしも、
これから半角カナの全角化に取り組むのでしたら、
■半角カナは一文字ずつ全角に置換することは出来ない■と覚えておいて下さい。
濁点・半濁点のカナは全角では一文字ですが、半角では二文字です。

そういった見通しや汎用性を考慮して、
現状の一文字ずつ置換する、というやり方から発展して、
置換対象の塊りを捉えて、塊りごと置換するような課題に挑戦することをお奨めしておきます。
例えば、
"AbcアイウXyzワヲン"
であれば、
"Abc" を "Abc"
"Xyz" を "Xyz"
纏めて置換する、ということです。

最後に、
Like演算子でのマッチングは世間で思われているより有用ですので、
是非この機会に熟れておいて貰えればと思います。
その先に余裕が出来たり不満が出て来たりしたら、
正規表現(VBAではVBScript.RegExpのこと)についても調べて
理解できたものを書いてみるといいと思います。

長、失礼しました。以上です。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

今回の質問の意図するところを全て書いていただいたような回答で大変わかりやすかったです。
Or演算子を使わない書き方も教えていただき、勉強になります。
コードがスッキリまとまっていると、あとで見直したり変更したりする場合もわかりやすくていいです。

英数字といくつかの記号を半角にする前に
rData = StrConv(c.Value, vbWide) で
一旦全てを全角にしているので、質問文に記載したコードはとりあえず完成させることができました。

ご丁寧な回答ありがとうございました。

お礼日時:2014/08/29 16:05

No2です。



半角にしたい記号が増えた場合の事を考えると、一度すべて半角にして、その後カタカナだけ全角に戻した方がよいのではないかと思います。

こちらのページのコードは参考にならないでしょうか
http://hichon.cocolog-nifty.com/blog/2011/09/exc …
    • good
    • 0
この回答へのお礼

再度の回答ありがとうございます。

教えていただいたURLに記載されたコードは私も質問投稿前に目にしました。
質問文に記載している方法とは逆の方法ですが、いろんな方法があるということで、時間が空いたときにでもこの方法でのコードを勉強がてら書いてみようと思っています。

ありがとうございました。

お礼日時:2014/08/29 15:50

「*」、「?」、「#」そのものをLikeしたいときには[]で囲んでください。

#でしたら

Mid(rData, i, 1) Like "[#]" Then

のようにしてください。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

先の回答者様から Like のヘルプに記載があるとのことで、ヘルプを読み、Like を使う場合の方法として[ ]で囲んで試してみたところ、うまくいきました。

ありがとうございました。

お礼日時:2014/08/28 16:24

Likeのヘルプを読めば記載あります。



「#」は、任意の 1 文字の数字 (0-9)を意味します。

つまり、
Mid(rData, i, 1) Like "#"
は0~9の何れかの時、Trueになります。

※Excelの関数では*が任意の文字、?が任意の1文字の2種類しかありませんが、VBAでは、#も存在するわけです。
    • good
    • 0
この回答へのお礼

早速、回答いただきましてありがとうございます。

Like のヘルプ、読みました。
Like はExcelの関数で文字列をアスタリスクで囲んだときと同じという程度にしか考えていなかったので、勉強になりました。

ありがとうございました。

お礼日時:2014/08/28 15:28

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qエクセルで英数のみを半角に変換するマクロ

エクセル2003を使っています
エクセルで英数のみを半角に変換するマクロの作り方を教えてください。
予め複数のセルを選択しておいて、それらに含まれる文字列の英数のみを半角に(カタカナは全角のまま)変換したいのです。
以前他のサイトで同様の機能のユーザー関数の作り方は見つけたのですが、マクロにする方法がわかりません。
よろしくお願いします。

Aベストアンサー

こんにちは。

まず、#3 のコードでバグ修正します。TextCompare ではマズかったです...

    SourceText = Replace$(SourceText, _
               M.Value, _
               StrConv(M.Value, ConvMode), _
               Compare:=vbTextCompare)
     ↓
    SourceText = Replace$(SourceText, _
               M.Value, _
               StrConv(M.Value, ConvMode))

次に...

> 英数、日本語、半角全角・大文字小文字が入り乱れていて、同じ曲でも
> 表記方法がバラバラなため、その表記を統一したいのです。

このような質問の核心部分は最初に提示すべきでしたね...

> それらに含まれる文字列の英数のみを半角に(カタカナは全角のまま)
> 変換したいのです。

目的が提示されると、これは手段の一部でしかなくなってしまいました。
何をしたいのか? を最初に明示しないと不要に補足+再回答を繰り返すこと
になります。

で実現方法ですが...

Sub Sample()
  ' 半角化できるものは全て半角化する+アルファベットは一度大文字へ
  Call RegStrConvRng(Selection, ".*", vbNarrow + vbUpperCase)
  ’半角カナは全て全角へ
  Call RegStrConvRng(Selection, "[\uff66-\uff9f]+", vbWide)
  ' 半角アルファベットの頭のみ大文字へ
  Call RegStrConvRng(Selection, "[A-z']+", vbProperCase)
End Sub

これで次のように変換されます。一応希望どおりですか?

i can’t speak english.
 ↓
I Can't Speak English.

ちなみに、頭のみ大文字は、単語の頭を大文字、それに続く文字を小文字
です。つまり、

this is a pen. → This Is A Pen.

です。これを This is a pen. にしたいというなら、正規表現のパターンの
設定次第で可能ですが、今回のご質問趣旨からはずれますからご自分で
お調べ下さい。

こんにちは。

まず、#3 のコードでバグ修正します。TextCompare ではマズかったです...

    SourceText = Replace$(SourceText, _
               M.Value, _
               StrConv(M.Value, ConvMode), _
               Compare:=vbTextCompare)
     ↓
    SourceText = Replace$(SourceText, _
               M.Value, _
               StrConv(M.Value, ConvMode))

次に...

> 英数、日本語...続きを読む

QVBAで英数字入力チェックしたい。

いつもお世話になります。

いままで、ある項目の入力チェックを数字のみで
行っていたところ【IsNumeric】を英数字で行いたいのですが
いくら調べても見当たりません・・・

知っている方、どうかご指南ください。
よろしくお願いします。

Aベストアンサー

IsAlphaが無いですね。
チェック用に、半角に統一して(StrConv)文字列を作り、
1字づつ、JISコードの65-90、97-122をエラーにするチェックを行い、上記作った文字列はチェック後は使い捨てる。
こういうルーチンを作るより他ないでしょう。
記号なども含めて考える。
ただ記号は十分検討が必要です。制限しすぎると、運用後にダウンとか、大騒ぎになる恐れをこめてます。

Q【Excel】 全角(数字だけ)を半角にしたい

住所の表を整理しているのですが、数字が全角になっているので、半角に変換したいと思い、ASC関数を使ったのですが、カタカナまで半角になってしまいました。
カタカナは全角で、数字だけ半角にしたいのですが。。
数字だけを半角にする方法ってないんでしょうか?

Aベストアンサー

問題は解決済みと思いますが、数字のみ全角→半角にするマクロです。ご参考まで。

Sub MacroR()
Dim idx As Integer, trg As Range
 Set trg = ActiveSheet.Cells.SpecialCells(xlCellTypeConstants, xlTextValues)
 For idx = 0 To 9
  trg.Replace What:=Right(StrConv(str(idx), vbWide), 1), _
   Replacement:=Right(str(idx), 1)
 Next
End Sub

マクロはALT+F11でVBE画面を開き、「VBAProjectエクスプローラのシート名右クリック」→「挿入」→「標準モジュール」で表示される画面にペーストして下さい。実行はALT+F8を押して、マクロ名を選択します。

Qエクセル 全角英文字のみを半角に!

全角英カナを半角にする関数「asc」は知っているのですが、
英文字のみを半角にする方法はありますでしょうか?

※英文字とカタカナが同セル内に存在しているのですが、カタカナは全角のままで、英文字のみを半角にする事を希望しています。

よろしくお願い致します。

Aベストアンサー

ユーザ定義関数を作って利用する方法です。
Alt+F11でVBAの画面を開きます。
「挿入」>「標準モジュール」を選択します。左側の画面にModule1というのができます。
右側の画面に、以下を貼り付けます。

Function ASC_A(str As String) As String
  Dim i As Integer
  For i = 1 To Len(str)
    If Mid(str, i, 1) Like "[a-zA-Z]" Then
      Mid(str, i, 1) = StrConv(Mid(str, i, 1), vbNarrow)
    End If
  Next
  ASC_A = str
End Function

Excelに戻って、任意のセルで =Asc_A(A1) とすると、A1の全角アルファベットだけを半角にします。

QExcel。英数字カタカナ混ぜこぜのセルで、カタカナのみ全角にする方法は?

とっても基本的なことで困ってます。
Excelの1つのセルの中に、英数字カタカナがごちゃ混ぜのデータが入っています。英数字は全角の場合もあれば半角の場合もありです。片仮名もしかり。
そのデータを、英数字のみ半角にし、カタカナは全角に修正したいんです。
間違ってASC関数を使ったら、カタカナまで半角になっちゃった・・・・。
本日午後一のミーティングにそろえなきゃいけない資料なんです!
誰かーーー!
助けてーーーー!!

Aベストアンサー

あー大変。
それでは。まず、お使いになっているPCにはWordが入っていますか?
Wordが入っていると前提して、ご説明します。
まず、ASC関数を使って、英数字カタカタを半角にしてしまいます。その後
カタカナを全角にしたいセルをすべて範囲指定をします。そして、コピー。そして、
ワードに貼り付けてください。(そのとき1行あけて2行目に貼り付けてください。)
そして、1行目にカーソルを置いて「ツール」→「オプション」→[文章校正]タブ
右下の「詳細設定」ボタンをクリック。その後、「カタカナ設定」を「全角に統一」を選んで、「OK」ボタンをクリック。そうすると、オプション(ダイアログボックス)に戻りますので、「再チェック」または「チェック実行」ボタンを押します。(バージョンによって呼び方が違います。左下のボタンです)
そうすると、半角カタカナの部分に、波線がつきます。そして、1行目にカーソルを置いて
再度「ツール」→「文章校正」をクリックし、「修正」ボタンで直して行きます。そして、修正が終わったら、また、範囲指定をして、コピーをして、Excelに貼り付けてください。
関数だとちょっときびしいかも?この後で考えてみます。とりあえず、試してください。あとは、マクロのわかる方にお任せします。

あー大変。
それでは。まず、お使いになっているPCにはWordが入っていますか?
Wordが入っていると前提して、ご説明します。
まず、ASC関数を使って、英数字カタカタを半角にしてしまいます。その後
カタカナを全角にしたいセルをすべて範囲指定をします。そして、コピー。そして、
ワードに貼り付けてください。(そのとき1行あけて2行目に貼り付けてください。)
そして、1行目にカーソルを置いて「ツール」→「オプション」→[文章校正]タブ
右下の「詳細設定」ボタンをクリック。その後、「カタカナ設定...続きを読む

QExel VBA 別ブックから該当データを検索し、必要なデータを取得する方法について

部品表というブックがあります
A列に商品名、B列に商品番号が入力してあります。C列のコードは未入力です。
A列     B列     C列      
商品名  商品番号  コード
モータ  U-1325-L  
ホルダ  R-134256

また、コード一覧表という別のブックには、A列に商品番号と、B列にコードが、何千件も入力されています。

やりたいことは
部品表のC列のコード欄に、コード一覧表ブックから商品番号と一致するコードを貼り付けしたいのです。

部品表は、何百種類もありますので、関数ではなく、マクロで処理を希望します。

自分では、部品表の商品番号をコピーして、コード一覧表で検索し、検索結果の右隣のセル(B列のコード)の値を部品表のC列に貼り付ければよいかと思い、書いてみたんですが…

Sub 別ブックから貼り付ける()
  Dim 検索する As Long
Windows("部品表.xls").Activate
検索する = cells(i,2).Value
Windows("コード一覧表.xls").Activate
ActiveWindow.SmallScroll Down:=-3
Selection.AutoFilter Field:=3, Criteria1:="=検索する", Operator:= xlAnd

と、してみたものの、検索しても、その検索結果の隣のセルのコードをどうやって取得すればいいのかが、わかりませんでした。

基本事項は本で学びましたが、呪文のようなコードはよく理解できません。懸命にネットで検索して、訳して理解する努力をしてはいますが。

どうぞよろしくお願いします。

部品表というブックがあります
A列に商品名、B列に商品番号が入力してあります。C列のコードは未入力です。
A列     B列     C列      
商品名  商品番号  コード
モータ  U-1325-L  
ホルダ  R-134256

また、コード一覧表という別のブックには、A列に商品番号と、B列にコードが、何千件も入力されています。

やりたいことは
部品表のC列のコード欄に、コード一覧表ブックから商品番号と一致するコードを貼り付けしたいのです。

部品表は、何百種類もありますので、関数...続きを読む

Aベストアンサー

こんにちは。
とりあえず実用性も踏まえました。
メインの動作はワークシート関数のVLOOKUPをVBA上で使用していますので理解はしやすいかと思います。
また、質問文から察するに「部品表.xls」と「コード一覧表.xls」の両方を開いて処理されていますが「コード一覧表.xls」はプログラム内で開いて閉じているので実行するときは「コード一覧表.xls」は閉じて置いてください。
Option Explicit
Sub Sample()
 Application.ScreenUpdating = False
 Dim I As Long
 Dim xlBook
 Set xlBook = Workbooks.Open("C:\★★\コード一覧表.xls") '★要変更★
 I = 2
 Do While Range("A" & I).Value <> ""
  ThisWorkbook.Worksheets("Sheet1").Range("C" & I).Value = Application.VLookup(ThisWorkbook.Worksheets("Sheet1").Range("B" & I).Value, xlBook.Worksheets("Sheet1").Range("A2:B65535"), 2, 0)
  I = I + 1
 Loop
 xlBook.Close
 Application.ScreenUpdating = True
 MsgBox ("完了")
End Sub

こんにちは。
とりあえず実用性も踏まえました。
メインの動作はワークシート関数のVLOOKUPをVBA上で使用していますので理解はしやすいかと思います。
また、質問文から察するに「部品表.xls」と「コード一覧表.xls」の両方を開いて処理されていますが「コード一覧表.xls」はプログラム内で開いて閉じているので実行するときは「コード一覧表.xls」は閉じて置いてください。
Option Explicit
Sub Sample()
 Application.ScreenUpdating = False
 Dim I As Long
 Dim xlBook
 Set xlBook = Workbooks....続きを読む

Qエクセルvba カタカナは全角、それ以外は半角に

セルにはカタカナ、数字、漢字、文字がすべて混在しています。
カタカナは全角に、カタカナ以外(数字や記号)は半角に統一しようかと思っています。

一度すべてを半角にし、カタカナだけ全角に戻そうかと考えました。


Sub test()
Dim e As Range
Dim f As Integer
Dim rData As Variant, ansData As Variant
Range("A1:A10").Select
For Each e In Selection
ansData = ""
For f = 1 To Len(e.Value)
rData = StrConv(e.Value, vbNarrow)
If Mid(rData, f, 1) Like "[ア-ン]" Then
ansData = ansData & StrConv(Mid(rData, f, 1), vbWide)
Else
ansData = ansData & Mid(rData, f, 1)
End If
Next f
e.Value = ansData
Next e
End Sub

しかしこれでは、
「ッ」「ァ」など小さい文字や、「ー(長音)」が半角から全角に戻りません。
また、「ズ」など濁音が「ス゛」と2文字になってしまいます。

これらの正しく変換されないものをすべて列挙し、Replaceなどを使って修正するしかないのでしょうか?


実は最初に、すべてを「全角→半角」にするようマクロ作成したのですが、半角にする文字をReplaceですべて列挙しるのは大変だと思い、「半角→全角」にしたらうまくいくかと思ったのですが、それでもうまくいきませんでした・・・

よろしくお願いします。

セルにはカタカナ、数字、漢字、文字がすべて混在しています。
カタカナは全角に、カタカナ以外(数字や記号)は半角に統一しようかと思っています。

一度すべてを半角にし、カタカナだけ全角に戻そうかと考えました。


Sub test()
Dim e As Range
Dim f As Integer
Dim rData As Variant, ansData As Variant
Range("A1:A10").Select
For Each e In Selection
ansData = ""
For f = 1 To Len(e.Value)
rData = StrConv(e.Value, vbNarrow...続きを読む

Aベストアンサー

> また、「ズ」など濁音が「ス゛」と2文字になって
そりゃもちろん・・半角変換後に「一文字ずつ全角に変換」していますから、
濁点や半濁点も「1文字」として全角に変換しちゃいますよね。

じゃぁどうしましょう?ということで、
逆の手順で考えてみると上手くいくかも?

Sub test()
Dim e As Range
Dim f As Integer
Dim rData As Variant, ansData As Variant
    Range("A1:A10").Select
    For Each e In Selection
        ansData = ""
        rData = StrConv(e.Value, vbWide)
        For f = 1 To Len(rData)
            If Asc(Mid(rData, f, 1)) < -32097 Then
                ansData = ansData & StrConv(Mid(rData, f, 1), vbNarrow)
            Else
                ansData = ansData & Mid(rData, f, 1)
            End If
        Next f
        e.Value = ansData
    Next e
End Sub


さぁ、何を逆に考えたでしょう(笑)。


簡単に解説してみると、
・すべて全角に変換
・一文字ずつ取り出しながら
  ・Ascで変換した文字コードが「-32097=“ぁ”」より小さかったら
    ・半角に(出来るものは)変換
  ・それ以外は
    ・そのまま
・文字列長分繰り返し
・セルに戻す

という作業です。


文字コードに関しては以下でご確認ください。
http://charset.7jp.net/jis.html
“日本語”で最初に出てくる文字は「ぁ」で、
そのコードを10進数に変換したのが「-32097」です。
上記ではこの「-32097」より小さい数字は「日本語以外=半角に変換」としています。

ちなみに・・StrConv(Narrow)では「半角にできない記号」は無視されますので、
日本語より先に出てくる「数学記号や矢印」などは考慮しなくて大丈夫と思われます。



参考までにどうぞ。

> また、「ズ」など濁音が「ス゛」と2文字になって
そりゃもちろん・・半角変換後に「一文字ずつ全角に変換」していますから、
濁点や半濁点も「1文字」として全角に変換しちゃいますよね。

じゃぁどうしましょう?ということで、
逆の手順で考えてみると上手くいくかも?

Sub test()
Dim e As Range
Dim f As Integer
Dim rData As Variant, ansData As Variant
    Range("A1:A10").Select
    For Each e In Selection
        ansData = ""
        rData = StrConv(e.Value, vbW...続きを読む

QEXCEL VBA で現在開いているブックのファイル名を取得する方法

EXCEL2003 VBAで業務を簡素化するために、現在開いているブックのファイル名を取得する方法が分かりません。
作業手順をマクロを使って処理していますが、オリジナルのワークブックをファイル名を変えて保存し、以後、このワークブックを読み込んで使用しています。
このときのVBAは、オリジナルのファイル名を使っているため、ファイル名を変更するとエラーになり、以後の業務に使用できません。
常にファイル名を取得出来るVBAをどなたか、教えて下さい。

Aベストアンサー

>現在開いているブックのファイル名
 ちょっと曖昧な表現かなぁという気もいたしますが、VBAが書いてあるブックのブック名は
ThisWorkbook.Name
で、現在 "アクティブにして" 操作対象になっているブックの名前は
ActiveWorkbook.Name
ですね。

 しかし、
>VBAは、オリジナルのファイル名を使っているため、ファイル名を変更するとエラーになり
というような文脈からすると、
ThisWorkbook.Name
の方ですかね。

Q別のシートから値を取得するとき

Worksheets("シート名").Activate
上記のを行ってから別シートの値を取得するのですが、
この処理を行うと指定したシートへ強制的にとんでしまいます。。。

※イメージ
For ~ To ~
  Worksheets("シートA").Activate
  シートAの値取得
       :
  Worksheets("シートB").Activate
  シートBの値取得
Next

このイメージ処理を行うとものすごい勢いで画面がチカチカします。。。
シートを変えずに他のシートから値を取得する方法はないのでしょうか。
教えてください!

Aベストアンサー

Worksheets("シートA").Range("A1")

みたいな感じでできませんか?

Q文字列から英数字のみを抽出する関数

文字列から英数字のみを抽出する関数を教えていただきたいです。

セルの文字列にはひらがな、カタカナ、数字、アルファベット、記号等を含みます。

色々調べてはみたのですが、数字のみを抽出する関数の説明はたくさんありますが、
アルファベットも含むとなると見つかりませんでした。

数字0~9とアルファベット27個の計37個の文字なので、どうにか関数でできると思うのですが。

具体的には下記のようにしたいのです。

●A列
今日iPhone5をauで購入
最新のNEWSを15時~PCで見る 
Moonshotを生み出す「Google X」

●B列にこう表示したいのです。
iPhone5au
NEWS15PC
MoonshotGoogleX


スペースは残ったままでも結構です。

詳しい方、どうかよろしくお願いいたします。

Aベストアンサー

>数字のみを抽出する関数の説明はたくさんありますが

文字列の中に数字が「一塊だけ」ある場合の説明は多分沢山ありますが、(今回のご質問のように)「文字数字文字数字文字数字」と不定数入り混じってる場合の数式は、全く見つからなかったと思いますよ。

たとえば「英数字が最大限3カタマリまで」といった制約を付けて無理矢理関数をくっつける事は出来なくはありませんが、正直不細工ですし、そもそもあんまり現実的じゃありません。



手順:
ALT+F11を押す
現れた画面で挿入メニューから標準モジュールを挿入する
現れたシートに下記をコピー貼り付ける

public function myf(a) as string
 dim i as long
 for i = 1 to len(a)
 if mid(a,i,1) like "[0-9a-zA-Z ]" then
  myf = myf & mid(a,i,1)
 end if
 next i
end function

ファイルメニューから終了してエクセルに戻る

任意のセルに元の言葉を記入し、
=myf(A1)
のように計算する。

>数字のみを抽出する関数の説明はたくさんありますが

文字列の中に数字が「一塊だけ」ある場合の説明は多分沢山ありますが、(今回のご質問のように)「文字数字文字数字文字数字」と不定数入り混じってる場合の数式は、全く見つからなかったと思いますよ。

たとえば「英数字が最大限3カタマリまで」といった制約を付けて無理矢理関数をくっつける事は出来なくはありませんが、正直不細工ですし、そもそもあんまり現実的じゃありません。



手順:
ALT+F11を押す
現れた画面で挿入メニューから標準モ...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報