トップページtech
1002コメント383KB

Excel VBA 質問スレ Part39 [転載禁止]©5ch.io

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2015/11/27(金) 20:36:45.35ID:9HV+ag/s
ExcelのVBAに関する質問スレです

                   ___
       ___      /____ヽ      ____
      /____\    | |´・ω・`| |    /___ヽ
      .l |´・ω・`|  ニX二 . ̄ ̄ ̄  二X二  |´・ω・`| l 俺たちに任せろ
      !、 ̄ ̄ ̄  ヽ   |       |    /    ̄ ̄ ̄/
       ヽ_/ヽ、  ヽ__)  \__/\_/.   /_/  ノヽ_/
             ̄                ̄ ̄

このスレはコード書き込みOKです。
作成依頼もOKですが、作成依頼限定ではありません。

コードが嫌な人・作成依頼が嫌な人は別スレ建ててください。

※前スレ
Excel VBA 質問スレ Part38 [転載禁止]2ch.net
http://peace.2ch.net/test/read.cgi/tech/1441619979/
0229デフォルトの名無しさん2016/01/02(土) 09:51:29.48ID:sxcdtv6m
>>228
素直にテキストに落としてみては?
0230デフォルトの名無しさん2016/01/02(土) 09:58:15.99ID:vN/+lOC5
>>223
確かクラスでパブリックな列挙体を指定すると、クラス.列挙体.列挙値の記述が出来ないはず。
そもそも列挙体はそのクラスから生成したインスタンスで挙動が変わるものでないので、クラスに記述すること自体が微妙。
VBAは.Netと違ってSheardがないので、標準モジュールに記述して使うのが変な挙動をしなくていいと思う。

VBAでクラスを使おうとすると、まだ考え方が確立され切れていないときの状態を引きずった言語だから使い方に戸惑うことが多いよね。

ユーザー定義型なんてもっと顕著にそう言うことが起こるよ。
0231デフォルトの名無しさん2016/01/02(土) 21:54:01.64ID:MhjWcLlU
ライブラリ作ってるけどユーザー定義クラス(型)は全然使ってない。
どういう使いどころあるかな?
0232デフォルトの名無しさん2016/01/04(月) 06:20:47.61ID:D+zYtfMV
vbsと相互に使うからわざわざ定義型なんて使ってないなあ
まとめて管理するとかもVariantの配列に突っ込めばいいし
もうちょと互換性があれば使ったかもしれないけど
0233デフォルトの名無しさん2016/01/05(火) 00:10:29.99ID:USCQ6V11
ユーザフォームをActiveにしたときにコードを書きたいのですが
Activeってどうやって判断しますか?

UserForm_Click()だとボタンをクリックしたときにはそれが発動されないし。
0234デフォルトの名無しさん2016/01/05(火) 02:05:35.42ID:Kvov8i6k
どう?
0235デフォルトの名無しさん2016/01/05(火) 02:25:02.47ID:Kvov8i6k
ユーザーフォームを使った場合、
コードはそのフォームモジュールだけにに書いて
標準モジュールは作りさえしないというやり方で良いでしょうか?
いまのところ標準モジュールを作る意図が見いだせないのですが。
0236デフォルトの名無しさん2016/01/05(火) 02:34:32.38ID:LNU3ZziC
そんな事 人に聞かなくても
作らなくても 動作上問題ないなら 作らんでいいんじゃね?
0237デフォルトの名無しさん2016/01/05(火) 03:15:29.83ID:mStzs5Tn
>>233
普通はそのまんまのActivateイベント使うんじゃないかね

>>235
じゃあそれでいいんじゃない
0238デフォルトの名無しさん2016/01/05(火) 03:22:29.47ID:cUCC3uaz
>>237
2013だとイベント拾えないなActivateイベント
フォームロード時には発生するんだが…
02392332016/01/05(火) 03:30:01.47ID:Kvov8i6k
>>237
そのActivateがくせもので
フォームが複数あったときにそのフォームがActivateになったときはそのイベントをひろうけど
フォームが1つだとmodelessで開いたとき普通のExcelワークシートからそのフォームにActiveが移動しても
Acticateに書いたコードは実行してくれず無反応なんですよ。
0240デフォルトの名無しさん2016/01/05(火) 12:34:15.92ID:Kvov8i6k
Javaに慣れてると
他のSub(例えば名前をAdditionの2つの引数を取るとします)を呼ぶときに
Addition(5 , 8)
が構文エラーとなるのが気持ち悪くてしかたがありません。

正しくは
Addition 5 , 8
Call Addition(5 , 8)
のいずれかにしなければなりません。

でもどうにかしてJavaのように
Addition(5 , 8)
のようにできる方法はありませんかね?
0241デフォルトの名無しさん2016/01/05(火) 12:36:58.68ID:LntnFA7d
>>240
無理だと思う。
Functionにはしたくないんだよね?
0242デフォルトの名無しさん2016/01/05(火) 12:41:34.28ID:Kvov8i6k
>>241
Functionにしてもいいですよ。
でも同様にできなそうです。
0243デフォルトの名無しさん2016/01/05(火) 12:45:32.43ID:33a1opJu
プログラマーとは多様性を受け入れるものだ
0244デフォルトの名無しさん2016/01/05(火) 12:51:11.49ID:Kvov8i6k
受け入れたら負けだと思っている。
0245デフォルトの名無しさん2016/01/05(火) 13:01:18.99ID:LntnFA7d
>>242
ああ、戻り値を捨てるってことか。それも無理だと思う。

Functionにして繋げてしまえば?
result = Func1(Func2(Func3(...Addition(5, 8))))
どこにも副作用がなく、無駄な戻り値も無いようにすればいい。
0246デフォルトの名無しさん2016/01/05(火) 13:02:44.78ID:LntnFA7d
>>242
Javaを捨てて関数型に移行するのだ。VBAならそれができる。
0247デフォルトの名無しさん2016/01/05(火) 13:16:48.58ID:YLBFKxeK
>>240
気持ち悪いのは君の勝手
言語には言語の流儀がある。それが嫌ならやらなきゃいいだけ。逆に、JavaでVBAっぽく
やりたいとかアホ抜かせって話。

そして、普通みなそういう言語毎に流儀は慣れる。気持ち悪いなんて言ってるような奴は
プログラマーとしては三流。
0248デフォルトの名無しさん2016/01/05(火) 13:56:27.25ID:LntnFA7d
Subの呼び出し方がFunctionと違うことのメリットがなにかひとつあったような気がするんだが、忘れてしまった。

>>247ってプログラマなの?
0249デフォルトの名無しさん2016/01/05(火) 16:31:17.21ID:mlWeSkma
>>248
非常にレアなケースでしかメリットが出てこないが、消費するヒープがSubの方が少ないから再帰の回数が多くできる
厳密には戻り値の変数エリアを初期化する手間がなくなるので実行速度も誤差程度には速い、はず
0250デフォルトの名無しさん2016/01/05(火) 19:25:18.04ID:LntnFA7d
>>249
なるほど

s/ヒープ/スタック/
だよね?
0251デフォルトの名無しさん2016/01/05(火) 20:12:50.80ID:KIPOXvA0
>>240
・プリプロセッサを作って変換する
・MSに入社してVBAの言語仕様書を書き換える
・MSを買い取ってVBJをサボートさせる
・…

ただ、こう言う本質的でないところに突っかかる奴はたいてい適性がないので、素直にマをやめた方が本人も周りも幸せになれる
0252デフォルトの名無しさん2016/01/06(水) 03:05:54.21ID:IHMGmJSj
たぶんだけど「いやぁ、おれJava使えるんすよぉ。皆さんは出来ないでしょ?」的な自慢なんじゃないの。
プログラムの覚え始めってインプリンティングみたいな愛着が湧くから、そんな時期なんでしょ。
0253デフォルトの名無しさん2016/01/06(水) 06:08:03.77ID:wTjSz+NM
>>252
逆を言えばそれしか出来ないんでしょ?wwwこんな程度で気持ち悪いとか吐いてる程度だから、Java自体のレベルも知れてる。
0254デフォルトの名無しさん2016/01/06(水) 09:24:36.49ID:qs2eqDcn
あけましておめでとうございます

Excel VBA(windows7 Excel2010 VBA7,0)で パソコンがミュート状態かどうかを
判定したいのですが・・・

ミュート状態だと if 〜 Else で処理(ミュート解除)させようと思っていますが
ミュートかどうかを判定する方法がわかりません

みなさんのお力をお借りしたく書き込みさせて
頂きました。

よろしくお願いします 22歳OL
0255デフォルトの名無しさん2016/01/06(水) 10:01:38.51ID:nVjV76XE
>>254
mixerGetControlDetailsを使う
0256デフォルトの名無しさん2016/01/06(水) 10:04:22.66ID:/XlzX9bH
>>254
MMDevice API とかでぐぐってみる
0257デフォルトの名無しさん2016/01/06(水) 10:36:47.15ID:qs2eqDcn
>>255
>>256
早速の返信ありがとうございます
質問する前にgoogle先生に質問して
mixerGetControlDetails や
API などを使うと出来そうな感じの事が書いてあったのですが・・・

最近VBAを独学で勉強しだした私には難しくどうしたらいいか
よくわからず・・・ここで質問させていただきました
また、お時間ある時でいいのでアドバイスお願いします

まだどうしtらいいかわからないです
22歳OL
0258デフォルトの名無しさん2016/01/06(水) 10:49:05.08ID:f2GjMEVM
>>257
最後の1行 なんかバカにされてる気がするぞ
0259デフォルトの名無しさん2016/01/06(水) 11:47:08.51ID:/XlzX9bH
久しく制服を着たOLというものを見掛けなくなったな
0260デフォルトの名無しさん2016/01/06(水) 11:48:38.02ID:/XlzX9bH
>>257
独学はよくない。
明日からavivaに行きなさい。
0261デフォルトの名無しさん2016/01/06(水) 11:51:57.78ID:nVjV76XE
>>257
だったらこれからも独学でやれや
俺はグーグル先生みたいに甘くねーぞ
0262デフォルトの名無しさん2016/01/06(水) 11:57:47.28ID:9dwHBHIu
>>257
喧嘩売ってんの?
0263デフォルトの名無しさん2016/01/06(水) 12:48:37.88ID:uGhm1id+
ExcelVBAをオリジナルのExcelのない環境で実行することって不可能かな?
0264デフォルトの名無しさん2016/01/06(水) 12:54:07.42ID:IHMGmJSj
>>263
オートメーションと呼ばれる手法で、たとえばAccessでCreateObject("Excel.Application")して、
そこで得られたエクセルオブジェクトを利用するっていうんじゃなきゃ不可能じゃないの。

あとはVBSにでもするしか。
0265デフォルトの名無しさん2016/01/06(水) 13:12:52.54ID:YDWhVPVu
>>257
まずは誠意を見せたまえ。
おっ○いうp
0266デフォルトの名無しさん2016/01/06(水) 16:16:54.72ID:uGhm1id+
>>264
やはり普通には使えないようですね、残念
ブラウザ上で動くサーバーサイドExcelみたいなのがあれば便利だったのですが
0267デフォルトの名無しさん2016/01/06(水) 16:26:44.21ID:uGhm1id+
Private Function Reset(ByRef ls As Collection, ByVal k As String, ByVal v As Variant)
ls.Remove k
ls.Add Item:=v, Key:=k
End Function

Public Sub Test()
Dim list As New Collection
list.Add New Collection
list(1).Add New Collection
list(1)(1).Add Item:=123, Key:="key"
Reset list(1)(1), "key", 456
' Dim list_sub As Collection
' Set list_sub = list(1)
' Reset list_sub(1), "key", 456
MsgBox list(1)(1)("key")
End Sub

これが関数呼び出し時にエラーになるのは何故でしょう?
コメントアウト部の方を有効にするか、ByRefをByValにすると正しく動くので構わないんですが
もしかしてコレクションはByValで渡すのが当然とか?
0268デフォルトの名無しさん2016/01/06(水) 16:47:03.10ID:9dwHBHIu
>>266
Google Spreadsheetでも使って下さい。
0269デフォルトの名無しさん2016/01/06(水) 18:33:10.74ID:jZfE0I4k
>>267
Reset list(1).Item(1), "key", 456
とかなら呼び出せるっぽい

デフォルトプロパティの評価あたりでおかしな事になってるのかもしれん
実はItemは真のデフォルトプロパティじゃないし
0270デフォルトの名無しさん2016/01/06(水) 20:01:54.35ID:uGhm1id+
>>269
そういう方法がありましたか
ありがとう
0271初心者A2016/01/06(水) 20:04:38.71ID:tBMwYmRt
初歩的な質問で、すいません。配列とかFor〜Nextのとこなんですが、
うまくいかなくて、悩んでます。

■■■■質問
'SH2のE列に、次のように出力するためには、どのようにコードしたら
いいか教えてもらえませんでしょうか?
0272初心者A2016/01/06(水) 20:05:11.36ID:tBMwYmRt
-----
2
3
4
5
-----
1
3
4
5
-----
1
2
4
5
-----
1
2
3
5
-----
1
2
3
4
-----
0273初心者A2016/01/06(水) 20:06:39.51ID:tBMwYmRt
■■■■前置き(その1)
No(1)=1
No(2)=2
No(3)=3
No(4)=4
No(5)=5
の配列を、違うシート(シート名:sheet2name)に出力したい。

動的配列ですが、NUM1=5として考えやすくしてみました。

計算結果を出力するシートを、
Set SH2 = Worksheets(sheet2name)とする。
0274初心者A2016/01/06(水) 20:07:07.71ID:tBMwYmRt
■■■■前置き(その2)
1
1
1
1
-----
2
2
2
2
-----
3
3
3
3
-----
4
4
4
4
-----
5
5
5
5
-----
0275初心者A2016/01/06(水) 20:07:24.26ID:tBMwYmRt
■■■■前置き(その3)
と出力するために、次のようにコードしました。
--------------------------------------------------
r = 0
t = 1
For s = 1 To NUM1
For q = r + 1 To r + NUM1 - 1
SH2.Cells(q + 2, 4).Value = No(t) 'SH2のD列にデータ出力
r = r + 1
Next q
t = t + 1
Next s
--------------------------------------------------
0276デフォルトの名無しさん2016/01/06(水) 20:30:41.31ID:5UG3hvjQ
動的配列のLBoundの値を変更するのにRedim Preserveを2回使うテクニックがあるけど、
真っ当な技と言えるんでしょうか?
0277デフォルトの名無しさん2016/01/06(水) 20:37:10.97ID:cINiOzEy
>>271
質問がとっちらかっててよくわからん
とりあえず>>272のコード

Sheets("SH2").Activate
num = 5
r = 1
For i = 1 To num
  For j = 1 To 5
    If i <> j Then
      Cells(r, 5) = j
      r = r + 1
    End If
  Next
  Cells(r, 5) = "-----"
  r = r + 1
Next
0278デフォルトの名無しさん2016/01/06(水) 20:38:10.90ID:cINiOzEy
For j = 1 To 5

For j = 1 To num
の間違い
0279初心者A2016/01/06(水) 21:15:55.49ID:tBMwYmRt
>277
やってみます。ありがとうございます。


http://ww10.puny.jp/uploader/download/1452081929.xls


パスワード:abc

Module1で試行錯誤中です。

SH2(シート名:計算結果)の【F列】
SH2.Cells(u + 2, 6).Value=
にデータ出力したいです。

初心者なんで難しいです(>_<)
時間かかりそうです。
0280初心者A2016/01/06(水) 21:30:56.38ID:tBMwYmRt
おかげさまで、できました(^^)/ありがとうございます
下記のコード

r = 1
For i = 1 To NUM1
For j = 1 To NUM1
If i <> j Then
SH2.Cells(r + 2, 6).Value = No(j)
r = r + 1
End If
Next j
Next i
0281デフォルトの名無しさん2016/01/07(木) 00:21:58.78ID:GoyK1MG8
>>277みたいにシートをActivateやSelectして
Cellsの親を省略するみたいな書き方って気持ち悪いと思いませんか
扱うシートが増えたりしたらどうするんですか
0282デフォルトの名無しさん2016/01/07(木) 01:36:13.89ID:w0ujcVRl
シートが増えれば大変なのはどちらも同じ
好きな方を使えばよい
0283デフォルトの名無しさん2016/01/07(木) 08:35:20.93ID:bWvRU875
サンプルの書き方は本当の書き方と多少違うだろう。
0284デフォルトの名無しさん2016/01/07(木) 09:09:34.45ID:QNCWlpNp
>>282
どちらでもよくない。
処理中にシートが切り替わると副作用があるので、必ずsheet1.cellのように指定する。

個人で作って使うなら何してもいいが、人に渡す時はそんな舐めたことすんじゃねーぞ
0285デフォルトの名無しさん2016/01/07(木) 09:29:17.60ID:bWvRU875
>>284
人に渡すってどういう意味?
0286初心者A2016/01/07(木) 12:18:16.88ID:pq62efvo
■やりたいこと
下記のURL先のエクセルファイル
(ファイル名:2点間距離の差011)の
計算結果シートにて、
●D値が多い順の表を完成させたい。
●D値の合計が大きい順の表を完成させたい。

どうコーディングすればいいか、アドバイス
頂けると幸いですm(_ _)mぺこり

http://ww10.puny.jp/uploader/download/1452136421.xls
パスワード;abc
0287初心者A2016/01/07(木) 12:19:39.64ID:pq62efvo
2つの座標系を用いて、
点間距離の差を計算結果シートのO列に表示しています。

座標入力シートのG2セルにて、
点間距離の差がある値より大きいものをD値としています。
計算結果シートのO列で、そのD値より大きい値を赤くしています。
-----------------------------------------------------------
例えば、
点名A1 点名B1では、D値が多い順の個数は、
2個です(赤くなっている文字が2つ)

例えば、
点名A1 点名B1では、D値の合計が大きい順の合計(mm)は、
51.5です。
0288デフォルトの名無しさん2016/01/07(木) 17:52:38.68ID:2nH+0Iqy
単純に考えて
a1-b1
a2-b2
a3-b3
の表完成させて並び変えたら
0289初心者A2016/01/07(木) 18:17:44.40ID:pq62efvo
>>288 たしかに、並び替えは後ですね。
ここまで、できました。

現状で満足してますが
できれば、VBAを用いて、ソートしたい。

http://ww10.puny.jp/uploader/download/1452157302.xls
パスワード:abc

上記URL先のエクセルファイル(2点間距離の差016.xls)
の計算結果シートにおいて、
(表:D値の個数)個数をキー(多い順)として、ソートしたい。
(表:D値の合計)合計をキー(大きい順)としてソートしたい。

■これ勉強しなきゃいけないんかな?
VBAでクイックソート
http://howto-it.com/excelvbaqsort.html
http://excel-ubara.com/excelvba5/EXCELVBA229.html
0290初心者A2016/01/07(木) 18:24:25.57ID:pq62efvo
エクセルの標準機能で、いっかな(´・ω・`)

