Excel VBA 質問スレ Part73

レス数が1000を超えています。これ以上書き込みはできません。
1デフォルトの名無しさん (ワッチョイ 4668-xJJl)
垢版 |
2021/09/13(月) 07:29:59.47ID:GNx0xRRz0
!extend:checked:vvvvv:1000:512
!extend:checked:vvvvv:1000:512
↑同じ内容を2行貼り付けるナリ

ExcelのVBAに関する質問スレナリ
コード書き込みや作成依頼もOKナリ

※前スレ
Excel VBA 質問スレ Part70
https://mevius.5ch.net/test/read.cgi/tech/1616072923/
Excel VBA 質問スレ Part71
https://mevius.5ch.net/test/read.cgi/tech/1621914481/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
973デフォルトの名無しさん (ワッチョイ be8e-qezp)
垢版 |
2021/12/19(日) 19:02:03.97ID:oG6IuvVy0
ルビー基地外だぞ
2021/12/19(日) 19:04:40.91ID:9cYlynLW0
>>971
LTrimでググれ
975デフォルトの名無しさん (ワッチョイ dabd-6dU9)
垢版 |
2021/12/19(日) 19:08:52.05ID:pq+sPc2G0
連続レス申し訳ありません

必要な処理はもうちょっと複雑でした
GetOpenFilenameで開いたファイルを
Workbooks.Open(FileN,Format:=3,ReadOnly:=True)
で処理しているのですが
ログファイルの行中に連続して入っているスペースも一つずつカウントして空白列を作ってしまいます

必要な処理は
1) 連続したスペースを一つのデリミタとして区切り
2) 行先頭にスペースが入っていた場合は最初の文字が始まるまで削除もしくは無視する

といったものになると思います
何卒ご助力お願い致します
2021/12/19(日) 19:46:59.93ID:sZ+QwmZV0
>>975
それって固定長じゃないの?
全銀データみたいな奴
固定長なら、文字数数えて、データ区切り使ったほうが早いと思う
977デフォルトの名無しさん (ワッチョイ dabd-6dU9)
垢版 |
2021/12/19(日) 20:17:13.17ID:pq+sPc2G0
皆様ご回答ありがとうございます

>>972
ありがとうございます
正規表現は私にはちょっと敷居が高いようです

>>974
ありがとうございます
LTRIMで一度先頭スペースを抜いた中間ファイルを作るというのは
一つの手順としてあるかと思います

>>976
ありがとうございます
途中でエラーメッセージ行とかが
入るので全ての行が固定長
と言うわけではないのですが
データを処理したい行は固定長に近いです
問題は処理したい行の先頭に0〜3個のスペースが入ることです
2021/12/19(日) 20:33:08.86ID:Ax4UFlXX0
>>975
1行ずつ読み込んで事前処理するのがいいんじゃね
------------------------
行=1
列=1
Open filename for Input as #1
Do until EOF(1)
Line Input #1, str '一行ずつ読み込み
str=Trim(str) '両端の空白除去
arr=Split(str," ") '空白で分割し配列に格納
for i=1 to arr.Ubound(arr) 'セルに書き込み
Cells(行,列+i).Value=arr[i]
next i
行=行+1
Loop
close #1
-----------------------------
2021/12/19(日) 20:40:17.69ID:6V5J9+AZ0
>>968-969
ご回答ありがとうございました
2021/12/19(日) 20:44:00.34ID:F1jZtUeQ0
>>966
Private Sub Worksheet_Change(ByVal Target As Range)

Application.EnableEvents = False
If Not Intersect(Target, Union(Me.Range("A1"), Me.Range("B1"), Me.Range("B2"))) Is Nothing Then

If Me.Range("A1").Value <> "" And Me.Range("B1").Value <> "" And Me.Range("B2").Value <> "" Then

Me.Columns(3).ClearContents
If Me.Columns(3).NumberFormatLocal <> "@" Then Me.Columns(3).NumberFormatLocal = "@"

If IsNumeric(Me.Range("A1").Value) And IsNumeric(Me.Range("B1").Value) And IsNumeric(Me.Range("B2").Value) And Me.Range("B1").Value <= Me.Range("B2").Value Then

Dim OutAry() As String
ReDim OutAry(Me.Range("B1").Value To Me.Range("B2").Value)

Dim RowCnt As Long
For RowCnt = LBound(OutAry) To UBound(OutAry)
OutAry(RowCnt) = Me.Range("A1") & "/" & RowCnt
Next RowCnt

Range(Me.Cells(1, 3), Me.Cells(UBound(OutAry) - LBound(OutAry) + 1, 3)).Value = WorksheetFunction.Transpose(OutAry)

End If

End If

End If
Application.EnableEvents = True

End Sub
981デフォルトの名無しさん (ワッチョイ dabd-6dU9)
垢版 |
2021/12/19(日) 20:57:27.62ID:pq+sPc2G0
>>978
ありがとうございます

私も一行ずつ処理するべきなのかと思い始めました

その際
----------------
arr=Split(str," ") '空白で分割し配列に格納
----------------
だとデータ行中に空白が連続している場合
例えば
a b c d
のような場合でも
A列→a
B列→b
C列→c
D列→d
のように入力可能でしょうか?
2021/12/19(日) 21:13:00.94ID:LtRjW0Zk0
>>980
わかりづらい説明にご親切にありがとうございます
感謝!
今から試したいと思います!
2021/12/19(日) 21:22:20.20ID:o7hmg8oNM
>>981
そんなもんマクロの記録で連続する区切り文字は1文字として扱うオプション使えばいいでしょ
2021/12/19(日) 21:39:11.49ID:EkrjUmtA0
Ruby なら、abc の前後・間に、複数の連続した空白類があっても、分割できる

