X



Excel VBA 質問スレ Part58
■ このスレッドは過去ログ倉庫に格納されています
0043デフォルトの名無しさん
垢版 |
2018/11/30(金) 19:30:48.61ID:D2Lo7Qd2
>>41
この質問者が「解除」という言葉で言いたいのは、パスワードなしのファイルとしてファイルを再保存することじゃなくて、ただ単に読み取りパスワード付のファイルを普通に実行することだと思うぞ
Sendkeysとか恐ろしいことを上で言ってるので
004535
垢版 |
2018/12/01(土) 07:37:11.82ID:0dTVd6NK
>>43
マクロのロック解除です。

ワークブックと書いて混乱を招いてしまいました。
ファイルは開けます。

現状はマクロでVBAをアクティベートし、vbkeyで操作する方法で試してますが未だにうまく動かないです。
0046デフォルトの名無しさん
垢版 |
2018/12/01(土) 12:13:55.48ID:bMs1CWzL
>>45
VBAのsendkeyは不安定なので、vbsとかを経由しろとか聞いたことある気がする。ちょっと調べてみては?
004735
垢版 |
2018/12/01(土) 12:16:20.34ID:0dTVd6NK
>>46
ありがとうございます。
試してみます。
0048デフォルトの名無しさん
垢版 |
2018/12/01(土) 12:20:42.98ID:TS4bNkMJ
フォルダ内にある全てのtxtファイルをピボットテーブルで変換して一つのファイルに結合するにはどうしたら良いですか?
0052デフォルトの名無しさん
垢版 |
2018/12/01(土) 17:27:15.14ID:qC6lat5H
>>47
vbsとか経由でも駄目だろ。
何が駄目かと言うと入力したい所にピンポイントで入力するわけじゃ無いところ。
直前に入力したい所にフォーカスを当てるとか工夫してる人もいるけど根本的によろしく無いんだよ。
動かしてる時に別の何かをクリックしたりするとそっちに入力されちまう。

改めて確認するけどVBAがパスワード保護されてコ―ド編集出来ない状態になっている。
パスワードは分かっていて手動で解除出来るけどブックが大量で解除と再設定が大変という問題?
0053デフォルトの名無しさん
垢版 |
2018/12/01(土) 17:45:25.58ID:qC6lat5H
>>51
そのテキストファイルはどんなファイル?
データベースのデータのようなものなの?
その104万行というのは、そもそも全部必要なの?

全部必要じゃない、特にもし必要なのはごく一部というのだったら、テキストファイルとして開いて1行ずつ読み込んで、必要あるデータのみ抜き出すという方法が良いと思う。

全部必要だったらAccessを使うべきデータ量だな。
でも、そのデータをどんな風に扱いたいか分からないから一概には言えない。
005435
垢版 |
2018/12/01(土) 17:56:01.08ID:0dTVd6NK
>>52
おっしゃる通りです。
マクロで大量に作ったマクロパスワードが同じファイルのパスワードを解除し、マクロを消すプログラムを作りたいです。
マクロを消すプログラムはマクロパスワード無しのファイルに関しては全てうまく動いています。
またエクセルファイルにはパスワードはかけていません。

