[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 1001- 2ch.scのread.cgiへ]
Update time : 02/26 17:47 / Filesize : 275 KB / Number-of Response : 1016
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

Excel VBA 質問スレ Part76



1 名前:デフォルトの名無しさん mailto:sage [2022/05/01(日) 02:23:41.78 ID:2t63WK/jM.net]
!extend:checked:vvvvv:1000:512
!extend:checked:vvvvv:1000:512
↑2行に減ってるけど、同じ内容を3行に増やして貼り付けること

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

次スレは>>980が立てること
無理なら細かく安価指定

※前スレ
Excel VBA 質問スレ Part75
https://mevius.5ch.net/test/read.cgi/tech/1644384272/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured

162 名前:デフォルトの名無しさん mailto:sage [2022/05/21(土) 12:06:30.15 ID:zgbylN/DM.net]
>>159
ドーガってソース全体見せながら饅頭が喋るの?

163 名前:デフォルトの名無しさん mailto:sage [2022/05/21(土) 13:24:13.30 ID:yO41HbkGd.net]
64bitだとdatepickerが使えないんだけど代替有りますか?

164 名前:デフォルトの名無しさん mailto:sage [2022/05/21(土) 22:05:53.36 ID:UbenPHXM0.net]
>>161
無いんだな、これが
あと64bitじゃなくて2013か2016あたりから使えないはず

165 名前:デフォルトの名無しさん mailto:sage [2022/05/22(日) 00:44:38.46 ID:VeiX84dqd.net]
クリップボードに

あああ いいい
123  たたたた   ららら 12ああ

000 1
かかか 


あかさ たなは 358 22558

のようにランダムな文字列や数字がはいっています。
空白や改行の数もランダムですがどちらも5個いないです。

あああ、や、いいい、の間は空白や改行のどちらかです。
文字列または数字を、空白か改行で区切って

横に10列ずつに並べたいです。
A1に「かかか」B1に「いいい」おなじように繰り返してJ1に「あかさ」、次はA2に「たなは」が入るようなイメージです。


うまく伝わっているかわかりませんが、どのようなコードを書いたらいいですか?

166 名前:デフォルトの名無しさん [2022/05/22(日) 02:13:20.90 ID:EshCCJ/od.net]
>>163
まずはちゃんと伝えるように書け

167 名前:デフォルトの名無しさん mailto:sage [2022/05/22(日) 02:46:34.46 ID:EqID4SVmM.net]
>>163
よくわからん部分もあるが
クリップボードからテキストフォーマットのデータをstrに読み込んで改行ごとに分割(spritかね)
分割した文字列を更にスペースごとに分割して2次元配列にいれる
あとはそれをセルに転写すればいいんじゃないの?
分けるのが改行と空白両方ならどっちかにリプレースしてからスプリット

168 名前:デフォルトの名無しさん (アウアウウー Sac7-xdJx) mailto:sage [2022/05/22(日) 06:43:53 ID:e+a5DD9Ja.net]
>>163
とりあえずその状態で欲しい結果を書け

169 名前:デフォルトの名無しさん (ワッチョイ 9768-A7oz) mailto:sage [2022/05/22(日) 06:45:54 ID:g+ilDpCn0.net]
>>163
連続する改行と空白を消す。
for i = 1 to 5
a = Replace(a, vbCrLf & vbCrLf, "")
a = Replace(a, " " & ” ” , "")
next

改行を空白に置換する

splitで分ける

配列をセルに入れる

170 名前:デフォルトの名無しさん (ワッチョイ 9768-A7oz) mailto:sage [2022/05/22(日) 06:46:20 ID:g+ilDpCn0.net]
>>166
A1に「かかか」B1に「いいい」おなじように繰り返してJ1に「あかさ」、次はA2に「たなは」が入るようなイメージで



171 名前:デフォルトの名無しさん mailto:sage [2022/05/22(日) 08:05:25.80 ID:kuwcJLnp0.net]
どういう順番にしたらA1にかかかが来るのかがよく分からない

172 名前:デフォルトの名無しさん mailto:sage [2022/05/22(日) 08:09:48.09 ID:g+ilDpCn0.net]
A1に「かかか」

A1に「あああ」

間違えてるだけだろ、それぐらい見抜こう

173 名前:デフォルトの名無しさん mailto:sage [2022/05/22(日) 08:43:32.82 ID:kuwcJLnp0.net]
書かれてる仕様を思い込みで勝手に書き換えたらいかんでしょ
作り込む前に確認を取らなきゃダメだよ

