Excel VBA 質問スレ Part41©5ch.io
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん 転載ダメ©2ch.net
2016/04/27(水) 04:11:46.79ID:Nk+oP5xRコード書き込みや作成依頼もOK
※前スレ
Excel VBA 質問スレ Part40
http://echo.2ch.net/test/read.cgi/tech/1455817784/
※関連スレ
VBAなんでも質問スレ Part2
http://echo.2ch.net/test/read.cgi/tech/1432173164/
Access VBA 質問スレ Part1
http://echo.2ch.net/test/read.cgi/tech/1328536426/
Excel総合相談所 122
http://echo.2ch.net/test/read.cgi/bsoft/1461287268/
0348デフォルトの名無しさん
2016/05/29(日) 17:55:57.68ID:8akYxdWk1万でどう?
0349デフォルトの名無しさん
2016/05/29(日) 19:22:22.37ID:GTS7K4/Tお前の半日〜1日分の給料に該当するだろ
ざっと作って30分〜1時間くらいのものに
どれだけ手入れるつもりだよ
0350デフォルトの名無しさん
2016/05/29(日) 19:37:22.60ID:DU/FdEem延長、指名、同伴オプションも相談のります
0351デフォルトの名無しさん
2016/05/29(日) 19:51:23.53ID:IL/FFzdQ0352デフォルトの名無しさん
2016/05/29(日) 19:56:44.56ID:iENwe/Jr0353デフォルトの名無しさん
2016/05/29(日) 20:02:58.52ID:l+XEODYT0354デフォルトの名無しさん
2016/05/29(日) 20:52:32.53ID:qZvodTNYそんな発想が出るってどんな安い単価の世界で生きてるんだ…
0355デフォルトの名無しさん
2016/05/29(日) 20:53:43.81ID:GCJVxvYj0356デフォルトの名無しさん
2016/05/29(日) 21:02:37.79ID:O2TO5DJ70357デフォルトの名無しさん
2016/05/29(日) 21:29:17.79ID:PpnqKVZyバカ発見
0358デフォルトの名無しさん
2016/05/29(日) 21:31:54.50ID:IxwT55oU学生は気楽でいいな
0359デフォルトの名無しさん
2016/05/29(日) 22:31:24.29ID:iENwe/Jr0360デフォルトの名無しさん
2016/05/29(日) 23:03:21.50ID:9s1DeJLcレスいただいた方ありがとうございました。
丸投げで申し訳ないと思ったので自分なりに今プログラムを作っています。
>>347
Amazonではないです。
JANに紐付いた商品情報をvlookupで読み込むフォームがあるのですが、毎回シートをコピーしてJANを貼り付けて見出しを変えるという手間が大変なのでVBAを組みたいと思いました。
今VBAを勉強しているところです。
>>355
ありがとうございます。
いただいたプログラム、まだ自分には難しいのですがwithやdate関数の使い方など勉強になります。
とりあえず今のところ、シートをコピーしてJANを貼り付け、見出しを「日付+商品名」にするところまで出来ました。
あとはJANの数だけ上の作業を繰り返すプログラムが出来れば完成です。
自分でやってみて分からなければまた質問します。
ありがとうございました。
0361デフォルトの名無しさん
2016/05/30(月) 00:11:04.77ID:MwQPmEOY連投すみません。奇跡的に出来ました。
ちなみに下のようなプログラムです。
Sub 商品別作成 ()
dim i as integer
i = 2
do until worksheets("リスト").cells(i.1).value = ""
worksheets("原紙").copy after:= worksheets(worksheets.count)
with worksheets(worksheets.count)
.cells(1,2).value = worksheets("リスト").cells(i,1)
.name = year(date) & month(date) & day(date) & worksheets(worksheets.count).cells(1,4)
end with
i = i + 1
loop
end Sub
です。
携帯からの書き込みのため見にくくて申し訳ありません。
手元にあった参考書と>>355さんのプログラムを参考に作りました。
自分で作っておきながらよく理解できていないところもあります。
たとえば、
worksheets(worksheets.count)
がなぜワークシートの末尾という意味になるのか、とか。
長文すみません。ありがとうございました。
0362デフォルトの名無しさん
2016/05/30(月) 00:21:17.07ID:MGJW0QKJ0363デフォルトの名無しさん
2016/05/30(月) 00:29:54.80ID:4yKaoPuEworksheets.countプロパティにはワークブックの持ってるワークシートの枚数がセットされてて、ワークシートの追加や削除で値が増減する
メインでworksheets(1)って使ってるでしょ? これは1枚目のワークシートの事
ワークシートが5枚あればworksheets.countの値は5になるのでworksheets(5)って指定するのと同じこと
検索すると詳しい解説がいっぱい見つかるから読んでみるといい
0364デフォルトの名無しさん
2016/05/30(月) 00:33:15.23ID:TRF4/Pejworksheets(番号を表す数値)
ワークシートが3つある場合は、0から2までで表される
番号を表す数値に3を指定すると4番目の新しいワークシートになる
worksheets.countはワークシートの数を表す
つまりワークシートが3つあれば、3となる
よってワークシートが3つあれば、worksheets(worksheets.count)は
worksheets(3)となり0から始まる4番目のワークシートとなるから
ワークシートの末尾と同じことになる
0365デフォルトの名無しさん
2016/05/30(月) 01:25:38.78ID:4HMhVwgA2シートある表の比較で、
2行目から比較なので
For i = 2 To Lastrow1 ※1シート目の最終行まで
For j = 2 To Lastrow2 ※2シート目の最終行まで
If Sheet1.Cells(i,2) = Sheet2.Cells(j,2) Then ※2列目に番号があり合ってれば
For i2 = 1 To LastColumn1 ※1シートの最終列まで
If Sheet1.Cells(i,i2) <> Sheet2.Sheet2.Cells(j,i2) Then
Sheet1.Cells(i,i2).Interior.ColorIndex = 3
End If
If Sheet1.Cells(i,i2).Interior.ColorIndex <> xlNone Then
Sheet1.Rows(i).EntireRow.Copy Destination:=Sheet3.Rows(i)
End If
Next i2
End If
Next j
Next i
1シートと2シートを比べ、1シートの差異のセルに色を塗り、
3シート目に行ごとコピーしているのですが、
1シートにしかない行、2シートにしかない行もあり、
それも3シートにコピーしたいのですが、どのようにしたらよいでしょうか?
0366デフォルトの名無しさん
2016/05/30(月) 03:35:34.52ID:lz7aZWOJこんな感じかな?
For r1 = 2 To Lastrow1 ' ※1シート目の最終行まで
flag = True
For r2 = 2 To Lastrow2 ' ※2シート目の最終行まで
If Sheet1.Cells(r1, 2) = Sheet2.Cells(r2, 2) Then ' ※2列目に番号があり合ってれば
flag = False ' ※この行はコピーしない
End If
Next r2
If flag Then ' ※この行は1シートにしかないので
Sheet1.Rows(r1).EntireRow.Copy Destination:=Sheet3.Rows(r1) ' ※3シートにコピー
End If
Next r1
For r2 = 2 To Lastrow2 ' ※2シート目の最終行まで
flag = True
For r1 = 2 To Lastrow1 ' ※1シート目の最終行まで
If Sheet1.Cells(r1, 2) = Sheet2.Cells(r2, 2) Then ' ※2列目に番号があり合ってれば
flag = False ' ※この行はコピーしない
End If
Next r1
If flag Then ' ※この行は2シートにしかないので
Sheet2.Rows(r2).EntireRow.Copy Destination:=Sheet3.Rows(r2) ' ※3シートにコピー
End If
Next r2
0367デフォルトの名無しさん
2016/05/30(月) 04:47:59.06ID:4HMhVwgAありがとうございます。
したい事はできたのですが、
このflagというのはどういう意味なのでしょうか?
0368デフォルトの名無しさん
2016/05/30(月) 06:28:58.71ID:MwQPmEOY>>364
ありがとうございます。
なるほど。
>>361では本当は「ワークシート1の後にワークシート1をコピーして、コピーしたワークシートに作業する」ということがしたかったんですが、その場合は
Sub 商品別作成 ()
dim i as integer
i = 2
do until worksheets("リスト").cells(i.1).value = ""
worksheets(1).copy after:= worksheets(1)
with worksheets(2)
.cells(1,2).value = worksheets("リスト").cells(i,1)
.name = year(date) & month(date) & day(date) & worksheets(2).cells(1,4)
end with
i = i + 1
loop
end Sub
というプログラムにすれば、ワークシートの名前は関係なしに一枚目をコピーして二枚目に作業する、ということになりますか?
0369デフォルトの名無しさん
2016/05/30(月) 08:09:31.18ID:4yKaoPuEWorksheets(n)で指定する場合のnは左からみたシートの並びになるらしいので
Worksheets(1).copy after:= worksheets(1) を実行したときには
最新のコピーは常に左から2枚目の位置に来る事とコピー元のシート位置は左端(1枚目)から変えちゃいけない事を
意識できればいいんじゃないかな
0370デフォルトの名無しさん
2016/05/30(月) 20:24:27.53ID:dvnyr15v「手取り」っていまいちよく理解できないんだよね。
支給額から税金とか差し引いた額ってことだろうけど、
その差し引きく額には会社の団体保険の医療保険とか持ち株会の月額とか寮費とかは含まれるの?
たまに「手取り○万円しか無いんだよ!」って言う人に詳しく聞くと、
上記のようなものも差し引いて実際に自分の口座に振り込まれる額を言う人がいるんだけど、
それって「手取り」って言って正しいの?
0371デフォルトの名無しさん
2016/05/30(月) 20:49:50.01ID:9zgDAfYa手取りは基本的に保険など差し引いて振り込まれる額、つまり自由に使える金
寮費は微妙だけど、振り込まれる額を指す場合が多いと思う
0372デフォルトの名無しさん
2016/05/30(月) 20:50:32.53ID:iGtTjZst引くのは税金と健康保険と雇用保険と介護保険じゃね
0373デフォルトの名無しさん
2016/05/30(月) 20:57:22.49ID:4q9S9srQ確かに契約社員やってる人には
分かり辛いかもしれないね
0374デフォルトの名無しさん
2016/05/30(月) 21:11:27.51ID:iGtTjZst年金保険もか
0375デフォルトの名無しさん
2016/05/30(月) 22:21:18.67ID:VvWJADwM0376デフォルトの名無しさん
2016/05/30(月) 22:26:40.27ID:iGtTjZst寮費とかはその人が寮を使ってるからだし
自動車保険も給与から引くようにしなくても良いんじゃね
健康保険とか雇用保険とか年金は全員引かれるもの
VBAとは関係ないが
0377デフォルトの名無しさん
2016/05/30(月) 22:28:58.68ID:9zgDAfYa真剣に考えて損したわ
0378デフォルトの名無しさん
2016/05/30(月) 22:37:26.71ID:VvWJADwM給与明細見たら、
組合費、組合積立金、寮の食堂での食費、寮自治会費も給料から引かれてたわ
手取りっていっても会社によって全然ちがうのね
ちな三菱系
0379デフォルトの名無しさん
2016/05/30(月) 22:49:20.47ID:JaLXIj0Gただそう言うのまで入れると何の金額のことかワケわからんようになるから手取りってそう言うのは入れないように思う
0380デフォルトの名無しさん
2016/05/30(月) 22:50:34.41ID:dvnyr15vニュースと >>359 の「手取り」の文章とで、昔の関連会社の人との会話の中でふと思ったことを
連想して思い出したら書かずにはいられなかっただけなんだ。ごめんよ。
0381デフォルトの名無しさん
2016/05/30(月) 22:59:06.74ID:MGJW0QKJもうすぐボーナスじゃないか
0382デフォルトの名無しさん
2016/05/30(月) 23:25:53.51ID:FNI4oSJu一般的には給与から源泉徴収税、住民税特別徴収、健康保険料、年金保険料、雇用保険料を引いた額
0383デフォルトの名無しさん
2016/05/30(月) 23:28:03.40ID:FNI4oSJu0384デフォルトの名無しさん
2016/05/31(火) 01:17:34.99ID:P+B3hNwu何それ、俺の知らない知識だ
0385デフォルトの名無しさん
2016/05/31(火) 07:03:20.88ID:lb4BA3Cb0386デフォルトの名無しさん
2016/05/31(火) 11:12:06.88ID:P7zsebxNdouble型の配列に数値以外の文字を格納することは出来ませんか?空白と区別出来るものであれば何でも構いません。(-または/がベストな希望)
型をvariantに変えるという手もありますが、計算ミスがあるようなイメージがあるので、やっておりません。何かアドバイスお願いします。
0387デフォルトの名無しさん
2016/05/31(火) 11:47:30.66ID:9/vIAIrD計算ミスというのは無いと思うが、やはりVariantで型チェックすれば?
または自分でOptional型クラスを作るか。
0388デフォルトの名無しさん
2016/05/31(火) 12:07:24.59ID:iuDv2fhMそのまま答えるとvariantで格納して呼び出しの時にチェックするしか無いだろう
しかしそれ以前に根本的な設計が間違ってる
やりたいこと書いた方がいいかもしれない
0389デフォルトの名無しさん
2016/05/31(火) 14:51:30.75ID:MV3Si3mC>>388
ダブルだとやはり出来ないんですね。
稀にマイナス小数点同士の乗算除算や0出現時のエラーがあるのでそれを区別したいと考えてました。
variantでやってみます!
0390デフォルトの名無しさん
2016/05/31(火) 21:08:56.37ID:mGubUgmp0391デフォルトの名無しさん
2016/05/31(火) 21:30:53.23ID:C0QCg+LlまさかセルからTextで値取得しているってオチは無いよね。
ちょっと気になったのがVariant型に入れて数値チェックするのと、
String型に入れて数値チェックしてDouble型に変換して使うのとどっちが早いのか。
まぁ気にするほど差が出ないのは分かっているけど、単純な疑問。
後、Variantに入れると変な暗黙の型に突っ込まれて本来のDouble型と挙動が変わることがないのか心配。
0392デフォルトの名無しさん
2016/05/31(火) 21:51:56.92ID:LgcgyNaP0393デフォルトの名無しさん
2016/05/31(火) 22:01:55.92ID:iuDv2fhMふーん、アルゴリズムが遅いんだ〜
0394デフォルトの名無しさん
2016/05/31(火) 22:04:20.02ID:mGubUgmp単にVariant型に入れた値を数値チェック後に取り出すだけだったら、Stringから変換するよりずっとずっと速いはず。
前者と違って後者は本当の変換だからな。
0395デフォルトの名無しさん
2016/05/31(火) 22:09:57.16ID:LgcgyNaPせやで、プロとお前らの違いはアルゴリズムなんやで
変数がvariantとかどうでもええねん
0396デフォルトの名無しさん
2016/05/31(火) 22:10:12.22ID:C0QCg+Llただ、Variant型を使うよりString型を使う方が早いんだよね。
型変換でどのくらい相殺されるか
0397デフォルトの名無しさん
2016/05/31(火) 22:13:58.47ID:hxNGQcCXエスパると丸め誤差のことか?
0398デフォルトの名無しさん
2016/05/31(火) 22:15:14.99ID:mGubUgmpどういう使い方?
v = 3.1415
より
s = "3.1415"
として使う方が速いって意味?
0399デフォルトの名無しさん
2016/05/31(火) 22:40:22.39ID:P0axz30G俺もこれ知りたい
VBAからセル選択してもフォーカスはコントロールに行ったままだよな
0400デフォルトの名無しさん
2016/05/31(火) 23:58:45.09ID:b/p0i84SExcel 2013持っていないから試せないけど
APIでフォアグラウンドウィンドウを変えてみるとかは?
Private Declare Function SetForegroundWindow Lib "user32" (ByVal hWnd As Long) As Long
Private Sub CommandButton1_Click()
SetForegroundWindow Application.hWnd
End Sub
0401デフォルトの名無しさん
2016/05/31(火) 23:59:23.43ID:C0QCg+Llそう。
http://officetanaka.net/excel/vba/speed/s6.htm
0402デフォルトの名無しさん
2016/06/01(水) 00:08:55.15ID:v2Wj2/bBいやそのリンク先は
s = "3.1415"
としたあとsを文字列のまま扱うときの話でしょ
>>391で「String型に入れて数値チェックしてDouble型に変換して使う」ってのが元の話
だからsをDoubleに戻すコストがいる。
0403デフォルトの名無しさん
2016/06/01(水) 00:11:50.06ID:9sIb/BNEいったんfalseにしてからtrueにするのは試した?
0404デフォルトの名無しさん
2016/06/01(水) 00:28:41.02ID:f68tak/jだからその型変換に掛かる時間と相殺してどちらが早いかという話。
数値チェックはどちらにしたって必要でしょ。
0405デフォルトの名無しさん
2016/06/01(水) 00:46:14.53ID:v2Wj2/bBなるほど
じゃ、明示的な数値チェックを略すと
Dim s As String
Dim v As Variant
Dim d As Double
s = 3.1415 ' ← 型変換(1)
d = s ' ← 型変換(2)
v = 2.7183 ' ← 型変換(3)
d = v ' ← 型変換(4)
としたときのコストは (1) + (2) >> (3) + (4) だ
、っていうのが>>394の主張。
0406デフォルトの名無しさん
2016/06/01(水) 02:19:56.12ID:f68tak/jそうやって並べてみると、
セルから取って来てVariant型に入れた
値は内部型でDouble型とは限らないから
結局は型変換が必要になるな。
後、Objectならともかく、こっちは
Doble型に変換するなら暗黙の変換使わずに
明示的な変換を行う想定でいたわ。
d = CDbl(s) ' ← 型変換(2)
d = CDbl(v) ' ← 型変換(4)
0407デフォルトの名無しさん
2016/06/01(水) 07:17:59.36ID:v2Wj2/bBうん、まあセルに入っている値が大多数は数値で、たまに変なエラーみたいなものが入っている前提とすると、
d = CDbl(s) ' ← この型変換は常に重い
d = CDbl(v) ' ← この型変換はたまに重い
となるね。(sはString型なので常に関数呼び出し)
0408デフォルトの名無しさん
2016/06/01(水) 07:58:53.15ID:J5oSfmPvよく分からないんだけど、例えばセルから取得した値をVariantが内部型をLong型とかに判断した場合って型変換は起こるんじゃないの?
0409デフォルトの名無しさん
2016/06/01(水) 08:50:59.51ID:weg166lE0410デフォルトの名無しさん
2016/06/01(水) 09:02:22.06ID:akJUj8WN特定のフォルダに、ファイル(エクセルBook)が登録(保存、ペースト)された時に
VBAで記述した処理を起動したいのですが、どうすれば良いのでしょうか?
0411デフォルトの名無しさん
2016/06/01(水) 12:22:55.53ID:K88eWt2gAPI使ってタイマーで前回の状態と比較するしか無いんじゃなかろうか。
VB.Netなら確かfilesystemwatcherが使えた気がするけど、それでも難しいよ。
何せExcelファイルはファイルサーバとかに置いて共有切ったりすると、暫く違うファイルに前回状況を抱えて出力したりしてるからね。
簡単なことならいいけど、色々やろうとすると途端に難しくなる。
0412デフォルトの名無しさん
2016/06/01(水) 17:11:37.67ID:E/1ScAaTチェックしないで例外拾うのも、例外処理のコストが高い気がするし
実測したわけじゃないから気がするだけかもしれんが
0413デフォルトの名無しさん
2016/06/01(水) 18:33:41.83ID:9sIb/BNEそもそもそんなに速度が重要ならVBAは向いていないって話だしな。
0414デフォルトの名無しさん
2016/06/01(水) 19:29:44.69ID:weg166lEVBAだけでは難しいかも
0415デフォルトの名無しさん
2016/06/01(水) 19:49:31.29ID:sRCfCf1w出来合いの物同士を結んで駆動させるにはすごく便利なんだけど、
単体で何か作ろうってのは無理だな。
0416デフォルトの名無しさん
2016/06/01(水) 20:29:22.31ID:NX6RE2hb0417デフォルトの名無しさん
2016/06/01(水) 21:07:08.13ID:v2Wj2/bBボタンを押してからフォルダの監視を始めて、ファイルが登録されるまでほっといていいんなら
単に無限ループにすればいいと思うけど?
0418デフォルトの名無しさん
2016/06/01(水) 21:07:46.48ID:IfpgImxcVBAで三重ループとかして何とかしているコードとか見かけると
もう脱力感を通り越して微笑ましいよな
0419デフォルトの名無しさん
2016/06/02(木) 03:58:28.00ID:0gMFQogn規模がそれなりになりそうでレス消費激しくなりそうなんだけど
別にスレ立てたほうがいい?
0420デフォルトの名無しさん
2016/06/02(木) 06:34:02.28ID:uPQC6lrS0421デフォルトの名無しさん
2016/06/02(木) 06:38:04.75ID:jAQjQwIo0422デフォルトの名無しさん
2016/06/02(木) 08:21:37.06ID:x3+LLHfFとりあえず質問内容書いちゃいなよ
ダメだったら回答がないだけで
他になんのリスクもないじゃん
0423410
2016/06/02(木) 11:18:28.49ID:E1zOmXKjレスありがとうございます。
他の方法考えてみます。
0424デフォルトの名無しさん
2016/06/02(木) 12:23:31.19ID:0gMFQognVBAで.CSVの中にある特定の文字列を書き出して右のセル、特定の文字列を書き出して右のセル・・・
とやって言ってある文字列が来たら下のセルの端から・・・という風なものを作りたいんだけど
0425デフォルトの名無しさん
2016/06/02(木) 12:36:06.49ID:jr36f/Tp0426デフォルトの名無しさん
2016/06/02(木) 12:38:46.39ID:PrMOVFII1行ずつ読み込んで、
1行をカンマで分解して、
分解した文字列を比較して、
スキップするのか右に書き出すのか改行するのか処理して、
全行読み込み終わるまで繰り返せばいい。
0427デフォルトの名無しさん
2016/06/02(木) 13:42:52.85ID:0gMFQognなるほど 流れは理解できた
1行をカンマで分解ってどうすればいいんだ?
なんども質問して悪いね
0428デフォルトの名無しさん
2016/06/02(木) 13:56:01.35ID:f0lhMNCN0429デフォルトの名無しさん
2016/06/02(木) 14:03:22.31ID:PrMOVFII大まかに文字通り「カンマ文字で区切られているテキストファイル」程度の縛りしかなく、
カンマ自体を文字列として扱う表現方法とか、
ダブルクォーテーションをどう扱うかとか、
改行コードも区切り文字として扱うのかとか、
そういった決まりが標準として存在してはいないことを注意した方がいいよ。
エクセルに読ませるCSVファイルの作成者とのファイル形式の詳細の確認をしておかないと誤動作する。
あと文字コードとかね。
0430デフォルトの名無しさん
2016/06/02(木) 14:26:09.67ID:MCmPKbwBhttp://www.pc-master.jp/sousa/csv.html
0431デフォルトの名無しさん
2016/06/02(木) 14:27:01.89ID:0gMFQogn確かにCSVってファイルの存在がよくわかってないのは事実だわ
文字が入ってるファイル 程度の認識だった
0432デフォルトの名無しさん
2016/06/02(木) 17:08:58.17ID:H/+hHucZ0433デフォルトの名無しさん
2016/06/02(木) 17:20:17.63ID:QOEnZCBh0434デフォルトの名無しさん
2016/06/02(木) 18:34:23.67ID:VAHYdxVDCSVのパースまで自分でやるならVBA使う意味ないじゃんw
ExcelにCSVのデータをセルに配置してもらって
自分で好きなようにいじって
最後にまたExcelにCSVとして書き出してもらいたいからVBAなのでは
0435デフォルトの名無しさん
2016/06/02(木) 19:41:25.29ID:Q6rF1mtD100万行以内ならそれだな
0436デフォルトの名無しさん
2016/06/02(木) 19:54:53.84ID:jr36f/TpCSVパースする必要なくね
0437デフォルトの名無しさん
2016/06/02(木) 20:15:59.00ID:W5gwkCTf特定文字列を見つけたら
ファイルに書き込んでカンマ
別のある文字列を見つけたら書き込んで改行
これをcsvファイルとして読み込む
0438デフォルトの名無しさん
2016/06/02(木) 21:05:06.89ID:D6ak8EHxやりたいのはこんな感じか? http://codepad.org/2IMAfd1O (コピペして(適当な名前).vbsで保存)
VBScriptだけどSUBの部分はEXCELのVBAにもそのままで持っていけると思う
ワークシートに出したいなら出力部分をファイルからワークシートに変更すればいい
0439デフォルトの名無しさん
2016/06/02(木) 21:28:50.10ID:uPQC6lrS0440デフォルトの名無しさん
2016/06/02(木) 22:09:47.82ID:/P5tacee用意した置換前、置換後のワードリストに沿って複数の文字列置換を一括処理したいのですが、前後の重複に苦悩しています。
例えば
置換前 置換後
あ → い
い → う
というリストで「あい」という値を順番にReplace関数をかけると
「あい」→「いい」→「うう」になってしまいます。
「あい」→「いう」
になるように処理したいです。
ひとつ考えたのは、置換が済んだ文字列は書式を変えて次の処理をしないという方法ですが、
大量処理のためワードリストも処理範囲も全て配列に格納して処理するようにしているので出来ません。
置換された文字列は次の置換処理に当たらないようにする手は無いでしょうか。
0441デフォルトの名無しさん
2016/06/02(木) 22:09:53.87ID:Td5AQauDADODB使ったりSplitで改行位置を何とかしたり色々な方法を考えた結果、
>>429みたいなやり方が一番面倒臭さく無さそうだという結論に達した。
細々と何かすれば処理速度は上がるかも知れないけどね。
0442デフォルトの名無しさん
2016/06/02(木) 22:13:13.72ID:Td5AQauD置換って逆順にやって行くもんだよ
0443デフォルトの名無しさん
2016/06/02(木) 22:18:37.69ID:ZNUdZI3k「ぬぬぬ」を検索して使っていなければ
あ → ぬぬぬ
い → う
ぬぬぬ → い
みたいな感じ?
こういう場合どうすればいいんだろうね、知らないわ
0444デフォルトの名無しさん
2016/06/02(木) 22:29:53.58ID:W5gwkCTfapplication.screenupdate = false
calculatin = xlmanual
とかにすれば配列に入れなくても結構速くなるけど
それか2次元配列にして置換すみなら印をつけるとか
別にDictinaryとか作って置換すみの配列の添字を追加して
exist()メソッドでチェックするとか
0445デフォルトの名無しさん
2016/06/02(木) 22:32:37.55ID:I8wr9FkH逆順でも同じです、順序の問題ではありませんので。
例えばこんな相互置換というか循環置換とでも言うのかな、だったら
置換前 置換後
A1 → A2
A2 → A3
A3 → A1
対象範囲内にA1もA2もA3も全部存在するので上から置換しても下から置換しても同じ問題に当たります。
>>443
その手は考えたのですが、置換対象は何でもあるので「使っていない文字列」は常に不明です。
なので一旦意味を持たない大量のユニークな文字列に1次置換してから目的のワードに2次置換するという。
しかしひとつの値に複数の置換対象があった場合、正常な動作を保証できない気がします。
例えば上の例なら
「A1A2A3」という値を「A2A3A1」にしたいので一旦「&//$%%&%%%-5577'/?##-$」みたいになった時に
偶然他の1次置換ワードと繋がったら間違った結果になってしまいます。
0446デフォルトの名無しさん
2016/06/02(木) 22:34:27.71ID:W5gwkCTf他にはワードリストを工夫する
あ→い
い→う
のリストではなく
あい→いう
のリストを追加して
文字列の長い順に置換処理するとか
0447デフォルトの名無しさん
2016/06/02(木) 22:40:12.20ID:I8wr9FkHその2つはもちろん入れています。
処理範囲は沢山のシートの沢山の範囲で、置換ワードも沢山なので配列使わないのはなんとか避けたいです。
今はセル範囲を二次元配列1と2に入れて、配列2を置換し、配列1と配列2の値が違ったらその番地だけセルに代入するよう組んでいます。
FIND関数とLEN関数で置換した文字列の開始文字数と終了文字数を記録して、次の置換対象がその範囲内に被っていたらreplaceを回避
というのも考えたのですが、これもひとつの値に同じ置換が複数回発生した時に2個目以降が回避できないです。
■ このスレッドは過去ログ倉庫に格納されています