右から4文字を選択し、条件によって3文字にする方法についての質問

このQ&Aのポイント
  • 質問者はExcelで特定の条件に基づいて文字を選択し、その文字の存在によって処理を変えたいと考えています。
  • 現在、質問者は右から4文字を選択し、その文字がXであるかどうかを確認しています。
  • しかし、文字の存在に関係なく全ての文字を4文字減らしてしまっています。質問者は、条件に応じて3文字に減らす方法はあるのか疑問に思っています。
回答を見る
  • ベストアンサー

条件について

お世話になっております。 他の方の回答を参考に自分なりにアレンジしてみたのですが、 上手く行きません。アドバイスをお願い致します。 ' 右から4文字を選択 st = Right$(r.Value, 4) ' X以外だった場合 If StrConv(st, vbNarrow) Like "[1-9]" Or st = "[A-W]" Or st = "[Y-Z]" Then ' チョイスする値を右から3文字にする st = Right$(r.Value, 3) End If ' 文字から引く r.Value = Left$(r.Value, Len(r.Value) - Len(st)) 右から四番目にXが存在していたら4文字、 それ以外だったら3文字という風に条件を付けたいのですが Xの存在に関わらず全て4文字引いてしまいます。 やはり最初に4文字を選択しているので3文字に減らすことは 出来ないでしょうか? 宜しくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • AKARI0418
  • ベストアンサー率67% (112/166)
回答No.1

If InStr(1, r.Value, "X", vbBinaryCompare) = 4 Then r.Value = Left$(r.Value, 4) else r.Value = Left$(r.Value, 3) End If これでよいのでは? 後はうまく修正してください。 InStrは文字列を前から検索します、見つかった文字の位置を返してくれます。 InStrRevは後ろから検索し、前から数えて何文字目にあるかを返してくれます。 Right(String,4) は Stringを4文字に編集しているだけです。 したがって、 4文字目を抜き出したいのでしたら、 st = Right$(r.Value, 4) dim work as string 'stにセットしてしまうと、 'r.Value = Left$(r.Value, Len(r.Value) - Len(st)) 'で困ります work = Right$(st, 1) となります。

DEC2010
質問者

お礼

AKARI0418さんへ わかりやすい解説で回答有難うございます! 他にもいろいろ応用できそうで助かります。