174 名前:デフォルトの名無しさん (アウアウウー Sac7-xdJx) mailto:sage [2022/05/22(日) 09:43:55 ID:aVdyttIba.net]
>>168
Dim S As String
With CreateObject("new:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")
.GetFromClipboard
S = .GetText
End With
With CreateObject("VBScript.RegExp")
.Pattern = "[ \n]+"
.Global = True
Dim R As Long
R = 1
Dim C As Long
C = 1
Dim T As Variant
For Each T In Split(.Replace(S, " "), " ")
Cells(R, C).Value = T
C = C + 1
If 10 < C Then
C = 1
R = R + 1
End If
Next
End With

175 名前:デフォルトの名無しさん mailto:sage [2022/05/22(日) 10:01:24.95 ID:q4bvZkadM.net]
>>172
あらキレイ

176 名前:デフォルトの名無しさん mailto:sage [2022/05/22(日) 10:11:15.36 ID:RbyXtd/h0.net]
>>173
綺麗に見えるだろ?
このコード、死んでるんだぜ…ヘヘッ

177 名前:デフォルトの名無しさん mailto:sage [2022/05/22(日) 10:37:59.11 ID:TDPiVbwY0.net]
>>163
VBAスレでいうのもアレだと思うけど

「改行、スペースで区切られたテキストデータを、10個ずつ(10列ずつ)で改行されるデータとして抽出したい」
って考えると正規表現可能なテキストエディタでやったほうが良いような気がする。

( | |\r\n) を \t
\t+ を \t
((.*?\t){2}) を $1\r\n

にみたいな感じで

178 名前:デフォルトの名無しさん mailto:sage [2022/05/22(日) 13:05:55.15 ID:QBTEeDJr0.net]
>>163
同じくVBAスレでいうのもアレだし>>172でよいと思うけど

powershell -c "(gcb -raw) -replace '\s+', """"`t"""" -replace '((?:[^\t]+\t){9}[^\t]+)(?:\t|$)', """"`$1`r`n""""|scb"

VBAから実行するなりバッチファイル(.bat)にして実行するなりすると
整形結果がクリップボードに入るのでA1を選択して貼り付け。

すでにExcel上にあるデータなら>>172とかが有力だけど、
入力元がクリップボードならクリップボード格納前後(VBA前)で
テキスト処理に向いた言語や手法(>>175)で整形したらいいんじゃないの、と思う。
餅は餅屋、ってことで。
今回だとクリップボード操作と正規表現向き内容なのでPowerShellが向いてそう。

・実行環境のOS(Windows 7で実行されうるか)
・文字列にダブルクォーテーションが含まれうるか
・「空白」の正確な定義(レアな空白を「空白」に含んでよいか)
・『A1に「かかか」』の謎
・この整形処理前後の処理(処理全体、本当の処理目的)
などにもよるけど。

179 名前:デフォルトの名無しさん mailto:sage [2022/05/22(日) 19:14:42.01 ID:Np0e+b7dd.net]
常にそうだとは言わないけど、VBAでいろんなことしようとする人って
会社内でセキュリティに縛られてVBAしか使えないような環境でこっそりやってる場合が多いんじゃね

うちなんてpowershellさえ使えない

180 名前:デフォルトの名無しさん mailto:sage [2022/05/22(日) 21:09:09.39 ID:2g8+RnwC0.net]
>>177
VBAとVBScript/Jscriptはそれの定番だよ。
IEがなくなるとスクレイピングができなくなるよな。
そういう環境下だと、どうするんだろう。



181 名前:デフォルトの名無しさん mailto:sage [2022/05/22(日) 21:19:32.54 ID:uG5Z2bGad.net]
163です。
レスくださった方ありがとうございました。

結論から言うと、>>172を加工してなんとなくうまくできました。
A1セルは「あああ」が正しいです。すみません。

182 名前:デフォルトの名無しさん mailto:sage [2022/05/22(日) 21:33:47.57 ID:g+ilDpCn0.net]
それぐらい分かってるから大丈夫だ

183 名前:デフォルトの名無しさん mailto:sage [2022/05/23(月) 17:38:33.02 ID:KrqlZBhkM.net]
表示するのにラグを発生させたい場合sleepかウェイトを試して見たのですがソースの途中に入れても実行最初に止まって全部表示されてしまうのですがなにかいい方法はないのでしょうか

184 名前:デフォルトの名無しさん mailto:sage [2022/05/23(月) 17:51:32.07 ID:KArKRscP0.net]
何の表示だよ

