プロが教えるわが家の防犯対策術!

ある列の値が、数値化されてしまっていて、先頭の「0」が消えてる状態となっています。
本来4桁なのですが、
800(本来は0800)
10(本来は0010)
7(本来は0007)
となってしまっています。

調べていて以下のソースで、先頭の「0埋め」が出来るようになりました。
For i = 3 To 最終行
With Cells(i, "P")
.NumberFormatLocal = "@"
.Value = Format(.Value, "0000")
End With
Next i

しかし、P~U列の間で同様の処理をしたいのですが、
同じ記述を6回繰り返さないもっとスマートな書き方ありますか?

またK列、L列、O列は離れていて、2桁化"00"の処理が必要ですが、
離れてる場合は、繰り返すしかないでしょうか?

A 回答 (7件)

こんにちは


>良かったら見様見真似で切り貼りした拙いソースを見て頂けませんか?
おっしゃる通り、CSVデータをExcelで開き、範囲をコピペしているものですね。
#5のコードはQueryTableメソッドを介してシートに書き出しています。
CSVは、区切り文字でデータ化したテキストデータなのでテキストデータとして処理を行っています。

Excelのバージョンによりますが、
2013だとデータタグ、データの取得、テキストから だったか、
それ以降だと データタグ、データの取得、従来のウィザード、テキストから(レガシ)で記録されるマクロです。
ウィザードのオプションで判る通り、オプションが多くありますが、デフォルトプロパティは書かなくても大丈夫です。
参考サイト https://www.tipsfound.com/vba/18014

メリットは処理が早く処理を書きやすい(私的意見)
デメリットは同じシートに追加していく場合、うまく追加できない所です。
ただ、うまく追加できないと思っているのは、私だけかもしれません。

CSVデータの抽出方法は色々ありますが、個人的に最も使用しない方法は
Excelで開いて抽出する方法です。

ありがた迷惑な処理や文字化けなど後でデータ加工をしなくては使えないケースが多いからです。
VBAなどでCSVデータを取得する場合、CSVデータの内容で分ける事が多い用に思います。
Line Input、、配列=Split(?,",") これが一番使う事が多いかも
参考 http://officetanaka.net/excel/vba/speed/s15.htm

ちなみにExcel導入時、何もしないとCSV拡張子はExcelに関連づけされますが、私の場合CSV用のエディターに関連付けをして、直接Excelで開く事は多分20年以上していません。

CSVデータについては、昔やたら躓いた記憶があります。
情報サイトも多いので主だった3,4種類を機会があれば試しながら理解されると良いと思います。
    • good
    • 0

OpenTextするときにFieldInfoで項目の型を指定してないの?

    • good
    • 0

こんばんは


P列からUれるに関しては
CSV読み込む時に文字列として抽出するのはどうでしょう。
Sub csv_inData()
Dim Target As String
Dim SH1 As Worksheet
Set SH1 = Worksheets("Sheet1")
Target = Application.GetOpenFilename("csv_File,*.csv")
If Target = "False" Then Exit Sub
Call in_csvQuery(Target, SH1)
'
'
End Sub
Private Sub in_csvQuery(pachFiele_name As String, SH1 As Worksheet)
Dim qt As QueryTable
On Error Resume Next
SH1.Cells.ClearContents
Set qt = SH1.QueryTables.Add(Connection:="TEXT;" & pachFiele_name, Destination:=SH1.Range("A1"))
With qt
.TextFilePlatform = 932
.TextFileParseType = xlDelimited ' 区切り文字の形式
.TextFileColumnDataTypes = Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2) 'P~U 文字列 2
.TextFileCommaDelimiter = True ' カンマ区切り
.RefreshStyle = xlOverwriteCells ' セルに上書き
.Refresh
.Delete
End With
End Sub

V列以降デフォルト 1
    • good
    • 0
この回答へのお礼

ありがとうございます!
読み込むときに属性を決めておけるなら最高です。
ちゃんと動作しました。
----------
良かったら見様見真似で切り貼りした拙いソースを見て頂けませんか?
これは単にCSVファイルをダブルクリックしてExcel上で開いて、
そのセル範囲をコピペしているだけと思うのですが、
Qchan1962さんとの違いを簡単に解説していただけると幸いです。

FName = Application.GetOpenFilename("csv_File,*.csv")
Exit Sub
最終行 = Cells(Rows.Count, 5).End(xlUp).Row
Range("4:" & 最終行).Delete ' 4 ~ 最終行を削除
Set srcBook = Workbooks.Open(FName)
最終行 = Cells(Rows.Count, 2).End(xlUp).Row
Range("A1:R" & 最終行).Select
Selection.Copy
Windows(現在のファイル名).Activate
ActiveWindow.SmallScroll Down:=-9
Range("F2").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False

お礼日時:2021/06/21 15:30

i = 最終行


With Range(Cells(i, "P"), Cells(i , "U"))
.NumberFormatLocal = "@"
.Value = Format(.Value, "0000")
End With

ダメ?
    • good
    • 0
この回答へのお礼

ありがとうございます。
こちらの全ソースを開示してないので仕方ないかもしれませんが、
そのまま使用したら、
「実行時エラー13 型が一致しません」と出ました。
No.3の方が良いかもしれません。

お礼日時:2021/06/20 20:15

P~U列を処理する場合です。


Dim wcols As Variant
Dim wcol As Variant
wcols = Array("P", "Q", "R", "S", "T", "U")
For i = 3 To 最終行
For Each wcol In wcols
With Cells(i, wcol)
.NumberFormatLocal = "@"
.Value = Format(.Value, "0000")
End With
Next
Next i

K列、L列、O列の場合も、同様にしてください。
    • good
    • 0
この回答へのお礼

頂いたソースで成功しました。
連続してなくても良いのが良さそうですね。

他の方法とかも調査してみたいと思います。
ありがとうございました。

お礼日時:2021/06/20 20:16

マクロを記録したらこうなったのでこっちほうがいいかも



Columns("C:C").Select
Selection.NumberFormatLocal = "000#"
    • good
    • 0
この回答へのお礼

ありがとうございます。
見た目は良いですが、CSV保存するとそちらでは桁落ちしてたので駄目でした。

お礼日時:2021/06/20 20:12

該当列の書式を00#にすればだめなのですか


Columns("A").NumberFormatLocal(”000#”)
    • good
    • 0
この回答へのお礼

そのままPで試したら駄目でした。

お礼日時:2021/06/20 20:10

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

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


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