[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『コードを整理して短くしたい』(KonNo)
現在、以下のコードを利用している。
24行目以下が同じFor分の連続処理(4回)なのでコードを整理して短くしたいのですが
良きアドバイスをお願いします。
Option Explicit
Sub セルに入力された文字列を一文字ずつ横方向に分解する()
Dim str As String Dim i As Long, ii As Long
'書き出しセルの初期化 For i = 2 To 8 Step 2 For ii = 2 To 41 Cells(i, ii).Clear Next Next
'指定文字の分割 With Range("A10") str = .Value
For i = 1 To 40 .Offset(-8, i).Value = Mid(str, i, 1) Next i
For i = 41 To 80 .Offset(-6, i - 40).Value = Mid(str, i, 1) Next
For i = 81 To 120 .Offset(-4, i - 80).Value = Mid(str, i, 1) Next
For i = 121 To 160 .Offset(-2, i - 120).Value = Mid(str, i, 1) Next
End With
End Sub
参考画像
< 使用 Excel:Excel2019、使用 OS:Windows10 >
Range("A10")に対する処理をFunctionにしておいて、
24行目以降に対しても、それを使った繰り返し処理にすればよいのでは?
(γ) 2022/02/23(水) 09:43
For i = 1 To 160 Debug.Print i, ((i - 1) \ 40) * 2 - 8, (i - 1) Mod 40 + 1 Next
(とおりすがり) 2022/02/23(水) 09:51
(・・・) 2022/02/23(水) 10:04
参考に Sub Test() Dim i As Long Dim rng As Range, c As Range
Set rng = Union(Cells(2, 2).Resize(, 40), Cells(4, 2).Resize(, 40), Cells(6, 2).Resize(, 40), Cells(8, 2).Resize(, 40)) rng.Clear For Each c In rng i = i + 1 c.Value = Range("A10").Characters(i, 1).Text Next End Sub (ピンク) 2022/02/23(水) 10:20
数学的な問題と言われればその通りですが
中々求めるのに試行錯誤が続いています。
私の方でアドバイスを検討する時間が必要です。
>24行目以降がどうなっているのか説明がありませんから、
安易に、テキストエディターで質問文を作成した時に
テキストエディターが左側に自動で書き出す通し番号をそのまま書いちゃいました。
具体的なFor分の連続処理(4回)とは以下の事です。
For i = 1 To 40 .Offset(-8, i).Value = Mid(str, i, 1) Next i For i = 41 To 80 .Offset(-6, i - 40).Value = Mid(str, i, 1) Next For i = 81 To 120 .Offset(-4, i - 80).Value = Mid(str, i, 1) Next For i = 121 To 160 .Offset(-2, i - 120).Value = Mid(str, i, 1) Next
(KonNo) 2022/02/23(水) 10:39
UNIONで4つに分割された領域を1つの領域のように
扱えるようになるので数学的なアプローチがなくても
順番に文字列を書き出して行くだけなのでスッキリしました。
感謝、感謝です。
(KonNo) 2022/02/23(水) 12:19
>UNIONを使ったコードはとても参考になります。 UNIONを使わなくても
Sub Test() Dim i As Long Dim c As Range
With Range("B2:AO2,B4:AO4,B6:AO6,B8:AO8") .ClearContents For Each c In .Cells i = i + 1 c.Value = Range("A10").Characters(i, 1).Text Next End With End Sub
(ピンク) 2022/02/23(水) 12:43
その原稿用紙状のものは10行目までしかないのですか?
そうであれば、なんとでもなりそうなわけで、例えば、
こんな書き方もあるでしょう。
Sub test2()
With Range("B2:AO2,B4:AO4,B6:AO6,B8:AO8") .Formula = "=MID($A$10,B1,1)" ' .Value = .Value End With End Sub
むしろ、11行目以下にも同様なものがあるんじゃないんですか?
それをどうするかを考えたほうがいいんじゃないですか?
24行目というのが、コードのどこを指しているのか全く不明だが、
そういう訳が分からないことは書かないでいただきたい。
# 単に画像をリンクした質問をしたかっただけでは?ww
(γ) 2022/02/23(水) 13:55
γさん、誤解がありそうなので以下説明をしますね。
>24行目というのが、コードのどこを指しているのか全く不明
10:39の私の説明でご理解願えないのであれば
どう説明していいか私には分かりません。
># 単に画像をリンクした質問をしたかっただけでは?
質問を理解する上で理解が深まるので良かれと思って添付した画像を
そのように受け取られるとは。。。。。
>今のままがご自身で分かりやすいのだから、無理して修正することもないと思いますよ。
他のVBAの達人の方のコードを見ることで以後の自分の成長に繋がると思っています。
(取り敢えず何とか成っている応用が効かないコードに以後の成長は無いと思っています。)
>むしろ、11行目以下にも同様なものがあるんじゃないんですか?
いいえ、他には有りません。
あるファーマット変換ソフトで出力されるファイル名が、とても長くなるので
不必要な部分を求めるのに先頭から数えていては間違いが多く現実的では有りません。
(例えば、20-30番目までは不要とか)
現実的には160文字も考慮する必要は無いかも知れませんが大は小を兼ねる的な考えで
あえて対象文字列を多めに取っています。
今回のマクロで位置が特定できれば、後はファイル名変換ソフトでリネームが出来ます。
>Sub test2()
上手く処理できるのを確認しました。
.Formula = "=MID($A$10,B1,1)"の記載は、なぜ上手く処理できる
言葉は悪いのですが「からくり」が分かりません。
(KonNo) 2022/02/23(水) 16:15
私なら、こう書くかも知れません。
Sub 一文字ずつ横方向に分解() Dim str As String Dim i As Long, ii As Long Dim idx As Long
'書き出しセルの初期化 For i = 2 To 8 Step 2 Cells(i, 2).Resize(, 40).Clear Next
'指定文字の分割 str = Range("A10").Value idx = 0 For i = 2 To 8 Step 2 For ii = 2 To 41 idx = idx + 1 Cells(i, ii).Value = Mid(str, idx, 1) Next ii Next i End Sub
(半平太) 2022/02/23(水) 19:12
私に取って馴染みのある基本的なコードによる回答なので判りやすいです。
このようなコードが直ぐに書けるようなスキルアップを目指します。
(KonNo) 2022/02/24(木) 08:08
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.