過去に作ったエクセルファイルは残したままマクロを全て消せとの指令で必要となっています。
0056デフォルトの名無しさん
垢版 |
2018/12/02(日) 12:24:29.74ID:RxJGbltM
そんな大量のデータ、一行ずつ読んでたら日が暮れるぞ。
バイナリモードで開いてメモリの許す半範囲で読んで、末尾の改行までを消すの繰り返して読み込んだ方が遥かに早いよ
0057デフォルトの名無しさん
垢版 |
2018/12/02(日) 13:35:42.09ID:QrHhUpeR
100万行越えのデータは、まず複数列、複数シートを使って読み込んでみれば?
内容によっては固まって何もできなくなる悪寒しかないけど
0058デフォルトの名無しさん
垢版 |
2018/12/02(日) 17:24:20.84ID:L8bj4c7S
100万行が大量か?
それはどんな100万行かによる。
100万個の改行だって100万行だ。
0060デフォルトの名無しさん
垢版 |
2018/12/02(日) 21:09:54.29ID:V0qE8100
ユーザーフォーム上のクリックボタンが、Tabで通過する分には何も起こらないのだけどカーソルキーで通過するとチェック入るのだけど、コード書いて制御するしかない?
0062デフォルトの名無しさん
垢版 |
2018/12/03(月) 00:04:08.66ID:X8MytAwB
EXCELのVBA使いたいのですが
どうやったら起動できますか?
最初からEXCELにソフト入ってるんですか?
0064デフォルトの名無しさん
垢版 |
2018/12/03(月) 07:02:37.21ID:F098t6Ls
>>61
すみません、チェックボックスでした
0066デフォルトの名無しさん
垢版 |
2018/12/03(月) 23:49:02.49ID:Ks+qj00w
フランス政府からマクロン消したら市民が泣いて喜ぶよね
ありがとうございます
0069デフォルトの名無しさん
垢版 |
2018/12/04(火) 09:00:31.20ID:F519qlgb
"ab","bc","c
d"
みたいなcsvがあり、これを処理速度重視で読み込みたいんですがなにかいい方法無いですかね
なんか配列操作で計算、集計して最後シート出力すると早いと思うので配列に入れたいんですが1行ずつの読み込みだとうまく行かずで困ってます
fsoで全文読んでも改行されてますし…
0070デフォルトの名無しさん
垢版 |
2018/12/04(火) 09:15:39.52ID:TjlcF2tR
>>69
めんどそう
そんなんじゃ " のエスケープとかも考慮しなきゃいけないんでしょ?

だけど気合い入れてアルゴリズムごりごり実装するのを勧める
0071デフォルトの名無しさん
垢版 |
2018/12/04(火) 09:18:52.95ID:FU2ewWox
>>69
ボトルネックがFile I/Oならバイナリで全部読んでコンマでsplit
ただし文字列変数の限界は2GBなのでファイルサイズに注意
0072デフォルトの名無しさん
垢版 |
2018/12/04(火) 12:54:59.46ID:HOLQGFa9
どうでも良いけど1レコードの定義をちゃんとしないと膨大なカラムの1レコードデータになっちまうぞ。

バイナリ読み込みでやるのは確かに早いんだが、そこを気にする程のデータ量なのかなあ。
この間の100万行デ―タもサンプル作って読み込んだら10秒とかだったぞ。
0073デフォルトの名無しさん
垢版 |
2018/12/04(火) 13:26:11.27ID:F519qlgb
全文読んだ後にレコード単位に分けてカンマ区切りで分けてーをしっかりアルゴリズム書くて感じですかね
そこそこ面倒臭いですねこれ
0074デフォルトの名無しさん
垢版 |
2018/12/04(火) 13:31:22.51ID:nDNFtNox
セルコピーでValudatonの中身までコピーする方法ってありますか?
愚直にコピーすると設定したプルダウン情報が消えてしまいます
0077デフォルトの名無しさん
垢版 |
2018/12/04(火) 23:45:07.95ID:foGY0MAA
外部のExcelマクロを呼び出し、その処理の中でMsgBoxが表示された場合、それを呼び出し元で認識する方法はありますか?
Msgboxを操作したいとかではなく、表示されたということがわかればいいです
0079デフォルトの名無しさん
垢版 |
2018/12/05(水) 08:11:01.31ID:j7wcFAGs
>>77
外部のExcelマクロというのが別プロセスのExcel上で動いてるマクロという意味なら方法はある。

内部でもExcelが落ちる可能性を承知するならある。
0080デフォルトの名無しさん
垢版 |
2018/12/05(水) 18:51:03.67ID:cxhucZsa
>>78,79
APIでの実現方法がよくわからなかったので、呼び出されるマクロに認識用のモジュールを追加することにしました
ありがとうございました
0081デフォルトの名無しさん
垢版 |
2018/12/05(水) 22:21:05.50ID:LTu8VXCT
>>76
自己レス
adodbも面倒臭かったacces無いんでcsvのデータ型判定の為にschma.iniみたいなの作る必要あったり…
元の文字コードとかbomとか考慮しないといけないけどworkbookのopen使ってマズかったらエラー出した方が早かったかも
0084デフォルトの名無しさん
垢版 |
2018/12/07(金) 08:39:50.57ID:a2+Odvtp
普通にOpenしてLine Inputした方が速くて簡単だったんじゃない?
と思ったら文字コード?BOM?

