Excel VBA 質問スレ Part33
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2013/10/17(木) 22:04:40.64___
___ /____ヽ ____
/____\ | |´・ω・`| | /___ヽ
.l |´・ω・`| ニX二 . ̄ ̄ ̄ 二X二 |´・ω・`| l 俺たちに任せろ
!、 ̄ ̄ ̄ ヽ | | /  ̄ ̄ ̄/
ヽ_/ヽ、 ヽ__) \__/\_/. /_/ ノヽ_/
 ̄  ̄ ̄
前スレ
Excel VBA 質問スレ Part32
http://toro.2ch.net/test/read.cgi/tech/1381151717/
このスレはコード書き込みOKです。
作成依頼もOKですが、作成依頼限定ではありません。
コードが嫌な人はこちらのスレへ
http://toro.2ch.net/test/read.cgi/tech/1381151995/l50
0557デフォルトの名無しさん
2014/05/28(水) 19:51:40.59ID:6RxarYIUVBA以外の言語とデータをやり取りするにはどうすれば良い?
0558デフォルトの名無しさん
2014/05/28(水) 20:35:31.75ID:aALl0WxcVariant型はExcelやVBAだけで使える型じゃなくてWindowsシステム全体で定義されてるんで
たいていの言語でそのまま扱うことができる
0559539
2014/05/28(水) 21:11:33.80ID:tkho5s2n詳しい解答ありがとうございました。
非常に分かりやすかったです。
描くのは直線だけでなるものなので業務の時間を短縮できるのかなと。
あとはCADソフト側の命令の仕方ですね、頑張って探してみます。
ありがとうございました。
0560デフォルトの名無しさん
2014/05/28(水) 23:52:38.39ID:am2JQYojあるセル範囲を選択してて
その中にあるセルで
(1) 空白なら除外する
(2) 同じ値があれば1つを残して他は除外する
の操作をしたあと
各セルの値をString型の配列変数として入れる
こういうコードを書けばよいよ
要件定義が甘いが、どこがわからんかわからん
0561デフォルトの名無しさん
2014/05/29(木) 00:20:40.78ID:pIxlUzsMDictionary使うのはどう?
Existで調べて、無かったらAdd
これを繰り返して最後にString型の配列変数に入れる
0562デフォルトの名無しさん
2014/05/29(木) 00:22:14.59ID:pIxlUzsM× Exist
○ Exists
0563デフォルトの名無しさん
2014/05/29(木) 08:48:17.68ID:/DaeRAwKDoEvents
Sleep (100)
Loop Until flag = True
な無限ループをイベント監視用にユーザーフォームで走らせているんですが,
フォームのタイトルバーを捕まれるとループが止められてしまいます。
ループ用にvbModelessなフォームをHiddenで隠して回しても,
他のフォームのタイトルを捕まれると止まってしまいます。
タイトルを捕まれてもマクロが止まらなくなる方法ってありますか?
0564デフォルトの名無しさん
2014/05/29(木) 12:02:11.02ID:Amp5ddSEありがとうございます。
あなたはこのスレにときどき登場するDistionary厨のかたですね?
これを機会にDisctionaryの使い方を理解してマスターしようと思うのですが
いいサイトか本はないでしょうか?
0565デフォルトの名無しさん
2014/05/29(木) 14:29:26.90ID:sq7Ykhg/残念ながらExcelVBAはマルチスレッドに対応しておりません
というか、止められると言っても、終了してしまうのではなく中断するだけだろ?
タイトルバーを掴んでいる間さえも中断しちゃまずいって、いったい何を監視しているやら?
それに、ユーザーフォームの移動なんて、そう頻繁に行うことでも、長時間行うことでも無いじゃん
それとも、自分が使う物ではなく他人が使う物で、タイトルバーを掴んだままにすることで
意図的に監視を一時停止出来ちゃうと困るとかなのかな?
だとすれば、パス掛けたところで簡単に破れて、ソース弄れば監視の無効化も、もっと簡単に
一時停止できるようにすることも可能なVBAでそういうものを作ること自体が不適切
それに、タートルバーを掴んでいる間、つまりExcelの操作をしていない間も監視が必要って事は、
監視対象はExcel上のものではないんだよね?
だとすると、その辺に別の対処法の突破口があるかもしれないな
0566デフォルトの名無しさん
2014/05/29(木) 15:11:02.01ID:dLhscPPSSleepを消せば少し改善されると思う
空のループはDoEventsだけで十分
0567デフォルトの名無しさん
2014/05/29(木) 15:20:33.17ID:mJj+KV4g0568563
2014/05/29(木) 17:38:29.96ID:/DaeRAwKやりたいことは測定器からのデータ取得(GPIB)で,2秒に一回のイベントを監視する目的です。
具体的には AD変換完了のイベント発生 -> 測定値の取得コマンド発行 -> 測定値の転送
という流れで,イベントが発生したら2秒以内に「取得コマンドの発行->転送」をしないと
データを取りこぼしてしまいます。
そこで,フォーム(中断イベント発生用ボタンを表示)がじゃまだと画面の脇によける動作をすると
ループが止まって取りこぼすので困っておりました。
その後,WindowsAPIのSetTimer/KillTimerを試しまして,今回の目的(2秒)なら
行けそうな感じで収まりました。
>>566
>>567 のとおり,つかんでいる間は帰ってきてくれないようです。
0569デフォルトの名無しさん
2014/05/29(木) 18:03:06.09ID:mJj+KV4gそれで空ループまわして待つ意味がわからんし、時間制限があるのに変換完了イベントから
取得コマンド発行までの間でDoEventsする必要もわからん
0570デフォルトの名無しさん
2014/05/29(木) 19:47:40.83ID:sq7Ykhg/そういうのは普通、測定器→ローカルデータ、ローカルデータ→Excelって二段構えでやるもんだよ
ユーザーフォームのタイトルバーを掴む意外にも、ループが一時停止される要素はあるし
Excelのエラーで強制終了して再立ち上げするにも、2秒以内じゃまず無理なので取りこぼしが出る
だからまずはデータをローカル(HDD)に保存するってことだけに専念したアプリやスクリプトを走らせて
それが保存するローカルデータをExcelで監視するってのが常套手段
それなら、Excelの監視が止まっている間にイベントが2回発生しようと3回発生しようと
HDDにはその2回なり3回分なりのデータが保存されたままになるから、後からいくらでも読み出し可能
0571デフォルトの名無しさん
2014/05/29(木) 19:57:52.53ID:dLhscPPSリアルタイムで処理する必要があるかどうかは知らんが
リアルタイム性が必要なければファイルにCSV保存して、あとから加工なり分析なりすればええ
0572デフォルトの名無しさん
2014/05/29(木) 21:38:45.66ID:pIxlUzsMDictionaryでググレばいいと思うよ
俺もそうした
0573デフォルトの名無しさん
2014/05/29(木) 22:25:02.22ID:MJP51S+khttp://www.moug.net/tech/exvba/0150128.html
お聞きしたいのは、参照不可となった原因です。あと、参照不可となっていたライブラリのチェックを外すことで今後問題が起きないのか?ということです。
ちなみに、開発環境と実行環境は同一のPC1台のみです。よろしくお願いします。
0574563
2014/05/30(金) 08:43:27.05ID:VsNT1DP0イベント=グローバル変数のビットが立つだけでなので,
単純にループを回し続けてグローバル変数を確認し続ける処理となってます。
また,DoEventsは中断/終了処理のためにフォームのボタンを押す必要があるためです。
>>570,571
CSVを吐かせるのが一番容易ではあるんですが,他者がメンテするときに開発環境等
構築の必要がないVBAのみで完結させたいなというのがありまして。
0575デフォルトの名無しさん
2014/05/30(金) 09:28:42.64ID:ztZ/Ok0F悪い事は言わん、計測器関連はVBAでやるの止めとけ
今はVisualStudio Expressもあるし、無料で環境構築できるんだから、
Excel に拘らない方が良い
どっちかつうと、VB側からExcel吐き出しする方が経験上楽で確実
0576デフォルトの名無しさん
2014/05/30(金) 09:34:30.18ID:tZceHJTB0577デフォルトの名無しさん
2014/05/30(金) 10:03:47.61ID:gm611zV10578デフォルトの名無しさん
2014/05/30(金) 15:23:03.23ID:g1Pwsqem>単純にループを回し続けてグローバル変数を確認
グローバル変数セットするときにイベント起こすなり特定プロシジャ呼ぶなりすれば良い話
ループで変数監視とかどう考えても設計がおかしい
>DoEventsは中断/終了処理のために
変換完了イベントから取得コマンド発行までの間は中断できないようにすれば良いだけ
要求される仕様にもよるけど設計がおかしい
0579デフォルトの名無しさん
2014/05/30(金) 15:38:13.41ID:g1Pwsqem>参照不可となった原因
たとえば参照設定されていたプログラムをアンインストールしたら当然参照不可能になるわな
お前のPCに起こった事がそれだけの情報でわかるわけがないだろう
>今後問題が起きないのか
お前のプログラムが何をどうやってたかわからんのに、わかるわけがないだろう
コンパイルしてみてエラーが無いようなら、一応問題が無いと言えるかもしれんが
ライブラリの中身が変わって参照設定が無くなってたりしたら、そのライブラリに
互換性の問題があったりするかもしれん
0580デフォルトの名無しさん
2014/05/30(金) 15:45:03.61ID:9Pr1vy7p「設計が不適切だから、実現が困難になる」
という、初心者がよくハマる罠ですな
0581デフォルトの名無しさん
2014/05/30(金) 16:06:49.06ID:VsNT1DP0テンプレート作っておいて最終的にcom使って吐き出させるのが確実ですかね。
>>577
すみません,私の勘違いでグローバル変数が変わるのではなく,
ループ中で測定器のステータスを読みに行くコマンドを送り,
ADデータが更新されたかのフラグを自分で立てていました。
0582デフォルトの名無しさん
2014/05/30(金) 21:06:21.63ID:uIjyT6t9現在、シート1にデータの羅列を手入力しています
その後、いくらかの計算を経てシート2に転写しています
このとき、シート1は月日関係なく羅列が続いているのですがシート2は月末ごとに集計したいと考えています
↓へ続く
0583デフォルトの名無しさん
2014/05/30(金) 21:07:57.55ID:uIjyT6t9・シート1
1/1 5
1/10 3
1/25 6
1/31 10
2/3 5
2/20 2
3/2 4
シート2
1/1 5
1/10 3
1/25 6
1/31 10
----------
1月最大 10
1月最少 3
1月計 24
----------
2/3 5
2/20 2
----------
2月最大 5
2月最少 2
2月計 7
----------
3/2 4
こんなイメージです、初めは文字通り転写していたのですがそうするとあとから月末の集計を挟むとずれるのでそのあたりヒントをいただけたらと思います
0584デフォルトの名無しさん
2014/05/30(金) 21:20:31.98ID:9Pr1vy7p因みに最大の反対は最小で、最少の反対は最多な
0585デフォルトの名無しさん
2014/05/30(金) 21:36:10.28ID:e0LBlZuD転写元と転写先の行指定を同一にしないでわける。
(Row1行目をRow2行目に転写)
0586デフォルトの名無しさん
2014/05/30(金) 22:04:39.86ID:FUgryqqJ分かり易いコードだったら
シート1の上から月の変わり目まで値をシート2に代入して、
その間最大と最小と月計を求めておいて、それをシート2に書き込んだら
また次の月を処理してやればいいんだけど、
別にそんなことしなくてもピボットで行けるんじゃないかと思う。
0587デフォルトの名無しさん
2014/05/31(土) 01:24:27.59ID:BIC+yzDE全てのデータをコピーする
次にシート2へ、最大値・最小値・合計を、
後ろの行から追加していくと、
行の数え間違いが減りそう
0588デフォルトの名無しさん
2014/05/31(土) 08:16:56.63ID:Ym0wh1saそのままコピーをしても使えません・・・
互換モードで変換しても、上手く起動してくれません。
どうしたらよいでしょうか?
0589デフォルトの名無しさん
2014/05/31(土) 08:31:34.05ID:hcRtMx6V使えないってのどういう状況?
コピーって、何をどうコピーしたんだ?
それは本当に2003で作ったマクロなのか?
情報が足りなすぎて何とも言えん
エスパーするならセキュリティセンターの設定で行ける気がするが
0590デフォルトの名無しさん
2014/05/31(土) 10:11:58.90ID:0hCJmlYVエスパーすると、
信頼できる場所、拡張子(マクロ有効ブック)、参照設定、PtrSafe
あたりかなあ?
0591デフォルトの名無しさん
2014/05/31(土) 17:06:26.42ID:vfwWW6a6エクセルVBAで効果音を鳴らすにはいかにすればよろしいでしょうか?
また、画像を張ったり、消したりするにはどのようなコードを書き込めばいいものでしょうか?
0592デフォルトの名無しさん
2014/05/31(土) 17:57:42.27ID:Ym0wh1sa既にあるマクロに機能追加してもらいたいんだけど、
スキルがなくて困っています。
0593デフォルトの名無しさん
2014/05/31(土) 18:03:54.56ID:MZZ4d7NBhttp://www13.plala.or.jp/kymats/study/multimedia.html
0594デフォルトの名無しさん
2014/05/31(土) 18:15:17.55ID:xW/2bai/いまいち、理解できないっす。
要するにどういうコードを書き込めばよいのでしょうか?
そして音源はどこにあるのでしょうか?
0595デフォルトの名無しさん
2014/05/31(土) 18:24:22.00ID:6LzyMI+6翌日以降に発覚した瑕疵等は別途見積もり・請求させていたたきます
0596デフォルトの名無しさん
2014/05/31(土) 18:42:36.10ID:ROAafTCnマッチングサイトなんてググればヒットするでしょ
0597デフォルトの名無しさん
2014/05/31(土) 20:08:49.36ID:ENgUpqsfググるという発想はないの?
0598デフォルトの名無しさん
2014/06/01(日) 00:30:52.76ID:1fLVc9/2というエラー?が出て、画像が取り込めず、文字列がだーっと出る画面になるのですが
保存された画像を普通に貼り付けるにはどうすればいいのでしょうか
保存の仕方がわるいのでしょうか?
0599デフォルトの名無しさん
2014/06/01(日) 00:44:57.06ID:J9cZPePTその値段では、誰も引き受けてくれんぞ。30万出せば、金に困っている
連中の誰かは、受けてくれるだろうが。
0600デフォルトの名無しさん
2014/06/01(日) 01:56:31.76ID:4/q6rSuq君は諦めた方がいい
0601デフォルトの名無しさん
2014/06/01(日) 10:15:57.44ID:Vdytlm3J相談料 3000円 (120分以内)なら考えてもいい
0602デフォルトの名無しさん
2014/06/01(日) 10:28:28.23ID:mo4nCN9m120分3000円でいいならもうボランティアでやってやれよw
0603デフォルトの名無しさん
2014/06/01(日) 10:39:07.65ID:m+nDoAYHまず最初にここは Excel VBA質問スレ
この時点でアウト
君が相談すべきスレは、ビジネスSOFT板のExcel総合相談所 113
ちなみに注意としてExcelのバージョンとどういう操作をしたのかくらい書けよ
Excel2007(2010)だとして、挿入→図からファイルを選択すれば良いのをなんでテキストファイルウィザードなんてもんが出てくる?
0604デフォルトの名無しさん
2014/06/01(日) 12:52:54.92ID:QlI1F8zeExcel2010で、ゲーム製作をしてましてVBAで画像が自動的に出たり消えたりと言うプログラミングを
設定しているのですが、画像がうまく開かないで苦心しておりました
0605デフォルトの名無しさん
2014/06/01(日) 14:52:48.34ID:ycdnLEoXExcel2003で動いていた、グラフの書式をコピーするVBAを実行すると、
データまでコピーされてしまうようになり、困っています。
ActiveSheet.ChartObjects("グラフ 1").Activate
ActiveChart.ChartArea.Copy
ActiveSheet.ChartObjects("グラフ 2").Activate
ActiveChart.Paste Type:=xlFormats
ヘルプにはxlPasteFormatsを指定とあるので、修正してみたのですが変わりませんでした。
グラフ選択→コピー→グラフ選択→形式を選択して貼り付けの書式を選択で、
シートに対してPasteSpecialを使えば元の動きになることはわかったのですが、
もともと使っていたPasteは使えなくなったのでしょうか?
それとも使い方がわるいのでしょうか?
0606デフォルトの名無しさん
2014/06/01(日) 15:23:51.99ID:WV5hG6M3VBAでくり返し操作するときは自動保存をOFFにしたいのですが
オプション設定はVBAで操作できるのでしょうか?
0607デフォルトの名無しさん
2014/06/01(日) 17:18:12.48ID:XKcLg8fjApplication.AutoRecover.Enabled = False
0609デフォルトの名無しさん
2014/06/02(月) 18:30:40.65ID:YbWwqAFDチャートオブジェクトの横幅と高さをVBAで変更することはできますが、
グラフオブジェクトの中のグラフ表示範囲(?)を変更する方法がわかりません。
ワークシートに複数のグラフがあり、これらのグラフの横幅を揃えたいのです。
チャートオブジェクトの横幅は揃っているのですが、図中に矢印で示すグラフ表示範囲がずれてしまっています。
手動ではなくVBAで自動的に揃え直したいのですが方法がわかりません。
よろしくお願いします。
http://i.imgur.com/fSS5gf9.png
0610デフォルトの名無しさん
2014/06/02(月) 19:36:28.50ID:Qua9WhFMPlotArea.Width
0611609
2014/06/02(月) 22:43:18.89ID:QcqSJ9d9今試せる環境ではないので明日試してみます。
とりあえずググったところ下のように書いてありました。
厳密に複数グラフの横幅を揃えるのは難しそうですね。
http://www.moug.net/tech/acvba/0020000.html
プロットエリアの位置や大きさは、Top/Left/Height/Widthプロパティで設定しますが、
これらのプロパティで設定する領域は、プロットエリアの書式設定の際に参照される領域よりも大きくなります。
差が出るのは、軸/軸の目盛ラベル/データテーブルの領域分です。
これらを除いた領域の位置、及び大きさはInsideTop/InsideLeft/InsideHeight/InsideWidthプロパティで取得できますが、設定は出来ません。
したがって本来の意味でのプロットエリアの大きさを思い通りに設定するのは、非常に困難であると言えます。
0612デフォルトの名無しさん
2014/06/03(火) 14:14:53.77ID:faYSyeIqPowerPoint2013で利用する「数式」をVBAで操作したいのですが、TextFrameのどこを探してもそれらしきオブジェクトが見当たりません。。。
何かご存知の方、いらっしゃいませんか?
0613デフォルトの名無しさん
2014/06/03(火) 14:42:35.82ID:4NU/ReH80614デフォルトの名無しさん
2014/06/03(火) 15:47:32.33ID:ld0ZW2cT佐賀?何故にそんな局地的…
0615デフォルトの名無しさん
2014/06/03(火) 20:10:38.10ID:FR84HiXrPrinter.FontName = "MSゴシック"
Printer.FontName = 12
Printer.Print "hoge"
Printer.EndDoc
と同じ事をやるにはどうしたら良いですか?
シート上に文字を入力して、普通にプリントするのではダメで
プリンターの内蔵キャラセットで印刷を行うために、
プリンターに直接文字データを送りたいのです。
検索しても、VBAでシート上の印刷を行う方法を解説したものは
いくらでもありますが、テキストデータを送る方法は見あたりません
Excelのバージョンは2000と2002です。
0616デフォルトの名無しさん
2014/06/03(火) 21:31:23.24ID:DdzaYAIYLPT1とかPRNとかにPrint#で出力してやればできるかもしれん
しかし、そのコードはプリンタの内蔵キャラセットで印刷する命令でも何でもないんだが
VBAはアプリケーション操作のための言語であって、ハード制御するもんじゃないし
たとえプリンタと言えど直接ハード制御するべきではないと思うが
まずそのプリンタ(のドライバ)作ってるとこに、VBAで出力できないか問い合わせるのが正解だと思うぞ
0617デフォルトの名無しさん
2014/06/03(火) 21:33:31.35ID:4NU/ReH8プリンターポートの設定は適切に済ませてあるとして、こんなコードでプリンタ内蔵フォントで印刷できると思う
うちに環境がないから確認できないけど
Open "LPT1:" For Output As #1
Print #1, "ABC" & vbCrLf
Close #1
0618デフォルトの名無しさん
2014/06/04(水) 22:06:51.01ID:R9ObohXGPGr
0619デフォルトの名無しさん
2014/06/05(木) 11:47:07.26ID:TEbe8oH8セルのプロパティにIsVisibleみたいなのがあればいいのだけども。
0620デフォルトの名無しさん
2014/06/05(木) 12:00:18.15ID:TEbe8oH80621デフォルトの名無しさん
2014/06/05(木) 12:06:29.37ID:o3+drOXqたとえば配列変数hogeの2次元目の要素数を求めるなら
UBound(hoge,2) - LBound(hoge,2) + 1
0622デフォルトの名無しさん
2014/06/05(木) 12:07:37.43ID:TEbe8oH8ありがとうございますできました
0623デフォルトの名無しさん
2014/06/05(木) 12:11:47.42ID:TEbe8oH8もし重複する値があればそれは1つとしてまとめて
同じ配列変数に再代入するにはどうしますか?(当然要素数は重複分減る)
0624デフォルトの名無しさん
2014/06/05(木) 12:19:10.13ID:TEbe8oH80625デフォルトの名無しさん
2014/06/05(木) 13:21:45.18ID:o3+drOXq>>561
0626デフォルトの名無しさん
2014/06/05(木) 13:44:07.06ID:U+cU1pOhExcelのVBAは低機能なので、よく使う機能でも意外と入っていません
文字列の重複は自力で調べて消すしかありません
別の方法として、ワークシートにデータを全部コピーして、Excelの機能で重複を削除してから配列に戻すこともできます
0627デフォルトの名無しさん
2014/06/05(木) 15:13:50.03ID:AERMy3Ek具体的に言いますと、「あいうえお」という5種類の文字で構成される文が数行あるとして
例
あいうえお → あいう
ああいうえお → ああいう
えお
ああいいう
まず 「あ、い、う」 の文字が5個以上ある行は無視。 「あ、い、う」 の文字が一つも無い行も無視。
これで 「あ、い、う」 の数字が1つ以上、4つ以下含まれる行が絞り込まれます。(上二行のみ)
そこから 「あ、い、う」を引き抜く。
こういったことをするには、どのような関数を使えば良いのでしょうか?ご伝授頂けると助かります。
0628デフォルトの名無しさん
2014/06/05(木) 15:30:07.02ID:o3+drOXqそういうときは正規表現というのを使います。
詳しくはこの辺で
http://officetanaka.net/excel/vba/tips/tips38.htm
0629デフォルトの名無しさん
2014/06/05(木) 15:45:00.27ID:AERMy3Ek有難う御座います。
正規表現というのを学習してみたいと思います。
0630デフォルトの名無しさん
2014/06/05(木) 15:58:24.11ID:U+cU1pOhもちろんできます
条件がいくつもあるって複雑な時はユーザー定義関数を使った方がすっきりできます
Option Explicit
Function あいう$(s$)
Dim i%, aiu$, L%, t$
For i = 1 To Len(s)
t = Mid(s, i, 1)
If InStr("あいう", t) Then aiu = aiu + t 'あいうを抽出
Next
L = Len(aiu)
If 1 <= L And L <= 4 Then あいう = aiu '1以上4以下の時だけ
End Function
0631デフォルトの名無しさん
2014/06/05(木) 16:39:59.43ID:I2VjvGe/UNIX系だと、行区切りの文字列では、sort + uniq が定番
uniqは連続した重複行を、1行にまとめる
そのため、最初にsortする
>>627
正規表現なら、[あ|い|う]{1,4}
[あ or い or う]が、1回以上、4回以下
0632デフォルトの名無しさん
2014/06/05(木) 16:54:30.09ID:AERMy3Ek具体的な用例まで助かります。
他にもいくつか加えたい条件もあるので、>>630をヒントと言いますかベースに自分で定義してみたいと思います。
有難う御座いました。
0633デフォルトの名無しさん
2014/06/05(木) 16:58:50.71ID:U+cU1pOhそれだと"あいおいう"に対応できない
俺の解釈では「あいう」は不連続でも個数さえ合っていれば条件に一致する
0634631
2014/06/05(木) 18:16:58.07ID:I2VjvGe/意外に難しいわい。頭を使わせよるw
0635デフォルトの名無しさん
2014/06/06(金) 00:01:51.20ID:Yt2QH+fKCopyとかPasteを使ってると時々「貼り付けられないよ!」ってエラーが出る
このエラーはactiveSheet.Range("A1").Copyとか書いてたら高確率で出るんだけど
WorkSheet("シート1").Range("A1").Copyって感じでシート名をちゃんと指定してやると
うまく処理される
これってOffiiceの仕様か何かなの?
なんかExcel2003だけでなく2010でも似たような現象が出たんだけど
0636デフォルトの名無しさん
2014/06/06(金) 00:37:42.95ID:nBXq1INXコピー時にエラーがでるのか貼り付け時にエラーがでるのか?
ActiveSheet指定したときに、実際は何が対象になってるか確認してみろよ
実際にコピーされているものが何かも確認してみろよ
0637デフォルトの名無しさん
2014/06/06(金) 02:49:29.53ID:ufTytRJwSub test()
Dim obj As Object
Set obj = New clsName
End Sub
こんな感じで変数名とかクラス名を一般化する方法ってありますか?
0638デフォルトの名無しさん
2014/06/06(金) 05:12:25.67ID:Yt2QH+fKごめんそれで合ってる>貼り付け時にエラーがでる
.Copy後に.Pasteをしてやるとエラーが出るんだ
確認したらActiveSheetで指定しているシート名は「シート1」になってた
なぜか「ActiveSheet」と書くとダメで「WorkSheet("シート1")」と書くと
うまくいくんだよな
0639デフォルトの名無しさん
2014/06/06(金) 06:03:40.15ID:2p7Hju+q未確認だけど
.Copy
DoEvents
.Paste
でうまくいく場合もあるっぽいよ
どうもCopyメソッドはシステムに処理を投げたあと、完了する前に次に進むっぽい
だからクリップボードのアクセスがかち合ってPasteで失敗する
0640デフォルトの名無しさん
2014/06/06(金) 10:38:05.93ID:pY4qYt1Mテキストボックスを多数使うので、クラスとコレクションを使って疑似コントロール配列ししようとしたところ
Private WithEvents TextBoxControl As MSForms.TextBox
の宣言では、BeforeUpdateイベントが使えません。
(他にもAfterUpdate、Enter、Exitイベントが、ユーザーフォームモジュールでは使えるのにクラスでは使えない)
この型でユーザーフォームのテキストボックスを代入することは出来ますし、Changeなどのイベントは取れるのですが
クラス内でBeforeUpdateイベントを取得するには、どうすれば良いですか?
0641デフォルトの名無しさん
2014/06/07(土) 03:36:29.21ID:Jb4BFO2Lそんなもんない
0642デフォルトの名無しさん
2014/06/07(土) 05:13:53.67ID:lWh6G2t5リフレクションのことを言ってるのかな。
なら、残念。クラスや変数には存在しないな。
ただ、関数だったらスレチになるけど、API、Addressof、コールバックあたりでググれば
幸せになれるかもしれないしなれないかもしれない。
0643デフォルトの名無しさん
2014/06/07(土) 05:48:21.20ID:iV9P9+UY今は3つですが今後増える可能性があります。
A個の変数を宣言することができるのでしたら汎用性が高まるのですが可能ですか?
(例:A=5ならArray_1、Array_2、Array_3、Array_4、Array_5の5つを宣言する)
今は2次元の配列を3次元にすることも考えたのですが、
今のコードでは、2次元配列はWorksheetFunction.Max(Array_1)のような
配列を処理できる関数に突っ込まれていたりして2次元を3次元にすると色々問題が出てきそうです。
どのように変数を宣言したらよいのかがわかりません。アドバイスをお願いします。
注)今ある3つの2次元配列サイズは(1 to 50, 1 to 50) as Doubleです。今後変数が増えたとしても、各変数は2次元で50×50で同サイズです。
0644デフォルトの名無しさん
2014/06/07(土) 06:21:36.64ID:lWh6G2t52次元の配列宣言をクラスで行うようにして、
そのクラスを生成したものをコレクションなりディクショナリなりに突っ込んで
使えばいいんじゃないかな。
多分、3つどころか1つで済むとおもうよ。
0645643
2014/06/07(土) 06:39:19.09ID:iV9P9+UYレスありがとうございます。ただ、クラスとかコレクションとかディクショナリとか難易度高いです。レスの内容が理解できません。
クラスについては、メソッドやプロパティをオブジェクトに実装させるための設計図?というぐらいの知識しかありませんし、
ディクショナリは重複のない組み合わせを得るのに何度か使ったことあるぐらいです。
クラス内で配列を宣言?クラス内なら変数Aの数だけ配列を宣言できるということ?
プロシージャ内で宣言するのとどう違う??宣言した変数は引数として渡す?それともPublic変数?
わからないことだらけです。調べてみます。
0646デフォルトの名無しさん
2014/06/07(土) 08:02:44.68ID:DbL3YGfr難しく考えず、配列の配列でいいんじゃないか
Variantの配列作ってそれに突っ込め
0647デフォルトの名無しさん
2014/06/07(土) 08:31:36.91ID:lWh6G2t5調べるならVBAよりVBで調べた方が分かるかも。
面倒臭いならいっそのこと、シートを配列に見たてて使ってしまえば?
普段見てるシートも、シートと言うクラスのインスタンスに過ぎないから、考え方は同じだよ。
0648643
2014/06/07(土) 23:06:01.41ID:iV9P9+UYレスありがとうございます。配列の要素に配列を代入できるのですね。知りませんでした。
Dim testArray as Variant
ReDim testArray (1 to intA)
そしてTestArrayの各要素に(1 to 50, 1 to 50)の2次元配列を無事に代入できることを確認しました。
今のコードには、セルに書出すための2次元配列が大量にあり整理できずに困っていましたが、
配列の配列やコレクションを使ってスッキリできそうな気がしてきました。
短期的には配列の配列で解決できそうです。長期的には>>644を理解しつつトライしてみます。
アドバイスありがとうございました。勉強になりました。
それにしても配列操作する際のVariantの万能感は半端ないですね。
0649デフォルトの名無しさん
2014/06/08(日) 01:07:33.31ID:IWDW3tNj0650デフォルトの名無しさん
2014/06/08(日) 01:16:28.64ID:GjVpljzs0651デフォルトの名無しさん
2014/06/08(日) 10:29:13.59ID:SjxXj1KSむしろ Variant の万能感の方が問題かと
0652デフォルトの名無しさん
2014/06/08(日) 11:40:36.05ID:IWDW3tNjたとえば、ワークシートに巨大な表があって、Integer型の配列にFor Nextで1個ずつコピーなら入るのに
Variant配列に一気に読み込もうとするとメモリ不足で無理とか
0653デフォルトの名無しさん
2014/06/08(日) 12:24:09.79ID:SjxXj1KS具体例よろ
32KB/64KB 制限の話じゃないよね
0654デフォルトの名無しさん
2014/06/08(日) 14:01:22.44ID:AzMImLSv0655デフォルトの名無しさん
2014/06/09(月) 08:28:18.70ID:2ZoqHH1sそれは、ホントに読み込みでエラーなのか?
Integerの配列なら割り当てれるがVariantの配列は割り当てられない
っていうなら、メモリ制限の問題で有りうるだろうが
>パソコンにどんだけリソースがあってもVBAの方で利用できるメモリが制限されてるという
これそのものに間違いがなくても、不適切な例をだすと説得力がなくなるぞ
■ このスレッドは過去ログ倉庫に格納されています