トップページtech
1001コメント417KB

Excel VBA 質問スレ Part33

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2013/10/17(木) 22:04:40.64
ExcelのVBAに関する質問スレです

                   ___
       ___      /____ヽ      ____
      /____\    | |´・ω・`| |    /___ヽ
      .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:6RxarYIU
rangeをOLEで取得するとarrayになるようですが
VBA以外の言語とデータをやり取りするにはどうすれば良い?
0558デフォルトの名無しさん2014/05/28(水) 20:35:31.75ID:aALl0Wxc
>>557
Variant型はExcelやVBAだけで使える型じゃなくてWindowsシステム全体で定義されてるんで
たいていの言語でそのまま扱うことができる
05595392014/05/28(水) 21:11:33.80ID:tkho5s2n
>>549-550
詳しい解答ありがとうございました。
非常に分かりやすかったです。
描くのは直線だけでなるものなので業務の時間を短縮できるのかなと。
あとはCADソフト側の命令の仕方ですね、頑張って探してみます。
ありがとうございました。
0560デフォルトの名無しさん2014/05/28(水) 23:52:38.39ID:am2JQYoj
>>556
あるセル範囲を選択してて
その中にあるセルで
 (1) 空白なら除外する
 (2) 同じ値があれば1つを残して他は除外する
の操作をしたあと
各セルの値をString型の配列変数として入れる
こういうコードを書けばよいよ

要件定義が甘いが、どこがわからんかわからん
0561デフォルトの名無しさん2014/05/29(木) 00:20:40.78ID:pIxlUzsM
>>556
Dictionary使うのはどう?
Existで調べて、無かったらAdd
これを繰り返して最後にString型の配列変数に入れる
0562デフォルトの名無しさん2014/05/29(木) 00:22:14.59ID:pIxlUzsM
スペル間違えた
× Exist
○ Exists
0563デフォルトの名無しさん2014/05/29(木) 08:48:17.68ID:/DaeRAwK
Do
DoEvents
Sleep (100)
Loop Until flag = True

な無限ループをイベント監視用にユーザーフォームで走らせているんですが,
フォームのタイトルバーを捕まれるとループが止められてしまいます。

ループ用にvbModelessなフォームをHiddenで隠して回しても,
他のフォームのタイトルを捕まれると止まってしまいます。

タイトルを捕まれてもマクロが止まらなくなる方法ってありますか?
0564デフォルトの名無しさん2014/05/29(木) 12:02:11.02ID:Amp5ddSE
>>561
ありがとうございます。
あなたはこのスレにときどき登場するDistionary厨のかたですね?
これを機会にDisctionaryの使い方を理解してマスターしようと思うのですが
いいサイトか本はないでしょうか?
0565デフォルトの名無しさん2014/05/29(木) 14:29:26.90ID:sq7Ykhg/
>>563
残念ながらExcelVBAはマルチスレッドに対応しておりません

というか、止められると言っても、終了してしまうのではなく中断するだけだろ?
タイトルバーを掴んでいる間さえも中断しちゃまずいって、いったい何を監視しているやら?
それに、ユーザーフォームの移動なんて、そう頻繁に行うことでも、長時間行うことでも無いじゃん

それとも、自分が使う物ではなく他人が使う物で、タイトルバーを掴んだままにすることで
意図的に監視を一時停止出来ちゃうと困るとかなのかな?
だとすれば、パス掛けたところで簡単に破れて、ソース弄れば監視の無効化も、もっと簡単に
一時停止できるようにすることも可能なVBAでそういうものを作ること自体が不適切

それに、タートルバーを掴んでいる間、つまりExcelの操作をしていない間も監視が必要って事は、
監視対象はExcel上のものではないんだよね?
だとすると、その辺に別の対処法の突破口があるかもしれないな
0566デフォルトの名無しさん2014/05/29(木) 15:11:02.01ID:dLhscPPS
>>563
Sleepを消せば少し改善されると思う
空のループはDoEventsだけで十分
0567デフォルトの名無しさん2014/05/29(木) 15:20:33.17ID:mJj+KV4g
タイトルバーを掴んでる間はDoEventsが戻ってきてないようだが
05685632014/05/29(木) 17:38:29.96ID:/DaeRAwK
>>565
やりたいことは測定器からのデータ取得(GPIB)で,2秒に一回のイベントを監視する目的です。

具体的には AD変換完了のイベント発生 -> 測定値の取得コマンド発行 -> 測定値の転送
という流れで,イベントが発生したら2秒以内に「取得コマンドの発行->転送」をしないと
データを取りこぼしてしまいます。
そこで,フォーム(中断イベント発生用ボタンを表示)がじゃまだと画面の脇によける動作をすると
ループが止まって取りこぼすので困っておりました。

その後,WindowsAPIのSetTimer/KillTimerを試しまして,今回の目的(2秒)なら
行けそうな感じで収まりました。

>>566
>>567 のとおり,つかんでいる間は帰ってきてくれないようです。
0569デフォルトの名無しさん2014/05/29(木) 18:03:06.09ID:mJj+KV4g
そのAD変換完了のイベントってのがどうなってるかしらんが
それで空ループまわして待つ意味がわからんし、時間制限があるのに変換完了イベントから
取得コマンド発行までの間でDoEventsする必要もわからん
0570デフォルトの名無しさん2014/05/29(木) 19:47:40.83ID:sq7Ykhg/
>>568
そういうのは普通、測定器→ローカルデータ、ローカルデータ→Excelって二段構えでやるもんだよ

ユーザーフォームのタイトルバーを掴む意外にも、ループが一時停止される要素はあるし
Excelのエラーで強制終了して再立ち上げするにも、2秒以内じゃまず無理なので取りこぼしが出る

だからまずはデータをローカル(HDD)に保存するってことだけに専念したアプリやスクリプトを走らせて
それが保存するローカルデータをExcelで監視するってのが常套手段
それなら、Excelの監視が止まっている間にイベントが2回発生しようと3回発生しようと
HDDにはその2回なり3回分なりのデータが保存されたままになるから、後からいくらでも読み出し可能
0571デフォルトの名無しさん2014/05/29(木) 19:57:52.53ID:dLhscPPS
それこそ外部プログラムからOLEでワークシートにデータを書き込んで、Changeイベントで処理すべきだろ
リアルタイムで処理する必要があるかどうかは知らんが

リアルタイム性が必要なければファイルにCSV保存して、あとから加工なり分析なりすればええ
0572デフォルトの名無しさん2014/05/29(木) 21:38:45.66ID:pIxlUzsM
>>564
Dictionaryでググレばいいと思うよ
俺もそうした
0573デフォルトの名無しさん2014/05/29(木) 22:25:02.22ID:MJP51S+k
"プロジェクトまたはライブラリが見つかりません"のコンパイルエラーが発生したので以下のページを参考にして解決しました。
http://www.moug.net/tech/exvba/0150128.html
お聞きしたいのは、参照不可となった原因です。あと、参照不可となっていたライブラリのチェックを外すことで今後問題が起きないのか?ということです。
ちなみに、開発環境と実行環境は同一のPC1台のみです。よろしくお願いします。
05745632014/05/30(金) 08:43:27.05ID:VsNT1DP0
>>569
イベント=グローバル変数のビットが立つだけでなので,
単純にループを回し続けてグローバル変数を確認し続ける処理となってます。
また,DoEventsは中断/終了処理のためにフォームのボタンを押す必要があるためです。

>>570,571
CSVを吐かせるのが一番容易ではあるんですが,他者がメンテするときに開発環境等
構築の必要がないVBAのみで完結させたいなというのがありまして。
0575デフォルトの名無しさん2014/05/30(金) 09:28:42.64ID:ztZ/Ok0F
>>574
悪い事は言わん、計測器関連はVBAでやるの止めとけ
今はVisualStudio Expressもあるし、無料で環境構築できるんだから、
Excel に拘らない方が良い

どっちかつうと、VB側からExcel吐き出しする方が経験上楽で確実
0576デフォルトの名無しさん2014/05/30(金) 09:34:30.18ID:tZceHJTB
Excel2個起動したらマルチで動くよ
0577デフォルトの名無しさん2014/05/30(金) 10:03:47.61ID:gm611zV1
そのグローバル変数を書き換えてるプロセスはいったいどこで動いてるんだ?
0578デフォルトの名無しさん2014/05/30(金) 15:23:03.23ID:g1Pwsqem
>>574
>単純にループを回し続けてグローバル変数を確認
グローバル変数セットするときにイベント起こすなり特定プロシジャ呼ぶなりすれば良い話
ループで変数監視とかどう考えても設計がおかしい

>DoEventsは中断/終了処理のために
変換完了イベントから取得コマンド発行までの間は中断できないようにすれば良いだけ
要求される仕様にもよるけど設計がおかしい
0579デフォルトの名無しさん2014/05/30(金) 15:38:13.41ID:g1Pwsqem
>>573
>参照不可となった原因
たとえば参照設定されていたプログラムをアンインストールしたら当然参照不可能になるわな
お前のPCに起こった事がそれだけの情報でわかるわけがないだろう

>今後問題が起きないのか
お前のプログラムが何をどうやってたかわからんのに、わかるわけがないだろう
コンパイルしてみてエラーが無いようなら、一応問題が無いと言えるかもしれんが
ライブラリの中身が変わって参照設定が無くなってたりしたら、そのライブラリに
互換性の問題があったりするかもしれん
0580デフォルトの名無しさん2014/05/30(金) 15:45:03.61ID:9Pr1vy7p
いつもの

「設計が不適切だから、実現が困難になる」

という、初心者がよくハマる罠ですな
0581デフォルトの名無しさん2014/05/30(金) 16:06:49.06ID:VsNT1DP0
>>575
テンプレート作っておいて最終的に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
>>583
分かり易いコードだったら
シート1の上から月の変わり目まで値をシート2に代入して、
その間最大と最小と月計を求めておいて、それをシート2に書き込んだら
また次の月を処理してやればいいんだけど、
別にそんなことしなくてもピボットで行けるんじゃないかと思う。
0587デフォルトの名無しさん2014/05/31(土) 01:24:27.59ID:BIC+yzDE
ひとまずシート1からシート2へ、
全てのデータをコピーする

次にシート2へ、最大値・最小値・合計を、
後ろの行から追加していくと、
行の数え間違いが減りそう
0588デフォルトの名無しさん2014/05/31(土) 08:16:56.63ID:Ym0wh1sa
エクセルの2003で作ったマクロを2013で使用したいのですが、
そのままコピーをしても使えません・・・

互換モードで変換しても、上手く起動してくれません。
どうしたらよいでしょうか?
0589デフォルトの名無しさん2014/05/31(土) 08:31:34.05ID:hcRtMx6V
>>588
使えないってのどういう状況?
コピーって、何をどうコピーしたんだ?
それは本当に2003で作ったマクロなのか?

情報が足りなすぎて何とも言えん

エスパーするならセキュリティセンターの設定で行ける気がするが
0590デフォルトの名無しさん2014/05/31(土) 10:11:58.90ID:0hCJmlYV
>>588
エスパーすると、
信頼できる場所、拡張子(マクロ有効ブック)、参照設定、PtrSafe
あたりかなあ?
0591デフォルトの名無しさん2014/05/31(土) 17:06:26.42ID:vfwWW6a6
質問でございます。
エクセルVBAで効果音を鳴らすにはいかにすればよろしいでしょうか?

また、画像を張ったり、消したりするにはどのようなコードを書き込めばいいものでしょうか?
0592デフォルトの名無しさん2014/05/31(土) 17:57:42.27ID:Ym0wh1sa
マクロの制作代行(修正)を3000円位で行ってくれる所ないかな?

既にあるマクロに機能追加してもらいたいんだけど、
スキルがなくて困っています。
0593デフォルトの名無しさん2014/05/31(土) 18:03:54.56ID:MZZ4d7NB
>>591
http://www13.plala.or.jp/kymats/study/multimedia.html
0594デフォルトの名無しさん2014/05/31(土) 18:15:17.55ID:xW/2bai/
>>593
いまいち、理解できないっす。
要するにどういうコードを書き込めばよいのでしょうか?
そして音源はどこにあるのでしょうか?
0595デフォルトの名無しさん2014/05/31(土) 18:24:22.00ID:6LzyMI+6
>>592
翌日以降に発覚した瑕疵等は別途見積もり・請求させていたたきます
0596デフォルトの名無しさん2014/05/31(土) 18:42:36.10ID:ROAafTCn
>>592
マッチングサイトなんてググればヒットするでしょ
0597デフォルトの名無しさん2014/05/31(土) 20:08:49.36ID:ENgUpqsf
>>594
ググるという発想はないの?
0598デフォルトの名無しさん2014/06/01(日) 00:30:52.76ID:1fLVc9/2
エクセルに画像を取り込もうとすると、テキストファイルウィーザード「選択したデータは区切り文字で区切られていま」
というエラー?が出て、画像が取り込めず、文字列がだーっと出る画面になるのですが
保存された画像を普通に貼り付けるにはどうすればいいのでしょうか
保存の仕方がわるいのでしょうか?
0599デフォルトの名無しさん2014/06/01(日) 00:44:57.06ID:J9cZPePT
>>592
その値段では、誰も引き受けてくれんぞ。30万出せば、金に困っている
連中の誰かは、受けてくれるだろうが。
0600デフォルトの名無しさん2014/06/01(日) 01:56:31.76ID:4/q6rSuq
>>598
君は諦めた方がいい
0601デフォルトの名無しさん2014/06/01(日) 10:15:57.44ID:Vdytlm3J
>>592
相談料 3000円 (120分以内)なら考えてもいい
0602デフォルトの名無しさん2014/06/01(日) 10:28:28.23ID:mo4nCN9m
>>601
120分3000円でいいならもうボランティアでやってやれよw
0603デフォルトの名無しさん2014/06/01(日) 10:39:07.65ID:m+nDoAYH
>>598
まず最初にここは Excel VBA質問スレ
この時点でアウト
君が相談すべきスレは、ビジネスSOFT板のExcel総合相談所 113

ちなみに注意としてExcelのバージョンとどういう操作をしたのかくらい書けよ
Excel2007(2010)だとして、挿入→図からファイルを選択すれば良いのをなんでテキストファイルウィザードなんてもんが出てくる?
0604デフォルトの名無しさん2014/06/01(日) 12:52:54.92ID:QlI1F8ze
すいませんです
Excel2010で、ゲーム製作をしてましてVBAで画像が自動的に出たり消えたりと言うプログラミングを
設定しているのですが、画像がうまく開かないで苦心しておりました
0605デフォルトの名無しさん2014/06/01(日) 14:52:48.34ID:ycdnLEoX
Excel2007です。
Excel2003で動いていた、グラフの書式をコピーする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:WV5hG6M3
Excel2003ですが
VBAでくり返し操作するときは自動保存をOFFにしたいのですが
オプション設定はVBAで操作できるのでしょうか?
0607デフォルトの名無しさん2014/06/01(日) 17:18:12.48ID:XKcLg8fj
>>606
 Application.AutoRecover.Enabled = False
06086062014/06/01(日) 21:41:47.16ID:5iy05h8R
>>607
これは便利ですねぇ知りませんでした。 ありがとうございます。
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:Qua9WhFM
>>609
PlotArea.Width
06116092014/06/02(月) 22:43:18.89ID:QcqSJ9d9
>>610 ありがとうございました。
今試せる環境ではないので明日試してみます。
とりあえずググったところ下のように書いてありました。
厳密に複数グラフの横幅を揃えるのは難しそうですね。

http://www.moug.net/tech/acvba/0020000.html
プロットエリアの位置や大きさは、Top/Left/Height/Widthプロパティで設定しますが、
これらのプロパティで設定する領域は、プロットエリアの書式設定の際に参照される領域よりも大きくなります。
差が出るのは、軸/軸の目盛ラベル/データテーブルの領域分です。
これらを除いた領域の位置、及び大きさはInsideTop/InsideLeft/InsideHeight/InsideWidthプロパティで取得できますが、設定は出来ません。
したがって本来の意味でのプロットエリアの大きさを思い通りに設定するのは、非常に困難であると言えます。
0612デフォルトの名無しさん2014/06/03(火) 14:14:53.77ID:faYSyeIq
VBAでPowerPointを操作するPGを書いています。

PowerPoint2013で利用する「数式」をVBAで操作したいのですが、TextFrameのどこを探してもそれらしきオブジェクトが見当たりません。。。
何かご存知の方、いらっしゃいませんか?
0613デフォルトの名無しさん2014/06/03(火) 14:42:35.82ID:4NU/ReH8
プログラムをPGと略すのは佐賀県の方言なんだよな
0614デフォルトの名無しさん2014/06/03(火) 15:47:32.33ID:ld0ZW2cT
>>613
佐賀?何故にそんな局地的…
0615デフォルトの名無しさん2014/06/03(火) 20:10:38.10ID:FR84HiXr
VBAで、VB6での

Printer.FontName = "MSゴシック"
Printer.FontName = 12
Printer.Print "hoge"
Printer.EndDoc

と同じ事をやるにはどうしたら良いですか?

シート上に文字を入力して、普通にプリントするのではダメで
プリンターの内蔵キャラセットで印刷を行うために、
プリンターに直接文字データを送りたいのです。

検索しても、VBAでシート上の印刷を行う方法を解説したものは
いくらでもありますが、テキストデータを送る方法は見あたりません

Excelのバージョンは2000と2002です。
0616デフォルトの名無しさん2014/06/03(火) 21:31:23.24ID:DdzaYAIY
>>615
LPT1とかPRNとかにPrint#で出力してやればできるかもしれん
しかし、そのコードはプリンタの内蔵キャラセットで印刷する命令でも何でもないんだが

VBAはアプリケーション操作のための言語であって、ハード制御するもんじゃないし
たとえプリンタと言えど直接ハード制御するべきではないと思うが
まずそのプリンタ(のドライバ)作ってるとこに、VBAで出力できないか問い合わせるのが正解だと思うぞ
0617デフォルトの名無しさん2014/06/03(火) 21:33:31.35ID:4NU/ReH8
>>615
プリンターポートの設定は適切に済ませてあるとして、こんなコードでプリンタ内蔵フォントで印刷できると思う
うちに環境がないから確認できないけど

Open "LPT1:" For Output As #1
Print #1, "ABC" & vbCrLf
Close #1
0618デフォルトの名無しさん2014/06/04(水) 22:06:51.01ID:R9ObohXG
>>613
PGr
0619デフォルトの名無しさん2014/06/05(木) 11:47:07.26ID:TEbe8oH8
VBAであるセルが非表示かどうかを調べるにはどうしますか?
セルのプロパティにIsVisibleみたいなのがあればいいのだけども。
0620デフォルトの名無しさん2014/06/05(木) 12:00:18.15ID:TEbe8oH8
VBAで2次元配列、3次元配列の、各次元の要素数を調べるにはどうしますか?
0621デフォルトの名無しさん2014/06/05(木) 12:06:29.37ID:o3+drOXq
>>620
たとえば配列変数hogeの2次元目の要素数を求めるなら

UBound(hoge,2) - LBound(hoge,2) + 1
0622デフォルトの名無しさん2014/06/05(木) 12:07:37.43ID:TEbe8oH8
>>621
ありがとうございますできました
0623デフォルトの名無しさん2014/06/05(木) 12:11:47.42ID:TEbe8oH8
配列変数にString型の値がいっぱい入っていて
もし重複する値があればそれは1つとしてまとめて
同じ配列変数に再代入するにはどうしますか?(当然要素数は重複分減る)
0624デフォルトの名無しさん2014/06/05(木) 12:19:10.13ID:TEbe8oH8
623みたいなのはよく使うからすでに規制のメソッドなどあっていいはずですが。
0625デフォルトの名無しさん2014/06/05(木) 13:21:45.18ID:o3+drOXq
>>623
>>561
0626デフォルトの名無しさん2014/06/05(木) 13:44:07.06ID:U+cU1pOh
>>624
ExcelのVBAは低機能なので、よく使う機能でも意外と入っていません
文字列の重複は自力で調べて消すしかありません

別の方法として、ワークシートにデータを全部コピーして、Excelの機能で重複を削除してから配列に戻すこともできます
0627デフォルトの名無しさん2014/06/05(木) 15:13:50.03ID:AERMy3Ek
Excel初心者です。特定の条件を満たす行の特定の文字を抜き出したいのですが、そういったこともExcelで出来るのでしょうか?

具体的に言いますと、「あいうえお」という5種類の文字で構成される文が数行あるとして

あいうえお → あいう
ああいうえお → ああいう
えお
ああいいう

まず 「あ、い、う」 の文字が5個以上ある行は無視。 「あ、い、う」 の文字が一つも無い行も無視。
これで 「あ、い、う」 の数字が1つ以上、4つ以下含まれる行が絞り込まれます。(上二行のみ)
そこから 「あ、い、う」を引き抜く。

こういったことをするには、どのような関数を使えば良いのでしょうか?ご伝授頂けると助かります。
0628デフォルトの名無しさん2014/06/05(木) 15:30:07.02ID:o3+drOXq
>>627
そういうときは正規表現というのを使います。

詳しくはこの辺で
http://officetanaka.net/excel/vba/tips/tips38.htm
0629デフォルトの名無しさん2014/06/05(木) 15:45:00.27ID:AERMy3Ek
>>628
有難う御座います。
正規表現というのを学習してみたいと思います。
0630デフォルトの名無しさん2014/06/05(木) 15:58:24.11ID:U+cU1pOh
>>627
もちろんできます
条件がいくつもあるって複雑な時はユーザー定義関数を使った方がすっきりできます

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/
>>623
UNIX系だと、行区切りの文字列では、sort + uniq が定番
uniqは連続した重複行を、1行にまとめる
そのため、最初にsortする

>>627
正規表現なら、[あ|い|う]{1,4}

[あ or い or う]が、1回以上、4回以下
0632デフォルトの名無しさん2014/06/05(木) 16:54:30.09ID:AERMy3Ek
>>630
具体的な用例まで助かります。
他にもいくつか加えたい条件もあるので、>>630をヒントと言いますかベースに自分で定義してみたいと思います。
有難う御座いました。
0633デフォルトの名無しさん2014/06/05(木) 16:58:50.71ID:U+cU1pOh
>>631
それだと"あいおいう"に対応できない
俺の解釈では「あいう」は不連続でも個数さえ合っていれば条件に一致する
06346312014/06/05(木) 18:16:58.07ID:I2VjvGe/
不連続で、1〜4個か

意外に難しいわい。頭を使わせよるw
0635デフォルトの名無しさん2014/06/06(金) 00:01:51.20ID:Yt2QH+fK
ちょいと質問
CopyとかPasteを使ってると時々「貼り付けられないよ!」ってエラーが出る

このエラーはactiveSheet.Range("A1").Copyとか書いてたら高確率で出るんだけど
WorkSheet("シート1").Range("A1").Copyって感じでシート名をちゃんと指定してやると
うまく処理される
これってOffiiceの仕様か何かなの?
なんかExcel2003だけでなく2010でも似たような現象が出たんだけど
0636デフォルトの名無しさん2014/06/06(金) 00:37:42.95ID:nBXq1INX
copyで張りつけられないってエラーは出ないと思うんだが
コピー時にエラーがでるのか貼り付け時にエラーがでるのか?

ActiveSheet指定したときに、実際は何が対象になってるか確認してみろよ
実際にコピーされているものが何かも確認してみろよ
0637デフォルトの名無しさん2014/06/06(金) 02:49:29.53ID:ufTytRJw
Private Const clsName As String = "aaa.cls"

Sub test()
 Dim obj As Object
 Set obj = New clsName
End Sub

こんな感じで変数名とかクラス名を一般化する方法ってありますか?
0638デフォルトの名無しさん2014/06/06(金) 05:12:25.67ID:Yt2QH+fK
>>636
ごめんそれで合ってる>貼り付け時にエラーがでる
.Copy後に.Pasteをしてやるとエラーが出るんだ
確認したらActiveSheetで指定しているシート名は「シート1」になってた
なぜか「ActiveSheet」と書くとダメで「WorkSheet("シート1")」と書くと
うまくいくんだよな
0639デフォルトの名無しさん2014/06/06(金) 06:03:40.15ID:2p7Hju+q
>>638
未確認だけど

.Copy
DoEvents
.Paste

でうまくいく場合もあるっぽいよ
どうもCopyメソッドはシステムに処理を投げたあと、完了する前に次に進むっぽい
だからクリップボードのアクセスがかち合ってPasteで失敗する
0640デフォルトの名無しさん2014/06/06(金) 10:38:05.93ID:pY4qYt1M
ユーザーフォームのテキストボックスにBeforeUpdateというイベントがありますが
テキストボックスを多数使うので、クラスとコレクションを使って疑似コントロール配列ししようとしたところ

Private WithEvents TextBoxControl As MSForms.TextBox

の宣言では、BeforeUpdateイベントが使えません。
(他にもAfterUpdate、Enter、Exitイベントが、ユーザーフォームモジュールでは使えるのにクラスでは使えない)

この型でユーザーフォームのテキストボックスを代入することは出来ますし、Changeなどのイベントは取れるのですが
クラス内でBeforeUpdateイベントを取得するには、どうすれば良いですか?
0641デフォルトの名無しさん2014/06/07(土) 03:36:29.21ID:Jb4BFO2L
>>637
そんなもんない
0642デフォルトの名無しさん2014/06/07(土) 05:13:53.67ID:lWh6G2t5
>>637
リフレクションのことを言ってるのかな。
なら、残念。クラスや変数には存在しないな。
ただ、関数だったらスレチになるけど、API、Addressof、コールバックあたりでググれば
幸せになれるかもしれないしなれないかもしれない。
0643デフォルトの名無しさん2014/06/07(土) 05:48:21.20ID:iV9P9+UY
あるプロシージャ内で変数(2次元配列)を3つ使用しています。
今は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:lWh6G2t5
>>643
2次元の配列宣言をクラスで行うようにして、
そのクラスを生成したものをコレクションなりディクショナリなりに突っ込んで
使えばいいんじゃないかな。
多分、3つどころか1つで済むとおもうよ。
06456432014/06/07(土) 06:39:19.09ID:iV9P9+UY
>>644
レスありがとうございます。ただ、クラスとかコレクションとかディクショナリとか難易度高いです。レスの内容が理解できません。
クラスについては、メソッドやプロパティをオブジェクトに実装させるための設計図?というぐらいの知識しかありませんし、
ディクショナリは重複のない組み合わせを得るのに何度か使ったことあるぐらいです。
クラス内で配列を宣言?クラス内なら変数Aの数だけ配列を宣言できるということ?
プロシージャ内で宣言するのとどう違う??宣言した変数は引数として渡す?それともPublic変数?
わからないことだらけです。調べてみます。
0646デフォルトの名無しさん2014/06/07(土) 08:02:44.68ID:DbL3YGfr
>>643
難しく考えず、配列の配列でいいんじゃないか
Variantの配列作ってそれに突っ込め
0647デフォルトの名無しさん2014/06/07(土) 08:31:36.91ID:lWh6G2t5
>>645
調べるならVBAよりVBで調べた方が分かるかも。
面倒臭いならいっそのこと、シートを配列に見たてて使ってしまえば?
普段見てるシートも、シートと言うクラスのインスタンスに過ぎないから、考え方は同じだよ。
06486432014/06/07(土) 23:06:01.41ID:iV9P9+UY
>>646>>645
レスありがとうございます。配列の要素に配列を代入できるのですね。知りませんでした。
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:IWDW3tNj
Variantは機能的にはかなり万能で便利だけど処理は重いしメモリも大量に食うという欠点が
0650デフォルトの名無しさん2014/06/08(日) 01:16:28.64ID:GjVpljzs
50×50のDouble配列に比べたら、バリアントのオーバーヘッドなんて誤差の範囲だと思うが
0651デフォルトの名無しさん2014/06/08(日) 10:29:13.59ID:SjxXj1KS
今時のコンピュータリソースからみたら Variant のオーバーヘッドは問題になることはほぼないだろうね
むしろ Variant の万能感の方が問題かと
0652デフォルトの名無しさん2014/06/08(日) 11:40:36.05ID:IWDW3tNj
パソコンにどんだけリソースがあってもVBAの方で利用できるメモリが制限されてるという

たとえば、ワークシートに巨大な表があって、Integer型の配列にFor Nextで1個ずつコピーなら入るのに
Variant配列に一気に読み込もうとするとメモリ不足で無理とか
0653デフォルトの名無しさん2014/06/08(日) 12:24:09.79ID:SjxXj1KS
>>652
具体例よろ
32KB/64KB 制限の話じゃないよね
0654デフォルトの名無しさん2014/06/08(日) 14:01:22.44ID:AzMImLSv
OSのリソース切れとかもうね
0655デフォルトの名無しさん2014/06/09(月) 08:28:18.70ID:2ZoqHH1s
>>652
それは、ホントに読み込みでエラーなのか?

Integerの配列なら割り当てれるがVariantの配列は割り当てられない
っていうなら、メモリ制限の問題で有りうるだろうが

>パソコンにどんだけリソースがあってもVBAの方で利用できるメモリが制限されてるという
これそのものに間違いがなくても、不適切な例をだすと説得力がなくなるぞ
06566402014/06/09(月) 08:46:53.03ID:YJn9ltJZ
.
>>640も宜しくお願いします。
■ このスレッドは過去ログ倉庫に格納されています