185 名前:デフォルトの名無しさん mailto:sage [2022/05/23(月) 17:58:05.38 ID:KrqlZBhkM.net]
セルに挿入です
for文を挟んでいるとどうもすべて止まって一括表示されてしまいます

186 名前:デフォルトの名無しさん mailto:sage [2022/05/23(月) 18:38:04.00 ID:nw7KfNpjD.net]
ループ内で都度再表示させればいいんじゃねーの

187 名前:デフォルトの名無しさん mailto:sage [2022/05/23(月) 18:45:16.94 ID:S7FOVsdv0.net]
excelのシートのA列に◎オプションボタンActiveXを付けた、B列には商品名(3000件くらいある)を入れた。
◎ りんご
◎ みかん
◎ ぶどう
◎ ばなな

ぶどうを選んだら、TRUEになった番号は「3番」って返ってきているのですが、3000件を設定するのが大変で一括で設定できる方法があれば何かヒントを教えてください。

188 名前:デフォルトの名無しさん mailto:sage [2022/05/23(月) 20:02:47.45 ID:BtAHO3WV0.net]
>>181
なんのためのラグかを書けばもう少しマシなやり方を教えてくれるかも

189 名前:デフォルトの名無しさん mailto:sage [2022/05/23(月) 20:48:26.86 ID:e/WRg45j0.net]
>>183
DoEvents

190 名前:デフォルトの名無しさん (ワッチョイ 9768-A7oz) mailto:sage [2022/05/23(月) 20:58:57 ID:BtAHO3WV0.net]
Sub foo()
Range("a1:z100").Formula = "=rand()"
End Sub
こういうのを徐々に表示したいってなら、無理だ



191 名前:デフォルトの名無しさん mailto:sage [2022/05/23(月) 21:43:20.23 ID:2/Utrmz50.net]
Do Eventsってイマイチちゃんと意味を理解しない状態で使ってる気がする

なんか図形でアニメみたいな動きさせるとか
入れると安定したり

192 名前:デフォルトの名無しさん mailto:sage [2022/05/23(月) 23:30:03.20 ID:e/WRg45j0.net]
>>189
WindowsというOSの(ほぼ)すべてがイベントで動いてる
キー入力も画面表示もディスクアクセスも、何をするにもイベントが必ず使われる

普通に使ってるだけで、ユーザーの関知してないところで毎秒数十万回以上のイベントが発生してて、その一部は溜めたり無視することもできる
そこで溜まったイベントをまとめて処理するのがDoEvents

193 名前:デフォルトの名無しさん mailto:sage [2022/05/23(月) 23:44:03.30 ID:lhQpV8J50.net]
肥溜めの水で流すボタンだな

194 名前:デフォルトの名無しさん (スップ Sdba-LYQt) [2022/05/23(月) 23:54:22 ID:hvqO78Q3d.net]
>>190
中途半端な知識の人の回答だな
所詮はExcel使いか

195 名前:デフォルトの名無しさん (ワッチョイ abda-ZFfB) mailto:sage [2022/05/24(火) 00:04:30 ID:voOeNnQV0.net]
そうか?

