X



Excel VBA 質問スレ Part58

■ このスレッドは過去ログ倉庫に格納されています
0005デフォルトの名無しさん
垢版 |
2018/11/22(木) 09:37:41.30ID:ZIGZU+Kk
>>1
=LEFT("おつかれあかたあまや",4)
0008デフォルトの名無しさん
垢版 |
2018/11/23(金) 09:01:48.81ID:pYaMx0la
ややExcelと離れるのですが、他に適切な場所が見当たらないのでこちらで質問。

WordやPowerpointに、埋め込み、またはリンクで表示されているExcelの表やグラフについて、
1:ファイル名(フルパス、ないし相対パス)
2:表示されているシート名(またはシート番号)
3:表示されている表の範囲(A1からB20まで、みたいな)
を、WordやPowerpointで動かすVBAから列挙する、みたいなのを作りたいと考えてます。

(1)についてはある程度(たまに取れないのがある)なんとかなるのですが、
(2)と(3)の手段が分からないでいます。
この辺を得る手段について、ご存じの方いましたら教えてください。
0009デフォルトの名無しさん
垢版 |
2018/11/23(金) 10:13:26.49ID:NlhnMW/X
表示されているシート名 って要は現在アクティブなシートってことでしょ?
ActiveSheet.Nameで取れるんじゃ?
0010デフォルトの名無しさん
垢版 |
2018/11/23(金) 11:15:52.26ID:OdmoxaxG
>>8
やったことがないから保証できないが、
OLEObject.ObjectプロパティからOLEオブジェクトのコントロールを取得できるはず
ここからExcelのオブジェクトモデル経由でシート名等は取れるかも
00118
垢版 |
2018/11/23(金) 11:27:11.08ID:pYaMx0la
>>9,10

 そういえば、シート名はそれで取れますね。うっかりしてました。
ただ、Powerpointで表示されている、シート上の範囲( >>8 の(3) )がマジわからん。
ActiveSheetまでは到達出来るので、シート全体のデータは取れるのだけども、
表示範囲となるとどこを見れば良いのやら……
0012デフォルトの名無しさん
垢版 |
2018/11/23(金) 16:52:45.93ID:NlhnMW/X
表示範囲っての意味がよく判らない。使用されている範囲ならUsedRangeプロパティだけどそうじゃない?
0013デフォルトの名無しさん
垢版 |
2018/11/23(金) 18:46:47.55ID:A5v+c7Q3
QueryTables.addを利用して取り込んだテキストデータを
TextFileFixedColumnWidths = array(5,4,2)
とVBソースに記述して5、4、2バイト目で区切ってエクセルに貼り付けしているのですが、
このarrayのカッコ内の値5,4,2の部分を1つのセル内に定義しておき、そこから取得して処理する方法を教えてください。(セル値を変えるだけで区切りバイトを変えられるようにしたいです)
セル内の定義は下記のような感じの形式で実現できたらいいなと思っています。
5,4,2
または
"5","4","2"
など
よろしくお願いします。
0014デフォルトの名無しさん
垢版 |
2018/11/23(金) 18:47:07.61ID:pYaMx0la
>>12
UsedRangeは、まさに「Excel上で利用されている範囲」になるので、ちょっと違う。

探しているのは、(WordとかPowerpointとか) 「被貼付側から見えている範囲」。
コピペを行うときにExcel上で範囲指定してる、まさにその範囲の情報が欲しいのです。
『広い範囲が使われているシート(埋め込みオブジェクト)の一部分だけが表示されている時、
 その表示部分を特定する』がやりたいの。
0015デフォルトの名無しさん
垢版 |
2018/11/23(金) 20:29:14.68ID:SJrbhhQk
>>13
3つパラメータがあるならそもそも3つのセルで管理すればいいんじゃないかと思うが、区切る回数も動的にしたいのかな?

パラメーター記述用のセルに5,4,2と入力しておいて、コード内でSplit関数を使いそのセルの値をカンマ区切りで配列化するのが普通かな

そうやって得たString配列の要素全てをCIntで型変換してInteger配列に入れ直せば、TextFileFixedColumnWidthsプロパティに代入できる
0018デフォルトの名無しさん
垢版 |
2018/11/26(月) 18:21:38.61ID:jE4mmGCd
ユーザーフォームのボタンでExcel以外のファイルを開くのにShell.Execute使ったんだけど、ボタンを押しても何も反応しない