最初の質問は何だったのか。
文字コード考えなきゃならんのなら、
最初から選択が限られるだろ。
0088デフォルトの名無しさん
垢版 |
2018/12/08(土) 10:23:21.41ID:qbpmcynn
この手のことはだいたい同じ事を先に考えている人がいるから、
参考にするなりDLして利用するなりすれば、やりたいことは秒で完成させられる
理解するのはまた別で、ちゃんとソース読めな話になるけど。

たとえば、「VBA CSV BAS」でググって即出るヤツだとこんなとか。
ttps://github.com/sdkn104/VBA-CSV
0089デフォルトの名無しさん
垢版 |
2018/12/08(土) 11:33:49.23ID:KOgxZmAl
Range("C1:C10") = "=A1+B1"
とセルに式を埋め込むと自動で A2+B2、A3+B3 とやってくれますが
WorksheetFunctionで上と同じ事を1行で簡単に書くことってできますか?
うまい方法思いつかないのでいつも 関数埋め込み→値貼り付けで式を消す とやってます
WorksheetFunctionのループは式の埋め込みより遅かったです
0090デフォルトの名無しさん
垢版 |
2018/12/08(土) 15:59:33.39ID:/nD5g8zA
>>89
わざわざVBAを使って、最後に値貼り付けするぐらいなら、俺ならVBAで計算して結果だけ書き込む
For r = 1 To 10
  cells(r, 3) = cells(r, 1) + cells(r, 2)
Next

式がワークシート関数バリバリでVBAで再現するのが面倒なら、最後の値貼り付けをVBAで書く
set r = Range("C1:C10")
r.Copy
r.PasteSpecial Paste:=xlPasteValues
0094デフォルトの名無しさん
垢版 |
2018/12/08(土) 19:19:47.59ID:I01ncySI
ワークシートか配列へ代入したり配列をワークシートに直接貼り付けたりって技いつ頃から一般的になった?
なんか20年前からやってたという人がいて本当かよと思ったんだが。
0095デフォルトの名無しさん
垢版 |
2018/12/08(土) 20:28:45.94ID:/nD5g8zA
>>94
特定の個人が知ってたのと、一般的かどうかなんて全然関係ないじゃん
ExcelもVBAも20年以上前からあるんだし、知ってても不思議じゃない
0096デフォルトの名無しさん
垢版 |
2018/12/08(土) 20:53:05.77ID:dkUbxCqg
>>95
ああごめんなさい
「そんなの20年前から一般的だったよ」みたいなニュアンスで言われたんですよ。
自分としてはここ2〜3年で知られた新しめのテクニックだと思ってたんで、「マジか?」と。
0097デフォルトの名無しさん
垢版 |
2018/12/08(土) 21:00:40.14ID:/nD5g8zA
20年前のことは知らんけど、さすがにここ2〜3年てことはない
もっと昔から知られてた
0098デフォルトの名無しさん
垢版 |
2018/12/08(土) 21:04:04.90ID:Ac8D4eVv
>>97
ですね。

そもそもいちいちセル移動して操作なんて、トロくさくてやってられん。

Google Apps Scriptなんかでも配列で操作なんて、速度稼ぐ為に普通に使う枯れたテクニック。

あまりにもセル操作という初歩だけが広まった弊害だね。
0099デフォルトの名無しさん
垢版 |
2018/12/08(土) 21:07:43.53ID:KOgxZmAl
A いつも自分がやっているやり方
Range("C1:C10000") = "=A1+B1"
Range("C1:C10000").Copy
Range("C1:C10000").PasteSpecial Paste:=xlPasteValues

B 90案
For r = 1 To 10000
Cells(r, 3) = Cells(r, 1) + Cells(r, 2)
Next

C 92案
Range("C1:C10000").Formula = "=A1+B1"
Range("C1:C10000").Value = Range("C1:C10000").Value

D 配列 
計算元の配列= Range("A1:B10000")
For i = 1 To 10000
計算結果格納配列(i, 0) = 計算元の配列(i, 1) + 計算元の配列(i, 2)
Next i
Range("C1:C10000").Value = ans

E 半分配列
For r = 1 To 10000
計算結果格納配列(r, 0) = Cells(r, 1) + Cells(r, 2)
Next
Range("C1:C10000").Value = ans