関連するQ&A

  • エクセルで、DBCSをSBCSに変換

    セルに書き込まれた文字列に漢字が含まれるかを調べようとした時に、If Len(Range("c" & i).Value) <> LenB(Range("c" & i).Value) Thenとしてみました。 セルに書き込まれた文字列は、事前に、StrConvのvbNarrow処理していたのですが、2バイトの半角文字になったようです。 lenを使わない方法でもいいのですが、文字列に漢字(漢数字、2バイト半角数字を含む)の有無を識別する方法はありますか? 詳しいかた教えて頂けないでしょうか? 別の言い方をすれば、大文字小文字を含む英数字と"-"のみで成り立つ文字列を抽出したいのです。(今書いているVBAでは、"-"が含まれている文字列の抽出を行っているので、結果的に、大文字小文字を含む英数字となります) 宜しくお願いいたします。

  • マクロの追加をお願いしたいですm(_ _)m

    以前こちらで教えていただきましたマクロを使用していまして、要改善点が2つほど見つかりましたので、どなたかご教授いただけないでしょうか? 現在使用しているマクロと改善希望点を以下に記載しますので、宜しくお願いします。 1.カナが含まれるセルに対して反応させたいです。 2.コマンドボタンを使用して、特定のセルに対して、反応させることは出来ますでしょうか? 以下、現使用マクロです。 Private Sub Worksheet_Change(ByVal Target As Range) Application.EnableEvents = False With Target セルの内容 = Replace(.Value, " ", "", 1, -1, vbTextCompare) 'すべて全角文字で 数字を含まない場合 名前 とみなす If Not セルの内容 Like "*#*" And 0 < Len(セルの内容) And _ セルの内容 = StrConv(セルの内容, vbUpperCase Or vbNarrow) And _ セルの内容 = StrConv(セルの内容, vbLowerCase Or vbWide) Then '実際に私が行いたいこと・・「 "さま"を付けて」 敬称 = "さま" .Value = .Value & 敬称 If 30 < .Font.Size Then 'セルのフォントサイズより20下のサイズ .Characters(Start:=Len(.Value) - Len(敬称) + 1, _ Length:=Len(敬称)).Font.Size = .Font.Size - 20 Else 'セルのフォントサイズの70% .Characters(Start:=Len(.Value) - Len(敬称) + 1, _ Length:=Len(敬称)).Font.Size = Int(.Font.Size * 0.7) + 1 End If End If End With Application.EnableEvents = True End Sub 以上、宜しくお願い致します。

  • 教えて頂いたマクに注釈をつけておきたいのですが・・

    度々の質問となり申し訳ございません。 kkkkkmさんにご教示頂いたvbaマクロに、 担当が変わった時のために注釈をつけておきたいのですが、 いろいろ調べたのですが、下記の部分が私の頭ではよくわかりませんでした。 どの様に注釈をつけておけばよいか教えて頂けますでしょうか。 宜しくお願い致します。 「 If Trim(StrConv(Ws1.Cells(i, j).Value, vbNarrow)) = Trim(StrConv(List(1)(k, 1), vbNarrow)) Then mTotal(1) = mTotal(1) + Ws1.Cells(i, j).Offset(0, 2).Value」

  • VBA(Excel)で文字列内の"~"記号だけ半角変換したくない

    VBA(Excel)で、StrConvを用いて、文字列内に存在する記号を全角→半角に変換して、再び文字列内に格納するようにしています。   strValue = StrConv(strValue, vbNarrow) しかし、"~"も"~"に変換されてしまいます。 "~"は半角変換しないようにしたいのですが、何か良い手法はありますでしょうか? どなたかご教授下さいませ。 よろしくお願い致します。

  • 特定範囲のセルの最終文字1文字を削除

    よろしくお願いします。 Sheet1のJ26からJ56の、セルに入れた文字の最終文字1文字を 削除して表示したいのですが、下の構文で、 For Each r In Application.Selectionが黄色くエラー表示されます。 どこをどのように直せばよいのか解りません。 よろしくお願いします。 Private Sub CommandButton1_Click() Dim r As Range r = Worksheets("Sheet1").Range("J26:J56") For Each r In Application.Selection If Len(r.Value) > 0 Then r.Value = Left(r.Value, Len(r.Value) - 1) End If End Sub Next

  • 統合セルのマクロ処理について

    お世話になっております。 現在マクロにて選択した範囲のセルにおいて 半角・全角・単語の書式を統一する処理をおこなっていますが、 統合されたセルが入ってくるととたんに処理に時間がかかってしまいます。 (対象となるシートの書式はさまざまです。) なんとか解消したいのですが、ご教示お願いできませんでしょうか? 以下マクロになります。 すみませんが、なにとぞよろしくお願い致します。 Sub 書式定義Macro() Dim c As Range Dim myStr As String Dim Match As Object, Matches As Object With CreateObject("VBScript.RegExp") .Pattern = "[\uFF61-\uFF9F]+" '---(1) .Global = True For Each c In Selection myStr = c.Value If Len(myStr) > 0 Then Set Matches = .Execute(myStr) 'マッチしたすべての文字列を全角へ置換 For Each Match In Matches myStr = Replace(myStr, Match.Value, _ StrConv(Match.Value, vbWide)) '---(2) Next Match c.Value = myStr End If Next c End With With CreateObject("VBScript.RegExp") .Pattern = "[0-9]+" '---(1) .Global = True For Each c In Selection myStr = c.Value If Len(myStr) > 0 Then Set Matches = .Execute(myStr) 'マッチしたすべての文字列を半角へ置換 For Each Match In Matches myStr = Replace(myStr, Match.Value, _ StrConv(Match.Value, vbNarrow)) '---(2) Next Match c.Value = myStr End If Next c End With With CreateObject("VBScript.RegExp") .Pattern = "[\uFF20-\uFF60]+" '---(1) .Global = True For Each c In Selection myStr = c.Value If Len(myStr) > 0 Then Set Matches = .Execute(myStr) 'マッチしたすべての文字列を半角へ置換 For Each Match In Matches myStr = Replace(myStr, Match.Value, _ StrConv(Match.Value, vbNarrow)) '---(2) Next Match c.Value = myStr End If Next c End With Dim r As Range 'ここの処理が統合セルの処理の際重くなる。 For Each r In Selection.Cells.SpecialCells(xlCellTypeConstants, xlTextValues) r.Value = Replace(r.Value, "デジカメ", "デジタルカメラ") r.Value = Replace(r.Value, "携帯", "携帯電話") r.Value = Replace(r.Value, "仮開通試験", "") r.Value = Replace(r.Value, "入管", "入館") r.Value = Replace(r.Value, "センタ", "センター") r.Value = Replace(r.Value, "オーナ", "オーナー") r.Value = Replace(r.Value, "パートナ", "パートナー") r.Value = Replace(r.Value, "マネージャー", "マネージャ") r.Value = Replace(r.Value, "リーダー", "リーダ") r.Value = Replace(r.Value, "メンバー", "メンバ") r.Value = Replace(r.Value, "サマリー", "サマリ") r.Value = Replace(r.Value, "サーバー", "サーバ") r.Value = Replace(r.Value, "ルーター", "ルータ") r.Value = Replace(r.Value, "ファイアーウォール", "ファイアーウォール") r.Value = Replace(r.Value, "プロキシー", "プロキシ") r.Value = Replace(r.Value, "インタフェース", "インターフェース") r.Value = Replace(r.Value, "マネージメント", "マネジメント") r.Value = Replace(r.Value, "ウィルス", "ウイルス") r.Value = Replace(r.Value, "マスタ", "マスター") Next r '処理結果の一部修正 Dim myCell As Range For Each myCell In Selection '.Cells.SpecialCells(xlCellTypeConstants, xlTextValues) myCell.Value = Replace(myCell.Value, "(", "(") myCell.Value = Replace(myCell.Value, ")", ")") myCell.Value = Replace(myCell.Value, "携帯電話電話", "携帯電話") Next myCell MsgBox (" 処理が完了しました ") end sub 以上です。

  • \はエクセルでは全角?

    半角文字の\はエクセル(VBA)では全角扱いなのでしょうか? 添付のマクロを実行すると結果は"全角だろう"になります。 \はStrConvでvbWideを指定しても全角になりません。 全角の¥はStrConv/vbNarrowで半角になります。 どういう理由でこうなっているのでしょうか? \以外にもこのような文字があるのでしょうか? ご存知の方、教えていただけないでしょうか。 Sub Macro1() ch1 = "\" ch2 = StrConv(ch1, vbWide) If ch1 = ch2 Then Debug.Print "全角だろう" Else Debug.Print "半角だろう" End If End Sub

  • エクセルVBA/ Formatで文字列が数値に化ける?

    いつもお世話様です。 エクセルVBAでFormatを使うと、文字列中にeが一つ入っていると、「指数」とみなされて勝手に数値に化けてしまうようです。 話を簡単にするため、問題のコートを簡易化したコードが下記のtest1です。 入力されるのは常に3文字以内の英数です。 test1のコードは、ab9と入れればAB9、01とか20とか入れると、予定通り001や020を返してくれます。 ところが、なかには1E1や4E3なども入力する必要があり、これを入れると010や4000に化けてしまいます。 現在は、対処するため、下記test2のように、文字列中に"E"があるかどうかで処理を分岐させていますが、ほかに何か良い方法はないでしょうか? Sub test1() Dim x As String, y As String, z As String x = Application.InputBox("CODEを入力してねん。", Type:=2) y = StrConv(StrConv(x, vbUpperCase), vbNarrow) z = Format(y, "000") MsgBox z & " Typeだよ。" End Sub Sub test2() Dim x As String, y As String, z As String x = Application.InputBox("CODEを入力してねん。", Type:=2) y = StrConv(StrConv(x, vbUpperCase), vbNarrow) If InStr(y, "E") > 0 Then z = y Else z = Format(y, "000") End If MsgBox z & " Typeだよ。" End Sub

  • 入力規則について

    [環境] Windows2000 Access2000 ※スレ違いお許し下さい。同様の質問を下記URLで行ってます。 http://oshiete1.goo.ne.jp/kotaeru.php3?q=744564 [問題点] Access2000で入力規則として「ひらがな」全角 「かたかな」全角 「英数字」半角 を自動で行い たいと思い一番簡単な手法を試行錯誤中です。 Dim i As Integer Dim ix As Integer Dim strChk As String Dim strMoji As String Dim strEisu As String Dim txtData As String Dim GetData As String strMoji = "アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲン" strEisu = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" txtData = Trim(Me.テキスト5.Value) For i = 1 To Len(txtData) strChk = Mid$(txtData, i, 1) For ix = 1 To Len(strMoji) If StrComp(StrConv(Mid$(strMoji, ix, 1), vbFromUnicode), _ StrConv(strChk, vbFromUnicode), vbBinaryCompare) = 0 Then _ strChk = StrConv(strChk, 4) If StrComp(StrConv(Mid$(strEisu, ix, 1), vbFromUnicode), _ StrConv(strChk, vbFromUnicode), vbBinaryCompare) = 0 Then _ strChk = StrConv(strChk, 8) Next ix GetData = GetData & strChk Next i Me.テキスト5.Value = GetData ●上記以外の解決方法を考えております。

  • Word, Excel, PowerPointで2バイト文字検索

    お世話になります。 Word, Excel, PowerPointのデータ(ファイル)にある2バイト文字を検索し、順番にハイライト表示(選択状態)にしていく処理をVBAで作りたいと考えています。 当方はC言語やPHPのプログラミングの経験はあるのですが、VBやVBAは初めてでして中々思うように作成が出来ません。 現在はとりあえず試験的に以下のようなプロシージャを作成し、メッセージボックスで表示するところまでは作成出来ています。 Sub check_2byte_stirngs(text As Object)     moji_len = Len(text)     byte_len = LenB(StrConv(text, vbFromUnicode))     If (moji_len <> byte_len) Then       '2バイト文字発見       For i = 1 To Len(text)         one_char = Mid(text, i, 1)         If LenB(StrConv(one_char, vbFromUnicode)) <> Len(one_char) Then           MsgBox one_char         End If       Next     End If End Sub これに以下のような機能を追加したいと思っています。 ・「次へ」を表示するダイアログを付ける(その場で編集可能にしたいのでMsgBoxは使わない) ・見つかった文字の場所までカーソルを移動させて選択状態にする どちらか一方でもお分りの方がいらっしゃいましたら、ご教示願いますでしょうか。 以上、宜しくお願い致します。

専門家に質問してみよう