Ruby で,文字列を空白文字類や「.」などを区切りとして切り出す
https://www.kkaneko.jp/pro/ruby/tokenize.html

str = " a b c "

p str.split( nil )
p str.strip.split( /\s+/ )
p str.strip.split( /[ |\t|\r|\n|\f]+/ )

これらはすべて、["a", "b", "c"] となる

空白類・\s は、[ |\t|\r|\n|\f] の5種類の空白を含む。
strip は、文字列の先頭・末尾から、連続した空白類を除去する
2021/12/19(日) 21:42:45.37ID:tlLDAcl00
今時、rubyとか使ってんじゃねーよ
2021/12/19(日) 21:51:18.70ID:LtRjW0Zk0
>>980
すみません
今試してみました
C列には期間の日が表示され
D列には機関の月日が表示され

仮にB2に文字が入力されたら
C2とD2には文字が表示され
C1とD1には日と月日が表示したいです

私にはなにをどうしたらいいのかまったくわかりませんでした
技術的にむずかしいでしょうか?
ググってみましたが出来そうにないです
2021/12/19(日) 22:12:20.36ID:Ax4UFlXX0
>>981
その場合はtrim, splitの替わりに正規表現使うのがいいかと
dim reg as new regexp
reg.global=true
reg.pattern="(\S+)" '空白以外
set mc=reg.execute(str)
for i to mc.count-1
set m=mc.item(i)
cells(1,i).value=m.value
next i
2021/12/19(日) 23:20:35.00ID:2A/aI1dD0
>>981
これで代入できる
Range("A1:D1") = Split(str, " ")
989デフォルトの名無しさん (ワッチョイ be8e-qezp)
垢版 |
2021/12/19(日) 23:23:16.74ID:oG6IuvVy0
相変わらずRuby基地外に引っ掛かる馬鹿ども
990デフォルトの名無しさん (ワッチョイ dabd-6dU9)
垢版 |
2021/12/19(日) 23:33:22.46ID:pq+sPc2G0
>>983

ありがとうございます
やってみます

>>984
ありがとうございます
さすがにExcelで処理しているファイルをVBA以外で制御するのは無理です

>>987
ありがとうございます
正規表現は敷居が高い(奥深すぎ)ので敬遠していましたが
そのコードを手がかりに解析してみます

a b c d
a b c d
a b c d

のような場合でも
そのコードは使えますでしょうか?
991デフォルトの名無しさん (ワッチョイ dabd-6dU9)
垢版 |
2021/12/19(日) 23:36:15.57ID:pq+sPc2G0
>>988
ありがとうございます

この場合も処理可能でしょうか?
a b c d
a b c d
a b c d
2021/12/19(日) 23:41:22.83ID:kIFouMiR0
ファイルを開いてVBAで処理する系は
VBAのエディタがアップデート放棄しててユニコードに対応しないらしいのでやめた方がいいかも

Regexpでユニコード文字列を置き換える処理をこさえたりすればなんとかなるかもしれないが
993デフォルトの名無しさん (ワッチョイ dabd-6dU9)
垢版 |
2021/12/19(日) 23:51:29.72ID:pq+sPc2G0
>>992
ご注意ありがとうございます
私の場合であれば処理するlogは
ASCIIのみなので問題ないかと思います
2021/12/20(月) 01:25:47.26ID:x5N85HfoM
replace(hoge," "," ")
2021/12/20(月) 01:39:15.08ID:jnlr9GaR0
>>986
ごめん
ちょっと何を言っているのか分からないからもう少し整理してから言葉にして
文字列や日付として破綻しているものでも可なのにその期間を出力せよっていうのはどういう意味?
仕様がちぐはぐで何をしたいのかが分からない

出力列を増やすのはのは対して手間は変わらないから自分でアレンジして
分からないならもっと基礎の部分を勉強するか諦めて関数式書いた方が早いよ
2021/12/20(月) 01:41:34.12ID:jnlr9GaR0
次スレ
Excel VBA 質問スレ Part74
https://mevius.5ch.net/test/read.cgi/tech/1639932059/
2021/12/20(月) 07:39:37.83ID:sc4Jjnxw0
>>996
2021/12/20(月) 10:40:58.57ID:2126b9QK0
>>995
前スレ見たらわかるけどそいつ後出し後出しで
しかも前スレで得た知識も抜きで再質問してる

https://mevius.5ch.net/test/read.cgi/tech/1626565335/782,829

>>996
乙!
2021/12/20(月) 21:13:06.47ID:1VhmJElm0
>>995
すいません
関数を使ってみたいとおもいます
これか自分で勉強しレベルを上げていきたいと思います
あなたのおっしゃるとおりだと思います
今までお教えいただいたことを参考に
勉強していきたいと思います
ここの先生たちには本当に感謝しています
1000デフォルトの名無しさん (スッップ Sd8a-qezp)
垢版 |
2021/12/20(月) 21:21:42.29ID:XrZMAyhid
いつものあいつ
10011001
垢版 |
Over 1000Thread
このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 98日 13時間 51分 43秒
レス数が1000を超えています。これ以上書き込みはできません。
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況