A0.035
B0.265
C0.031
D0.015
E0.062
0100デフォルトの名無しさん
垢版 |
2018/12/08(土) 21:09:26.57ID:KOgxZmAl
時間(秒)
A 0.035
B 0.265
C 0.031
D 0.015
E 0.062

配列は頭がごちゃごちゃして苦手なんだけどやっぱ配列かなー
いつものは書くのが楽だけど見栄えがあんま良くない
Range("C1:C10000") = "=A1+B1"の部分を数式残さずWorksheetFunction一括で書けないかなーと思ってた
みなさんどうも
0104デフォルトの名無しさん
垢版 |
2018/12/08(土) 23:21:36.60ID:Q+l9Re6e
>>102
あーなんかいいのがあったはずだと思っていたがEvaluateかーー
くやしいから
Range("c1:c10") = [a1:a10+b1:b10]
0105デフォルトの名無しさん
垢版 |
2018/12/09(日) 07:19:28.94ID:Pe0BknB8
データを蓄積、変更して管理するシステムをVBAで作るとして、普通、データとプログラムを分けるよな?
0106デフォルトの名無しさん
垢版 |
2018/12/09(日) 08:55:53.41ID:BPsncq85
>>105
分けるけど、わざわざそういう質問するってことは現状データをBookに蓄積先してる状況なのかな?
入出力画面をExcel & VBAで作って、データはDBに蓄積するってのがこの場合の模範解答だと思うが。
0107デフォルトの名無しさん
垢版 |
2018/12/09(日) 21:01:53.98ID:F2zjByp1
>>94
配列数式ってのは大昔からあったな。エクセルはVBA書かないと標準機能ではクロス集計が
面倒くさいダメダメ君だった。「条件付き合計式ウィザード」なんていう冴えないシロモノに失望して
0108デフォルトの名無しさん
垢版 |
2018/12/10(月) 12:24:50.65ID:F1/sCBz9
>>96
おまえが2〜3年前に知ったからってなんで勝手に一般化して皆そうだと思うんだよ
0109デフォルトの名無しさん
垢版 |
2018/12/11(火) 08:00:45.59ID:VzVuR/sH
みんな、落ち着いて聞いてくれ。
間も無く2019年だ。2019だぞ?
配列に突っ込んで一括処理するのは、少なくともEXCEL98から使われてきた手法だ。
既に20年経過してやがる。
0111デフォルトの名無しさん
垢版 |
2018/12/11(火) 08:41:05.40ID:mN+cBX2v
空白行が複数ある範囲から、空白行を除いて配列に取り込むのはどうやるのが効率がいい?
条件
・行内は完全に空白かそうでないかで中途半端にデータが入ってるところはなし
・空白行を除いたデータ総数は300前後で最大で16程度に分割されている
・空白行は連続することもある

一行一行調べるより、データの塊の上下の行番号を調べるのが正解な気がするんだけど
0112デフォルトの名無しさん
垢版 |
2018/12/11(火) 08:55:39.61ID:OAAPkOpt
>>111
そのデータがワークシート上にあるんなら、オートフィルターかければ?
VBAで1行で書けるぞ
0113デフォルトの名無しさん
垢版 |
2018/12/11(火) 09:27:01.56ID:zUaOIyWC
>>111
> データの塊の上下の行番号を調べる
それ一行一行調べないとわからないんじゃね?

普通に一気に配列に読み込んで空白行を詰める処理を入れればいいかと

>>112
フィルタ掛けた結果を一気に配列に読み込むってできたっけ?
0114デフォルトの名無しさん
垢版 |
2018/12/11(火) 11:43:07.63ID:U/EFAptV
>>109
fjだかのExcel会議室では配列がホットな話題になったよ
t.Tanaka氏とかもコテハンで議論に参加してさ
なつかしいなあ
0117デフォルトの名無しさん
垢版 |
2018/12/11(火) 14:13:54.04ID:mN+cBX2v
>>113
下からCtrl↑で止まったセルの行番号を取得するを繰り返せば毎行調べなくて済む