196 名前:デフォルトの名無しさん mailto:sage [2022/05/24(火) 01:52:28.78 ID:KUFh4POM0.net]
ググって読んでもさっぱりわからんがプロシージャの共通化(´・ω・`)これかも。

197 名前:デフォルトの名無しさん mailto:sage [2022/05/24(火) 02:50:59.45 ID:iiO+sB1VM.net]
>>190
ExcelのVBAがWindowsの全てのイベントを処理しているとでも思ってんの?
いつの時代のWindowsだよ

198 名前:デフォルトの名無しさん (ワッチョイ 372f-tVBN) [2022/05/24(火) 06:09:04 ID:VAh5gH+20.net]
>>195
話せ。

199 名前:デフォルトの名無しさん (ワッチョイ 0eda-yjPv) [2022/05/24(火) 06:13:25 ID:3Lu4tPby0.net]
タスク

200 名前:デフォルトの名無しさん mailto:sage [2022/05/24(火) 13:00:25.03 ID:voOeNnQV0.net]
60歳70歳の古参プログラマーじゃないんだからさ



201 名前:デフォルトの名無しさん mailto:sage [2022/05/24(火) 21:38:10.53 ID:ylp1zOdx0.net]
Loop中など他からの割り込みの余地入れる=DoEventsかと思ってました
厳密な意味は知らずに使ってました

202 名前:デフォルトの名無しさん mailto:sage [2022/05/24(火) 22:07:09.92 ID:kwRZndg1d.net]
昔はWindowsのイベントループそのものだったけど、今は>>199くらいの認識の方が正しいよ
今のExcelは裏でスレッド使いまくってるから複雑

203 名前:デフォルトの名無しさん mailto:sage [2022/05/24(火) 22:24:18.97 ID:L7ubAEHL0.net]
少しまだ難しいですが、とりあえずはwindowsの処理で無視していた分を一旦返してあげるみたいな処理なのだと認識しました。

204 名前:デフォルトの名無しさん mailto:sage [2022/05/24(火) 22:30:40.02 ID:1UrgJSe10.net]
昔はシングルコアで激重だったから適度に返さないとすぐに応答なしになった
今はマルチタスクで割と重い処理も平気

205 名前:デフォルトの名無しさん mailto:sage [2022/05/25(水) 05:02:47.05 ID:1b7KkSYk0.net]
個人用マクロブックのプロシージャからシートに挿入されているマクロのボタンを押す方法を教えて下さい

206 名前:デフォルトの名無しさん mailto:sage [2022/05/25(水) 06:07:16.42 ID:BON/kfv30.net]
privateを削除するんじゃなくて?
物理的にクリック?

207 名前:デフォルトの名無しさん mailto:sage [2022/05/25(水) 06:43:21.13 ID:1b7KkSYk0.net]
物理的にではなくシート側のボタンのクリックイベントのプロシージャを個人用マクロブックのプロシージャから動かしたいです。

208 名前:デフォルトの名無しさん mailto:sage [2022/05/25(水) 06:45:16.14 ID:1b7KkSYk0.net]
application.runは駄目でした

209 名前:デフォルトの名無しさん [2022/05/25(水) 06:47:11.61 ID:Vyx13HCI0.net]
イベントとか言うから初心者が勘違いする

210 名前:デフォルトの名無しさん mailto:sage [2022/05/25(水) 07:53:58.12 ID:SJVW4y9pr.net]
プロシージャの中身を外出ししようとか考えたのか?



211 名前:デフォルトの名無しさん mailto:sage [2022/05/25(水) 08:31:27.12 ID:2Cw1QSym0.net]
>>203
Call

212 名前:デフォルトの名無しさん mailto:sage [2022/05/25(水) 09:47:51.39 ID:rgUSKbgWd.net]
いやここはレイズだ

213 名前:デフォルトの名無しさん mailto:sage [2022/05/25(水) 18:45:23.11 ID:cRKMftFU0.net]
>>206
呼び出し先のブック名は入れてるのかもしれないけどモジュールが複数あってモジュール名は入れてない、とか?

214 名前:デフォルトの名無しさん (ワッチョイ 3336-4kT2) mailto:sage [2022/05/25(水) 19:54:25 ID:ZQqE1PHN0.net]
説明が少なくて申し訳ありません。
マクロボタンのついた会社の帳票のマクロボタンを押して処理をした上に自分の個人用マクロブックの処理がしたいです。私は会社の帳票のマクロを変更する技術も権限もないのでこのような形を取っています

215 名前:デフォルトの名無しさん (アウアウウー Sac7-yjPv) [2022/05/25(水) 20:09:39 ID:ySKajOtFa.net]
やっちゃいけないことじゃねーの

216 名前:デフォルトの名無しさん mailto:sage [2022/05/25(水) 20:44:02.25 ID:rgUSKbgWd.net]
会社のマクロにパスワードが掛かってる、かつ起点となるマクロはその会社の方のマクロって事かな?

1. 会社のExcelと個人で用意したxlsm(個人用ブックである必要無し)を準備する
2. vbs やps1の外部ファイルから会社のVBA実行→個人で用意したxlsm内のVBA実行

これで行けるんでねえの?

217 名前:デフォルトの名無しさん mailto:sage [2022/05/25(水) 20:52:50.14 ID:D9uW2fk+0.net]
変更する技術がないなら触らない方が良いと思うよ

218 名前:デフォルトの名無しさん mailto:sage [2022/05/25(水) 21:08:25.40 ID:UbZSbjiw0.net]
そもそも権限のないものを突破しようってのは倫理的にどうなのって気がするが
まずは上司なりなんなりに相談するところからじゃね

219 名前:デフォルトの名無しさん mailto:sage [2022/05/25(水) 21:14:00.59 ID:oImj9UUVM.net]
ややこことは辞めたほうがいいね

220 名前:デフォルトの名無しさん mailto:sage [2022/05/25(水) 22:29:41.62 ID:BtdSsAyL0.net]
パスワードかかってるマクロなんて適当な野良アプリでわかるけどな



221 名前:デフォルトの名無しさん mailto:sage [2022/05/26(木) 00:34:12.72 ID:O+gRo7JH0.net]
会社用のマクロ実行したあと、個人用マクロを実行するだけの作業なのに
あくまでも自分の分からない領域まで手を入れたいってのは分からんな
マクロ壊して分かりづらい変なトラブルになったら責任云々とかになりかねないかもしれんぞ

214のやり方がむりなら諦めるか上長に相談するべきやと思うで

222 名前:デフォルトの名無しさん mailto:sage [2022/05/26(木) 06:53:49.33 ID:FGzk4ul90.net]
>>219
100個ぐらいあるエクセルファイルを開いて、そのエクセルファイルのマクロボタンを押して一回目の処理をして次に個人用マクロブックに作った処理をしてエクセルファイルを上書き保存して閉じるを繰り返さなくてはいけないのでマクロ化したいのです。エクセルファイル側のプロシージャを個人用マクロブック側に持たせるのが一番簡単かなと

223 名前:デフォルトの名無しさん [2022/05/26(木) 06:58:26.73 ID:5W+gZAxj0.net]
その会社の帳票マクロとやらのファイルを開いてボタン押せるんならSendKeys使えば何とかなるんじゃねーの?(鼻ホジ)

224 名前:デフォルトの名無しさん mailto:sage [2022/05/26(木) 07:56:10.65 ID:JEeygHRrr.net]
>>220
工夫するのは上長に100個もある無駄なExcelファイルについて改善を提案すべきじゃね
下手なやつの自動化は害にしかならない
それでだめなら自分の責任でこういうやり方していいかとか聞くとかそういう流れにはもうしたんやろ?

外部から呼ぶ214のやり方で無理なら諦めろ
改善して見込める君の給与メリットがそれほどの額じゃないんやろ

これ公務員とかならマジで税金の無駄やなw

225 名前:デフォルトの名無しさん (ワッチョイ 7fce-eugl) mailto:sage [2022/05/26(木) 08:40:43 ID:MTu1kK/A0.net]
公務員なんて文系の仕事だから、効率のいいデータ整理やプログラミングができるやつなんてほぼいない
しかし理系の人材に役所仕事させるのは税金の浪費以上にもったいない

226 名前:デフォルトの名無しさん (ワッチョイ 8a3d-Td31) mailto:sage [2022/05/26(木) 14:50:09 ID:6r93DwI70.net]
>>206
wshでしょっちゅうやってるけど

Set fso = Wscript.CreateObject("Scripting.FileSystemObject")
CurrentDirectory = fso.getParentFolderName(WScript.ScriptFullName)
Set ExApp = Wscript.CreateObject("Excel.Application")
ExApp.Visible = True 'エクセル可視/不可視設定
ExApp.DisplayAlerts = False '警告メッセージをオフ
Set Wb = ExApp.Workbooks.Open(fso.BuildPath(CurrentDirectory,"Book1.xlsm"))
ExApp.Application.Run "Macro1"

227 名前:デフォルトの名無しさん [2022/05/26(木) 15:48:41.66 ID:5fQbWZ9ra.net]
上司に黙ってデータ改竄とかしたら
会社の資産を横領できちまうな

228 名前:デフォルトの名無しさん [2022/05/26(木) 18:34:16.06 ID:MJ/jCOeZ0.net]
農協で30年勤めたOLがやりそうなイメージ。

229 名前:デフォルトの名無しさん [2022/05/26(木) 18:36:23.42 ID:MJ/jCOeZ0.net]
郵便局の場合、昭和のころから歴代の局長が引き継いでそう。
漁協の場合、いくつもの窃盗グループがありそう。
悪いこととは知らなかったって言いそう。

230 名前:デフォルトの名無しさん mailto:sage [2022/05/26(木) 22:05:05.56 ID:KppvSZ/JH.net]
今日いちにち会社で配列に関する記事を読んでましたがここ10年くらいVBAに触れてなかったせいもあり
よく理解できないためお力をお借りしたいです。

20万行くらいある空白の無いデータを処理したいのですが、私の書いたコードではどうしても速く処理できません。
F列が「Distribution (PCW; Sales value」とあったらその右のG列の数字を見に行き、3以下ならその行含め下に2行、合計3行削除したいです。

Sub TEST1()
Application.ScreenUpdating = False

Dim A
'セルの値を配列に格納
A = ActiveSheet.Range("A1").CurrentRegion

'配列をループ
For i = UBound(A, 1) To 2 Step -1

'「If」で検索
If A(i, 6) = "Distribution (PCW; Sales value)" Then
If A(i, 7) <= 3 Then
Cells(i, 1).Resize(3, 1).EntireRow.Delete Shift:=xlUp
End If
End If
Next

End Sub



231 名前:デフォルトの名無しさん mailto:sage [2022/05/26(木) 22:19:00.22 ID:KppvSZ/JH.net]
一応こんな感じのデータです

A列     B列    C列     D列       E列         F列                  G列       
CTM_    12Area TM_2022 sku    SKU Code Measure               TOTAL 4.18- 4.25- 5.2- 5.9-
業態合算 Hokkaido その他 キヨウリツ ゼリ-  4901325124326 Distribution (PCW; Sales value) 8.64 7.03 6.63 9.19 11.70
業態合算 Hokkaido その他 キヨウリツ ゼリ-  4901325124326  Sales Store**** 2,386. 1,830 3,254. 2,244 2,460.5
業態合算 Hokkaido その他 キヨウリツ ゼリ-  4901325124326 Sales Store***** 666 7777 888 4444 7777

232 名前:デフォルトの名無しさん mailto:sage [2022/05/26(木) 22:19:48.67 ID:KppvSZ/JH.net]
やっぱりずれた。。。(>_<)

233 名前:デフォルトの名無しさん mailto:sage [2022/05/26(木) 22:28:17.29 ID:dA4WjGxV0.net]
>>228
Excelの行を1行1行Deleteするのはどうやっても重くなるから出力用の配列を作るのがいいかな

234 名前:デフォルトの名無しさん mailto:sage [2022/05/26(木) 22:30:55.09 ID:6l5xx5Q8d.net]
配列を使ってんなら配列の中で削除処理しないとそりゃあ意味無いでしょ

235 名前:デフォルトの名無しさん mailto:sage [2022/05/26(木) 22:46:06.64 ID:KppvSZ/JH.net]
>>231
>>232

ごもっとです、、(;^_^A
今日は疲れたので明日ちょっと調べて試行錯誤してみます。レスいただきありがとうございました。

236 名前:デフォルトの名無しさん [2022/05/26(木) 23:00:25.66 ID:Wrt5fLCv0.net]
いつもやる方法があるけどどのくらい早いのかはよくわからん

237 名前:デフォルトの名無しさん mailto:sage [2022/05/26(木) 23:01:04.69 ID:6l5xx5Q8d.net]
ユニークなキー列がもしあればディクショナリー使うのが速いよ
まあ難しければ配列でも全然良いけど

238 名前:デフォルトの名無しさん (HK 0Hca-ib4B) mailto:sage [2022/05/26(木) 23:26:48 ID:KppvSZ/JH.net]
>>234
少なくとも私のコードよりは速いんじゃないかな。。
15万行を10分以上かかってます(;^_^A

>>235
ディクショナリーとは初めて聞きました。でもユニークなキーがありませんでした。。
SKU Codeという商品コードは基本ユニークなんですが3行ずつ同じ商品コードが並んでるんです。。(;^_^A

239 名前:デフォルトの名無しさん (ワッチョイ 768c-aDUG) [2022/05/26(木) 23:42:29 ID:Wrt5fLCv0.net]
>>236
じゃあこんな感じで作ったので10分以上がどのくらい早くなったか遅くなったか教えてください。

Sub TEST1()
Application.ScreenUpdating = False

Dim A
'セルの値を配列に格納
A = ActiveSheet.Range("A1").CurrentRegion

'配列をループ
For i = UBound(A, 1) To 2 Step -1
Debug.Print i

'「If」で検索
If A(i, 6) = "Distribution (PCW; Sales value)" Then
If A(i, 7) <= 3 Then
Cells(i, 6).Resize(3, 1).Interior.Color = RGB(255, 0, 0)

End If
End If
Next
'
ActiveSheet.Range("A1").CurrentRegion.Select
Selection.AutoFilter Field:=6, Criteria1:=RGB(255, 0, 0), Operator:=xlFilterCellColor
Selection.Offset(1, 0).Resize(Selection.Rows.Count - 1).Select
Selection.SpecialCells(xlCellTypeVisible).Select
Application.ScreenUpdating = True
Selection.Delete 'これはしないで目で確認して手動でDELETEしても良いかも

End Sub

240 名前:デフォルトの名無しさん mailto:sage [2022/05/26(木) 23:50:53.02 ID:HeWhwrio0.net]
>>228
・最初にセルの内容をvariantの2次元配列に格納。

・そのvariantを弄くり倒す。

・ほしい結果になったvariantを最後に書き戻す。

セルはフォントだの背景色だの罫線だの表上のアドレスだのとにかくいろんな



241 名前:情報がてんこ盛りなので、valueみてりゃいい処理ならできるだけ書き換えない。 []
[ここ壊れてます]

242 名前:デフォルトの名無しさん mailto:sage [2022/05/27(金) 00:18:49.05 ID:JbgC4v+W0.net]
あと、蛇足なんだけどソースでやってることそのものをコメントで書いてもあまり意味が…。

'配列をループ
For i = UBound(A, 1) To 2 Step -1

とか

'「If」で検索
If A(i, 6) = "Distribution (PCW; Sales value)" Then

は、いらないのではと。


もひとつ、削除系処理は下からループさせたほうが無難な気がしないでもない。

243 名前:デフォルトの名無しさん mailto:sage [2022/05/27(金) 00:19:25.67 ID:JbgC4v+W0.net]
あ。ループは俺の読み間違いだ。ごめんなさない。

244 名前:デフォルトの名無しさん mailto:sage [2022/05/27(金) 00:22:08.18 ID:5SJXPRgg0.net]
>>235
Dictionary使うならユニークなキーがなくても行番号をキーに突っ込めば大体応用効くよね
アイテムはArrayで格納すればいいし

245 名前:デフォルトの名無しさん mailto:sage [2022/05/27(金) 00:30:45.85 ID:5SJXPRgg0.net]
ちなみに行削除は、DeleteTargetRowみたいなRange型の変数を使って、削除対象の行が出たらその変数にUnionしていってまとめて削除、がまだ速いかな

246 名前:デフォルトの名無しさん [2022/05/27(金) 01:16:57.81 ID:+979Xq8C0.net]
>>237
自分で15万行のデータで試したらDebug.Print i を外しても遅すぎたので作り直し
うちでは5秒でした (Core2Duo E7500 RAM8G win10 Excel2010) 元データのF列に色がないことが条件ですけどね

Sub TEST1()
Dim startTime As Double: startTime = Timer
Application.ScreenUpdating = False
Dim A
A = ActiveSheet.Range("A1").CurrentRegion
For i = UBound(A, 1) To 2 Step -1
If A(i, 6) = "Distribution (PCW; Sales value)" Then
If A(i, 7) <= 3 Then
Cells(i, 6).Resize(3, 1).Interior.Color = RGB(255, 0, 0)
End If
End If
Next
'
Application.ScreenUpdating = True
Dim mySheet As Worksheet: Set mySheet = ActiveSheet
Dim tempSheet As Worksheet: Set tempSheet = Worksheets.Add
Dim myRange As Range: Set myRange = mySheet.Range("A1").CurrentRegion
myRange.AutoFilter Field:=6, Operator:=xlFilterNoFill
myRange.Offset(1, 0).Resize(myRange.Rows.Count - 1).SpecialCells(xlCellTypeVisible).Copy tempSheet.Range("A1")
mySheet.ShowAllData
myRange.Clear
tempSheet.Range("A1").CurrentRegion.Copy mySheet.Range("A1")
Application.DisplayAlerts = False
tempSheet.Delete
Application.DisplayAlerts = True
MsgBox (Timer - startTime & "秒でした")
End Sub

247 名前:デフォルトの名無しさん [2022/05/27(金) 02:06:50.25 ID:+979Xq8C0.net]
myRange.Offset(1, 0).Resize(myRange.Rows.Count - 1).SpecialCells(xlCellTypeVisible).Copy tempSheet.Range("A1")
を下に修正
myRange.SpecialCells(xlCellTypeVisible).Copy tempSheet.Range("A1")

248 名前:デフォルトの名無しさん mailto:sage [2022/05/27(金) 06:53:03.71 ID:0WSlRFUXd.net]
>>241
お何か良いアイデアかも
横からだけど使わせて貰おう

249 名前:デフォルトの名無しさん mailto:sage [2022/05/27(金) 06:53:21.55 ID:XEPyrX550.net]
>>237
おそら>>243さんもそうかな?

あの後寝てしまい申し訳ありません。
8時くらいになるかと思いますが動かしてみますのでお待ちくださいm(__)m
夜遅くまでどうもありがとうございます!(´;ω;`)