ホーム→
→並び替えとフィルター
→ユーザー設定の並べ替え
→列にて、優先されるキーで、個数または合計を選択
→順序で降順
→OKボタン
0291デフォルトの名無しさん2016/01/07(木) 18:33:25.91ID:2nH+0Iqy
並び替えする前に新しいマクロの記録コマンド
並び替え終わったら終了コマンド
すると操作が記録されたVBAプロシージャが取得できる
0292デフォルトの名無しさん2016/01/07(木) 19:09:08.14ID:v5mg4Nrt
OFFICE次バージョンからVBAが廃止されるかもとネットで見た。ウチの会社オワタ
0293デフォルトの名無しさん2016/01/07(木) 19:11:08.03ID:bWvRU875
>>292
どこのソース?
一般企業での利用者の存在数から考えて無理だと思う。
0294デフォルトの名無しさん2016/01/07(木) 19:37:43.86ID:2nH+0Iqy
というか基本的にOFFICEのバージョンアップは不要
しかしエクセルでマイナンバーとか管理されたら
それに近いところでVBAが動いてたらまずいでしょ
だから時代についていくためにVBAを切り捨てる必要がある
0295デフォルトの名無しさん2016/01/07(木) 19:47:50.85ID:bWvRU875
そんな日本だけの事情でマイクロソフトが動くのか?
0296初心者A2016/01/07(木) 19:54:26.63ID:pq62efvo
エクセル2007以降のバージョンなら、どのバージョンでもいい。
0297初心者A2016/01/07(木) 19:57:16.31ID:pq62efvo
>>291