オートフィルターで絞った結果を可視セルだけ選択しても、取り込まれるのは左上だけになるから無理だね
一行一行調べる羽目になる
やるなら作業シート作ってコピペしてから取り込むんだけだ、それはやりたくない訳で
0118デフォルトの名無しさん
垢版 |
2018/12/11(火) 14:39:45.96ID:zUaOIyWC
>>117
> 下からCtrl↑で止まったセルの行番号を取得するを繰り返せば毎行調べなくて済む
それはそうだけど速いかどうかは状況次第だね
>>112 > VBAで1行で書けるぞ
って方法があるみたいなことを書いてるので聞いただけ
0119デフォルトの名無しさん
垢版 |
2018/12/11(火) 20:47:54.18ID:r2my7w49
>>118
元々、どういう考えで>>112が言ったのかは分からんけど、配列に取り込むまでを1行って言ってたのかなあ。
オートフィルタをかけるコードが1行という意味じゃないかな。

だからといって、そこからどうするんだ?とは思うけどさ。
0120デフォルトの名無しさん
垢版 |
2018/12/11(火) 21:00:32.57ID:zUaOIyWC
>>119
元々は
>>111
> 空白行が複数ある範囲から、空白行を除いて配列に取り込むのはどうやるのが効率がいい?
なので、フィルターだけの事を言われても…
0121デフォルトの名無しさん
垢版 |
2018/12/11(火) 21:34:59.21ID:OAAPkOpt
クリップボード経由でデータを一気に取得、オートフィルタにも対応
※最小設定FM20.DLLが必要
Sub Macro1()
  ActiveSheet.Range("A1:C10").Copy
  With New MSForms.DataObject
    .GetFromClipboard
    str = .GetText
  End With
  MsgBox str
End Sub
0123デフォルトの名無しさん
垢版 |
2018/12/11(火) 21:40:19.21ID:r2my7w49
>>120
そりゃそうだけど、>>112を読む限り1行ってのはオートフィルタだけについて言ってるように受け取る方が自然じゃん。
だから、そこからどうするんだという感想になるわけ。
そもそも>>112は配列に取り込むことなんて想定してないかもしれない。
空白があって見にくいのを何とかしたいんだろうとか、勝手に先読みして配列に取り込むという元のお題をほったらかしとか。

そもそも300行程度のデータならどんな方法でも良いんじゃないかと思う。
そんなんで思い悩むのは無駄だよ。
0126デフォルトの名無しさん
垢版 |
2018/12/11(火) 22:53:52.01ID:8DZhL+mg
それこそVariant型配列にでもぶっ込めば手っ取り早いし処理もそれなりに速そう
0127デフォルトの名無しさん
垢版 |
2018/12/11(火) 23:25:52.21ID:mBAHWwo2
UI Automationのレイトバインドって、どうやればいいんでしょう?
レジストリ調べてもクラスID出てこないし・・。
0133デフォルトの名無しさん
垢版 |
2018/12/12(水) 12:29:40.76ID:4PEjGm8G
>>132
どこから日本語とか出てくるんだろう?
日本語ができないという自覚はあるってことなのか? w
0134デフォルトの名無しさん
垢版 |
2018/12/12(水) 19:01:00.09ID:pifCGzoS
グラフ作成マクロ作ったんだけど結構面倒くさくない?慣れの問題?
特に細かなフォーマットとか云々がめんどい
それに出力シートのセルいじられて(1行目削除)出力セルがズレたせいでフォーマット崩れたとか言われて頭痛いんだけどどう対処するのが良いのこれ
0135デフォルトの名無しさん
垢版 |
2018/12/12(水) 20:01:12.49ID:K6Ng+wlm
使用方法まとめたドキュメント作ってないなら作成者が悪い。
作ってるなら碌に読まないで文句いってる使用者が悪い。
作り方次第で解決するとは思うが。
0137デフォルトの名無しさん
垢版 |
2018/12/12(水) 22:32:28.50ID:3KU1fzXl
>>134
逃げる。
いや、マジで。
フォーマットを壊す人ような人の依頼を受けると碌なことない。
どうしてもやらなきゃダメなら、
ちょっとでも崩れたら、エラーメッセージが出るようにする。
あなた壊しましたね。直さないと出力できませんよ的な。
0141デフォルトの名無しさん
垢版 |
2018/12/13(木) 12:28:02.78ID:yiVhwKQv
>>140
> 人の話が理解出来てないから
既にガイジかよって指摘されてるだろ w

そもそも配列に取り込むという要件明記されてるのにオートフィルターなら1行で書けるとか頓珍漢にも程がある
■ このスレッドは過去ログ倉庫に格納されています

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