CreateObject("Shell.Application").ShellExecute "c:\test\test.pdf"
0021デフォルトの名無しさん
垢版 |
2018/11/26(月) 20:06:27.80ID:c8QT25Tm
検証ありがとう!
ちな標準モジュールに書くと普通に動く。
どうもユーザーフォームに書くとダメみたい
0023デフォルトの名無しさん
垢版 |
2018/11/26(月) 22:08:01.92ID:sSO4v+r+
ユーザーフォーム作ってボタン配置してボタンのOnClickにコード書いたけど問題ない
0024デフォルトの名無しさん
垢版 |
2018/11/26(月) 22:25:28.75ID:c8QT25Tm
みんなマジか〜
環境は2010、2007ともにダメだった。
明日2016で試してみる。
ちなみにパスがフォルダ指定までなら動く。
もう意味わからん
0025デフォルトの名無しさん
垢版 |
2018/11/26(月) 22:57:14.49ID:sSO4v+r+
>>24
もしかしてpdfをダブルクリックした時に「このファイルを開くアプリ」の選択メニューが出てない?
0026デフォルトの名無しさん
垢版 |
2018/11/27(火) 08:58:52.14ID:TmwvOLJp
>>25
すまぬすまぬ。実は開かないのは.xlsxや.xls。
さっきやったら.txtや.bmpに書き換えるとちゃんと動いた。関連付けがおかしいかと思ったけどファイルダブルクリックでexcelファイルは開く。
0029デフォルトの名無しさん
垢版 |
2018/11/27(火) 21:03:19.26ID:JHhXTC3j
>>26
VISTA32ビットのEXCEL2007で再現した
ちなみにブレークポイントはってステップインさせたらちゃんと動いた
0030デフォルトの名無しさん
垢版 |
2018/11/28(水) 21:03:32.22ID:btdWGy6U
切り取り・コピーしようとしたら「クリップボードを開くことが」と表示されました 前までは正常に出来てたのに急にあんなになるなんて
どうしたらなおるんですか

原因不明の謎の症状
003130
垢版 |
2018/11/28(水) 21:11:36.27ID:btdWGy6U
>>30のところ、再起動したら直りました
自己解決
0032デフォルトの名無しさん
垢版 |
2018/11/28(水) 21:55:41.99ID:6iHSQiFE
WorksheetFunctionを使うと遅くなると聞きました。セルで計算して取得したほうがいいですか?
0034デフォルトの名無しさん
垢版 |
2018/11/28(水) 23:27:06.65ID:6iHSQiFE
>>33
ありがとうございます
0035デフォルトの名無しさん
垢版 |
2018/11/30(金) 08:07:23.94ID:yuW+a+er
workbook.Aのマクロから、workbook.Bのマクロパスワードを解除できますか?
*パスワードは分かっています
**windows10 / excel 2016

同じパスワードをかけた大量のファイルのマクロパスワード解除が必要になった為
0037デフォルトの名無しさん
垢版 |
2018/11/30(金) 08:53:39.83ID:yuW+a+er
>>36
ありがとうございます。

VBAでsendkeyでパスワード入れたいのですが、プロジェクトエクスプローラーのウィンドウで、目的のworkbook.Bを選択してパスワードウィンドウを開く事がうまくできないところです。
0038デフォルトの名無しさん
垢版 |
2018/11/30(金) 09:06:54.20ID:cHj05URw
>>37
いや、Sendkeysは絶対使っちゃいかんものNo.1だろ。
制御出来ないからな。
わかってて一過性のプログラムで使う以外に使うことは無い。
0042デフォルトの名無しさん
垢版 |
2018/11/30(金) 18:57:50.86ID:cHj05URw
そもそもマクロパスワ―ドってことはVBEを弄ることになるから普通はセキュリティ設定に引っかかる。

VBAでVBEを弄れる設定になってるなら、参照設定でVisualBasic for Applications Extencibilityを追加して頑張ることになるわけだけどセキュリティ皆無となって危険だぞ。

それにそのコードがウィルス判定されるかも。
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一括で書けないかなーと思ってた
みなさんどうも
■ このスレッドは過去ログ倉庫に格納されています

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