こんばんは、よろしくお願いします。
csvのデータで数字とかなが下記のようなデータがあります。
※処理前 頭の数字以降は、文字と数字がランダムなデータ。全体の文字数もランダム
900000000000085600000008~0051038901フ(半角)~
20000000000008560000008~0051038902サ~
※処理後
900000000000085600000008~0000510389フ~
20000000000008560000008~0000510389サ~
というようなデータの
半角カナの前の数字2ケタを削除し、10桁前に00を追加するようなマクロをExcelで作成したいのですが、
カナの前の数字の桁数が一定ではないこと、またカナの前の数字の桁数が多いため(40桁以上)
のため指数表記になってしまう。
という、2点で困っています。
データ数が多くなることを考えると、前から1文字ずつ検索し、
判断していくのは、難しいかなと考えております。
Val関数で、取得しようとしたのですが、指数表記で上手く行きませんでした。
どのように、処理すればよろしいでしょうか。
お教え下さい。
No.2ベストアンサー
- 回答日時:
こんばんは!
外していたらごめんなさい。
データはA列の1行目からあるとします。
C列を作業用の列として使っていますので、C列にはデーががないという前提です。
Sub test()
Dim i, k As Long
Dim str, buf As String
Application.ScreenUpdating = False
For i = 1 To Cells(Rows.Count, 1).End(xlUp).Row
For k = 1 To Len(Cells(i, 1))
str = Mid(Cells(i, 1), k, 1)
If str Like "[ア-ン]" Then
buf = Mid(Cells(i, 1), k - 10, 10)
With Cells(i, 3)
.Value = "00" & Mid(buf, 1, 8)
.NumberFormatLocal = "@"
End With
Cells(i, 2) = Replace(Cells(i, 1), buf, Cells(i, 3))
Exit For
End If
buf = ""
Next k
Next i
Application.ScreenUpdating = True
Columns(3).ClearContents
End Sub
こんなかんじではどうでしょうか?
希望通りにならなかったらごめんなさいね。m(_ _)m
No.5
- 回答日時:
No.2・3です!
何度もごめんなさい。
No.3の訂正分で
With Cells(i, 3)
.Value = "00" & Mid(buf, 1, 8)
.NumberFormatLocal = "0000000000"
End With
は無視してください。
仮に 「0012345678」と10桁表示だとしても、見た目だけの表示で、
実際のデータは「12345678」の8桁となってしまいますので、ご希望通りにならないと思います。
後者の
With Cells(i, 3)
.NumberFormatLocal = "@"
.Value = "00" & Mid(buf, 1, 8)
End With
にしてください。
これなら表示形式を文字列にした後に、10桁数値のデータにしていますので、
大丈夫だと思います。
何度も失礼しました。m(_ _)m
No.4
- 回答日時:
'ちょっとだけ処理を簡略化してあります
'
'>半角カナの前の → 数字以外の前の
'ひとつのデータでは、一回のみの処理
'条件が違うのであれば、補足をお願いします。
'A1セルのデータをA2セルに出しています。
Sub test1()
Dim i As Long
Dim aaa As String
Dim sss As String
Dim re As RegExp '(正規表現の抜き出しオブジェクト)
Dim mc As MatchCollection '(マッチしたデータ達を保持する)
Set re = CreateObject("VBScript.RegExp")
re.Global = True
re.Pattern = "[^0-9]+" '数字の0~9以外の集まり
aaa = Range("A1").Value
Set mc = re.Execute(aaa) '数字の0~9以外の集まりを取り出す。
i = mc(0).FirstIndex '数字の0~9以外の集まりの位置
If i > 10 Then
sss = Left$(aaa, i - 10) & "00" 'カナの10桁前に00を追加
sss = sss & Mid$(aaa, i - 9, 8) '次の8桁
Range("A2").Value = sss & Mid$(aaa, i + 1) 'カナ以降
End If
Set re = Nothing
Set mc = Nothing
End Sub
No.3
- 回答日時:
No.2です!
たびたびごめんなさい。
前回のコードで
(ア-ンは半角文字に!)
それから
>With Cells(i, 3)
>.Value = "00" & Mid(buf, 1, 8)
>.NumberFormatLocal = "@"
>End With
の部分を
With Cells(i, 3)
.Value = "00" & Mid(buf, 1, 8)
.NumberFormatLocal = "0000000000"
End With
または
With Cells(i, 3)
.NumberFormatLocal = "@"
.Value = "00" & Mid(buf, 1, 8)
End With
に訂正してください。
そうでないと8桁前の「00」が表示されないと思います。
検証せずに投稿してごめんなさいね。m(__)m
No.1
- 回答日時:
ぶっちゃけ先頭から1文字ずつ検査していった方が,簡単なマクロで確実に結果が得られると思います。
が,そうしたくないという事なので。
#簡単のため1列データとしていますが,実際のデータの姿に併せて適宜修正してください
#処理後の結果をどうしたいのか不明ですが,簡単のためセルに書き出しています。ご質問の本筋とは無関係の部分なので,適宜修正してください。
サンプル:
Sub macro1()
Dim buf As String
Dim res As Long
Dim i As Integer
Dim n As Long
Dim s, p, k
Open "c:\test\test.csv" For Input As #1
Do Until EOF(1)
Input #1, buf
s = buf
’数字を除去
For i = 0 To 9
s = Application.Substitute(s, i, "")
Next i
’半角カタカナを検出
p = 1
Do Until p >= Len(s)
If Mid(s, p, 1) Like "[ヲ-ン]" Then ’半角カタカナ。
k = InStr(1, buf, Mid(s, p, 1))
’置換
buf = Application.Replace(buf, k - 2, 2, "")
buf = Application.Replace(buf, k - 10, 0, "00")
Exit Do
End If
p = p + 1
Loop
n = n + 1
Cells(n, "A") = buf
Loop
Close #1
End Sub
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) エクセルの数式で教えてください。 1 2023/02/02 10:20
- Access(アクセス) Accessのテキストボックスの入力文字制限 1 2023/01/18 20:43
- Visual Basic(VBA) VBA 「,」・空白・カタカナ等の複数条件のマクロ 2 2023/08/23 11:57
- その他(プログラミング・Web制作) COBOL数値転記をCOPY句内での仕様 6 2022/06/15 18:48
- Visual Basic(VBA) エクセルの数式で教えてください。 1 2023/07/31 15:49
- Visual Basic(VBA) VBA B列にある前から10文字のみ表示 3 2023/08/07 11:24
- Excel(エクセル) Excelで校閲をする方法はあるでしょうか(取扱説明書への掲載禁止用語の確認) 3 2022/06/11 22:51
- Excel(エクセル) エクセルのセルの書式設定・ユーザー定義の条件設定について 1 2022/08/17 21:56
- Excel(エクセル) 表示形式、文字列セル(列)に数式を入力するには マクロ 1 2022/09/18 10:53
- Visual Basic(VBA) 特定の文字を簡単な操作で半角スペースに変換するか削除したい 2 2022/11/01 10:35
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
GASでスプレッドシートの一番上...
-
DataGrdViewに関連付けたデータ...
-
【Excel VBA】先頭の「0」飛び...
-
Listviewのデータを上から順番...
-
C# MySQLのデータを個別に取得...
-
GridViewにバインドせずにデー...
-
C# データ配列から画像を作成す...
-
MSFlexGridのデータ表示位置の設定
-
VBSやVBAでXMLファイルを読み込...
-
【ASP.NET MVC】一覧編集画面
-
DBへの重複更新を防ぐ方法について
-
コンパイルエラーSubまたは...
-
ASP C# データベースから1行取得
-
ListViewで条件によって表示を...
-
VBAでページ番号、ページ最終行...
-
ExcelVBAを使って、値...
-
特定のセルが空白だったら、そ...
-
【Excel VBA】指定行以降をクリ...
-
VBAでActiveDirectoryのユーザ...
-
i=cells(Rows.Count, 1)とi=cel...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
【Excel VBA】先頭の「0」飛び...
-
DataGrdViewに関連付けたデータ...
-
Listviewのデータを上から順番...
-
GASでスプレッドシートの一番上...
-
GridViewにバインドせずにデー...
-
VBAでページ番号、ページ最終行...
-
.NET SqlDataReader のレコー...
-
MSFlexGridのデータ表示位置の設定
-
【ASP.NET MVC】一覧編集画面
-
DataGridViewで表示に制限をつ...
-
VBによる可変長ファイルの読み書き
-
エクセルマクロ小数点桁数
-
GoogleスプレッドシートからExc...
-
ListViewで条件によって表示を...
-
ACCESSのVBAで[Split]について
-
C# データ配列から画像を作成す...
-
ASP.Net ObjectDataSource
-
スプレッドシート 一括でQRコー...
-
ASP.NET DataGridの項目数(列...
-
GridViewを自動的にスクロール...
おすすめ情報