そうでした。マクロの記録がありましたね。
やってみます。2行〜最終行を選択ればいいのかな?
0298デフォルトの名無しさん2016/01/07(木) 19:58:23.02ID:2nH+0Iqy
>>295
サポートじゃなくてセールス文句だから
ネットにつないでも安全なエクセルって感じかな
0299初心者A2016/01/07(木) 23:46:18.98ID:pq62efvo
Const sheet2name =
0300初心者A2016/01/07(木) 23:47:38.29ID:pq62efvo
Const sheet2name = 計算結果(※ダブルクオテーション略)

Sub 並べ替え()

Dim SH2 As Worksheet
Dim GYO4 As Long, NUM4 As Long, x As Long

Set SH2 = Worksheets(sheet2name)

'R行の3行目から最終行までリサーチ
'NUM4は、並び替えるデータの個数
For GYO4 = 3 To SH2.Range("R65536").End(xlUp).Row
NUM4 = GYO4 - 2
Next GYO4

SH2.Sort.SortFields.Clear
Range(SH2.Cells(2, 18), SH2.Cells(NUM4 + 2, 21)) _
.Sort Key1:=SH2.Cells(3, 21), order1:=xlDescending, Header:=xlYes

End Sub
0301初心者A2016/01/07(木) 23:49:14.75ID:pq62efvo
並べ替えって基本的にこれだけなんだ(´・ω・`)ほ〜

SH2.Sort.SortFields.Clear
Range(SH2.Cells(2, 18), SH2.Cells(NUM4 + 2, 21)) _
.Sort Key1:=SH2.Cells(3, 21), order1:=xlDescending, Header:=xlYes
0302デフォルトの名無しさん2016/01/08(金) 00:32:14.62ID:AwkBQm6q
シート上のソートはどこかにキー列がないと機能しないのがちょっと不便だけど、
簡単ではある。
0303デフォルトの名無しさん2016/01/08(金) 06:38:04.99ID:ZpBAcVz8
VBAの求人117件の平均最低月給224,500円
http://jobinjapan.jp/job-listing/keyword-vba.html
0304デフォルトの名無しさん2016/01/08(金) 15:12:20.20ID:9Hdlf+du
>>276
そのテクニックというもの自体知らないので、
よろしかったらもっと詳しく教えてください
0305デフォルトの名無しさん2016/01/08(金) 16:51:24.45ID:VkXSxnl8
>>304
Dim v As Variant
'LBound=0 : 長さ3の配列
ReDim v(0 to 2)
v(0) = 0: v(1) = 1: v(2) = 2

' LBoundを1に変えたい
' LBound=1 : 長さ4に拡張
ReDim Preserve v(1 to 4)
'長さ3に戻す
ReDim Preserve v(1 to 3)

こうするとLBoundの値は確かに変わるし、巨大な配列でも一瞬で終わる。
これが仕様的に正しいと言えるのか不明。ループでやると仕様的な不安はないけど時間は掛かる。
0306デフォルトの名無しさん2016/01/08(金) 18:00:56.80ID:1fL2vwQ7
> ReDim Preserve v(1 to 3)
これ一回じゃあかんのか
0307デフォルトの名無しさん2016/01/08(金) 18:07:13.41ID:VkXSxnl8
>>306
なぜかダメ。
長さが変わらないからやる意味なしと判断されるのか...は不明。
0308デフォルトの名無しさん2016/01/08(金) 18:20:31.18ID:u+GM9q1y
>>305
意味がよくわからない。

Sub foo()
  Dim a As Variant

  ReDim a(0 To 2)
  Debug.Print LBound(a) & " To " & UBound(a)

  ' Lowerのみ変更
  ReDim Preserve a(1 To 2)
  Debug.Print LBound(a) & " To " & UBound(a)
End Sub

結果:Lowerは変わっている
0 To 2
1 To 2

Sub foo()
  Dim a As Variant

  ReDim a(0 To 2)
  Debug.Print LBound(a) & " To " & UBound(a)

  ' 両方変更
  ReDim Preserve a(1 To 3)
  Debug.Print LBound(a) & " To " & UBound(a)
End Sub

結果:両方変わっている
0 To 2
1 To 3
0309デフォルトの名無しさん2016/01/08(金) 18:37:10.31ID:VkXSxnl8
>>308
えー?
下のfoo は自分の環境では
0 To 2
0 To 2
と出るんだけど?

Office 2010 Excel 14.0.7163.500(64bit)
Visual Basic for Applications 7.0
0310デフォルトの名無しさん2016/01/08(金) 18:45:54.37ID:ujpdqUME
>>305
ヘルプ(2007)には
>キーワード Preserve を使用した場合、動的配列のサイズを変更するために変えられるのは、添字の上限だけです。添字の下限を変更しようとすると、エラーが発生します。
って書いてあるな

>これが仕様的に正しいと言えるのか
やってみたが2007では出来てるみたいだが、ヘルプには出来ないと書いてあるのだから
仕様的に正しいとは言えないと思うが

過去のバージョンではホントにエラー出てたような気もするんだが
いつの間にかこっそり拡張されたのかねぇ
0311デフォルトの名無しさん2016/01/08(金) 18:53:30.77ID:ujpdqUME
>>309
2007の32ビットなら、>>305>>308も出来るっぽい

下限を変えたときに、要素がずれるのか下限側の要素が切り捨てられる(または
初期化された要素が追加される)のかは確認してない

この辺も明示されていないから、ReDimで下限変えるのは
環境依存で危険な方法だと思った方が良いんじゃない
0312デフォルトの名無しさん2016/01/08(金) 18:55:30.64ID:VkXSxnl8
レスくれた皆さんありがとう。
これを使ってLBoundを変更する機能、急にいらなくなりました。
なんでこんな質問をしたかというと、ワークシートから取得した配列(Range(範囲).Valueで取れるやつ)のLBoundを手っ取り早く0にしたかったからです。
だけどその場合は2次元配列となり、1次元目のReDim Preserveはどうやってもダメだと気づきました。
どうもすいません。
0313デフォルトの名無しさん2016/01/08(金) 18:58:01.58ID:1fL2vwQ7
>>310
検索するとこんなのがあったけど
a)キーワード Preserve を指定した場合、変更できるのは、動的配列の最後の次元のサイズに限られます。
また、次元数は変更できません。

b)つまり、キーワード Preserve を使用した場合、動的配列のサイズを変更するために変えられるのは、添字の上限だけです。
添字の下限を変更しようとすると、エラーが発生します。

つまりだからbはaの2以上の次元配列の話

v(3,5)
の3は変えられなくて5は変えられる
添え字の上限とは5(数値じゃなく一番右にあるって意味)のこと
0314デフォルトの名無しさん2016/01/08(金) 19:09:45.61ID:ujpdqUME
>>313
もし2次元以上の配列に限る話だったとしても、その意味は
(3, 1 To 5)を(3, 0 To 5)に出来ませんって事
次元と添字の上限下限は別の話。上限下限は次元ごとに存在んするんだよ
0315デフォルトの名無しさん2016/01/08(金) 23:46:16.59ID:EVmIpiZQ
>>292
アホな
0316デフォルトの名無しさん2016/01/09(土) 09:51:48.56ID:eE0tOkYT
アホな話かも知れないけど無くなるかも知れないってよ
Excelの自動操作をしたければ外部からやれってことらしいね
ついでにワードみたいに1アプリケーション1ブックしか開けなくなるかもってよ
0317デフォルトの名無しさん2016/01/09(土) 10:03:01.20ID:ba2w/O62
ワードはマルチドキュメントじゃなくなっただけだろう。
アプリケーションで複数のブックを開けなくなるなんて退化はあり得ない。
0318デフォルトの名無しさん2016/01/09(土) 10:31:05.76ID:c5DKVMyA
ないってよ
らしいね
かもってよ
www
0319デフォルトの名無しさん2016/01/09(土) 19:46:58.98ID:DEcEG5aT
ソースもださずにネットで見たとか言う話の信頼性をどうこう言っても
0320デフォルトの名無しさん2016/01/09(土) 20:11:29.37ID:h3R10OzO
グローバル変数や、Public Subの名前を変更したいとき、
それを確実にすべて変更する方法ってありますか?

置換は確実じゃないのでダメです。
例えば、manという変数をmaleに置換しようとしてまちがってwomanという変化をwomaleにしてしまう可能性があるからです。
0321デフォルトの名無しさん2016/01/09(土) 20:19:58.68ID:3Mphd1W9
正規表現
単語で検索
" man "を" male "に変換
3通りの可能性思いつきました
0322デフォルトの名無しさん2016/01/09(土) 20:56:12.50ID:1IbXuGB2
>>321
文字列とかコメントとかまで考えると…
0323デフォルトの名無しさん2016/01/09(土) 22:01:41.40ID:sD5C6F8w
exportしてトークンに分解して全置換してimportし直すマクロを組むとか
VBAのエスケープやコメント処理って比較的楽な気がするし
既にそういうのありそうだけど
0324デフォルトの名無しさん2016/01/09(土) 22:02:50.59ID:h3R10OzO
そのクーポンってなんですか?
割引してくれるの?
0325デフォルトの名無しさん2016/01/09(土) 22:03:52.65ID:h3R10OzO
このExcelにもともとついてる開発エディタにそんな機能はついてないの?
0326デフォルトの名無しさん2016/01/09(土) 22:07:18.41ID:sD5C6F8w
そうVBAソースを字句解析するって意味
自分で書けば100%割引でお得だよ
03273122016/01/09(土) 22:16:44.24ID:CpCNnIMM
配列のLBoundを変更する機能はVBAでやるのはやめて、メモリを直接弄ることにしました。
お騒がせしましたがうまくいったみたいです。
0328デフォルトの名無しさん2016/01/09(土) 22:22:59.10ID:sD5C6F8w
つーかeclipseプラグインとかにVBA用のがあれば何も作らずに済むんじゃないの
探してみなよ
■ このスレッドは過去ログ倉庫に格納されています