>>238
スミマセン、・そのvariantを弄くり倒す。
からもうよくわからないレベルです。。でもありがとうございます。

>>239
基本はネットで拾ったコードを貼っているので、、
でも自分の参考にはなってます笑。
ありがとうございます。

>>241-242
ちょっと時間あるときに勉強してみますね(;^_^A

250 名前:デフォルトの名無しさん mailto:sage [2022/05/27(金) 07:26:42.06 ID:XEPyrX550.net]
>>243
えっ!!何が起こったの?
こっちも5秒で終わりましたっっ!!!えええぇ信じられないスゴイスゴイ!!!(笑)

ちょっと後でゆっくりF8で動かしてみようと思います!!!
本当に助かりました!ありがとうございました!!!
(´;ω;`)



251 名前:デフォルトの名無しさん mailto:sage [2022/05/27(金) 07:28:44.47 ID:XEPyrX550.net]
>>244
見落としてましたスミマセン。修正してなくてもめちゃくちゃ速く動きましたが
こちらも動かしてみますね。ありがとうございました!m(__)m

252 名前:デフォルトの名無しさん mailto:sage [2022/05/27(金) 08:09:16.73 ID:XEPyrX550.net]
>>244のは見出しが消えるのを修正したコードでしたね(;^_^A

あと、会社のPCで動かしてみたら2秒もかかりませんでした。
素晴らしいコード、本当にありがとうございましたm(__)m 配列の勉強したいと思います。

253 名前:デフォルトの名無しさん mailto:sage [2022/05/27(金) 08:25:54.12 ID:0WSlRFUXd.net]
質問者の要望事項がクリアだったしサンプルコードや表のイメージを出してくれたから回答がしやすかったと思います
殆どの質問者はそんな事までしないクレクレちゃんだから

254 名前:デフォルトの名無しさん (ワッチョイ c3a5-ib4B) mailto:sage [2022/05/27(金) 08:34:33 ID:XEPyrX550.net]
>>250
昔のテンプレに沿った質問の仕方してなかったのでダメ元でしたが
最低限やるべきことはクリアしてたみたいで良かったです。
(*^-^*)

255 名前:デフォルトの名無しさん (ワッチョイ df49-OVn5) mailto:sage [2022/05/27(金) 10:41:33 ID:X2EnXYhx0.net]
>>250
これはほんとにそう
ふわっと伝えるだけできちんと勝手に書いてくれると思ってるやつの多いこと

256 名前:デフォルトの名無しさん [2022/05/27(金) 11:15:34.63 ID:S0cy91Tb0.net]
エクセルで10万行以上とか設計が間違ってる

257 名前:デフォルトの名無しさん mailto:sage [2022/05/27(金) 12:57:26.47 ID:fJfHid2B0.net]
定常業務としてはExcelではやらなくなるにしても、
10万行相手に、最初の試行錯誤をExcelでやってみる
というのはよくある話かと。

設計云々はそれが分かってから。

258 名前:デフォルトの名無しさん mailto:sage [2022/05/27(金) 13:09:45.71 ID:X2EnXYhx0.net]
ワイの感覚では数百行とかでもExcel脱却したいし、
こんなんSQLと適当なスクリプトですぐ済むやろ
Excelになってるから重くなったりしちゃうだけで
Accessはしらん

みんなExcel万能思想すぎるんだよなあ

259 名前:デフォルトの名無しさん mailto:sage [2022/05/27(金) 13:45:31.62 ID:x8n9vcRZ0.net]
職場で与えられた環境でどうにかしようとすると、
結果的にVBAやバッチファイル、PSスクリプトになる気がする

260 名前:デフォルトの名無しさん mailto:sage [2022/05/27(金) 14:07:07.28 ID:s+hQ4v9CM.net]
SQL書けるんだったら
そもそも質問主はこのスレに来とらんことに気付かない、
ただのマウンテンゴリラはウセヤガレ



261 名前:デフォルトの名無しさん mailto:sage [2022/05/27(金) 14:16:48.65 ID:pbjQK1XdM.net]
VBAもできないからこのスレにいるわけで、間違った道に進む前に正してあげるのは良い

262 名前:デフォルトの名無しさん mailto:sage [2022/05/27(金) 20:25:14.34 ID:e5D1B4Eg0.net]
個人用マクロブックからエクセルのシートのマクロを動かす方法がわかりました。ファィル名をtest.xlsm、シートのボタンに登録してあるマクロをsub test()~end subとして
Application.Run"'test.xlsm'!Sheet1.test"
これで動きました。Run以下をダブルクォーテーション、ファイル名をシングルクォーテーションで囲むのがポイントです。






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<275KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef