トップページ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/
0191デフォルトの名無しさん2015/12/30(水) 15:42:53.87ID:WC2i3iyl
オブジェクト変数で
Set objTest = Nothing
という解放処理をするべきかどうかの議論がときどきありますが、
そもそもメモリ使用に関してこのSet objTest = Nothingはなにをやっているのでしょうか?
これがはっきり分かっていないままで議論しても意味がないと思うのですが。

基本的にオブジェクト変数の場合でもプロシージャ内の変数はプロシージャを抜けると役目を終えたということで消えますが
その参照先であるオブジェクトの実体はメモリに残ったままですよね?
Javaのガベージコレクションの機能があるという話はこのVBAで聞いたことが無いので
もしその実体をSet objTest = Nothingで消せるということなら
いかなるオブジェクト変数を使ったあとは必ずSet objTest = Nothingを書くべき、というのが(もし上の仮定が正しい場合)わたしの見解なのですが。
01921832015/12/30(水) 15:47:44.59ID:WC2i3iyl
わたしは183でもありました。

>>184

>>185
それはinitializeという英単語が引数を2つとる動詞、つまり1つ目の引数は「実行する主体」、2つ目の引数が「初期化される物」でうまくいきますが
例えば引数を1つしか取らない英単語、例えばrunだとかdieだとかappearの場合どうしたらいいのですか?
0193デフォルトの名無しさん2015/12/30(水) 15:50:40.47ID:WC2i3iyl
>>184
initializeの場合は、うんこをひねり出すかのごとく
initiializeDataやinitializeCellのようにDataやCellをひねり出すことができましたが
先にも書いたrunやdieやappearなどのときはどうしますか?
01941852015/12/30(水) 16:18:23.99ID:0l8puLjU
>>192
全部英文で考えれば "何を"の君のゆう所の 実行主体 が付けれると思うが
・・・をrun   何を実行?(runProcess)
・・・をdie   何を殺す(が死ぬ)? (dieProcess)
・・・をappear  何が出る?(appearBigin)


※英単語の訳等の間違いはスルーして下さいね

これ以上 君に付き合うつもりは無いので あしからず(年末なんで)
0195デフォルトの名無しさん2015/12/30(水) 16:27:23.62ID:Y9esFwyM
>>186
FirstTime とかのフラグかな
0196デフォルトの名無しさん2015/12/30(水) 18:39:36.91ID:PBmz2gbU
>>190
For i = 1 は古いって言われても、
m(i) = m1(i) + m2(i)
をどう実装するんですか?
0197デフォルトの名無しさん2015/12/30(水) 18:58:26.89ID:JPIixvGP
>>190
別の処理を施したいなら、別のForEach文なり、Do文なりを利用すべき。
そもそもForEachはオブジェクト型を扱わない場合は処理が重いので必要が無い限り極力使わない方がいい。

別の処理なら別のループとして分けられるはず。変なこだわりを持っているせいでややこしい事になっているだけ。
0198デフォルトの名無しさん2015/12/30(水) 19:05:08.95ID:yH9ydeBO
パフォーマンス的にはfor>foreachなんだけどね。あと、flag使うとかやりようはいくらでもある。少し捻りが足りないんじゃないかな
0199デフォルトの名無しさん2015/12/30(水) 20:02:26.27ID:bRclVw7x
他言語だと、For Each的なループであっても
何回目の処理かをループ内で知ることの出来る機能を持ったものがある
VBAは残念ながらそれがないから、自分でカウンタ変数を用意するか
一個目のデータに特有の項目があるならそれを判定するか、だろうね
0200デフォルトの名無しさん2015/12/30(水) 22:00:46.01ID:yDP/mW46
>>186

最初の時だけ何らかの値を計算してとっておくということであれば
Dim val As Variant として、ループの中で
If IsEmpty(val) Then val = ...
とやればいい。
余計なフラグなしにできるl。
0201デフォルトの名無しさん2015/12/30(水) 23:44:51.92ID:RDoNJfse
Application.OnTime TimeSerial(Hour(Now()) + 1, 0, 0), "更新"



マクロ"更新"の最後にまた上のコード


以前教えてもらった1時間毎にマクロを起動するコードですが
23時になると狂って連続で"更新"マクロを繰り返してしまいます
23時から0時へは跨げないということでしょうか? 対策をお願いします
0202デフォルトの名無しさん2015/12/31(木) 00:00:57.74ID:yJLj8/Bn
>>201
対策をお願いします(キリッ

上から目線だなオイ
0203デフォルトの名無しさん2015/12/31(木) 00:47:01.17ID:2YFGdsnl
>>186
Dim user_list As Collection
Dim user As Collection
Set user_list = New Collection
Set user = New Collection
user.Add Key:="SEQ_NO", Item:=user_list.Count + 1
user.Add Key:="NAME", Item:="aaa"
user.Add Key:="PASSWORD", Item:="xxx"
user_list.Add user
Set user = New Collection
user.Add Key:="SEQ_NO", Item:=user_list.Count + 1
user.Add Key:="NAME", Item:="bbb"
user.Add Key:="PASSWORD", Item:="yyy"
user_list.Add user
Dim msg As String
For Each user In user_list
If user("SEQ_NO") <> 1 Then
msg = msg & ","
End If
msg = msg & user("NAME") & ":" & user("PASSWORD")
Next
MsgBox msg
0204デフォルトの名無しさん2015/12/31(木) 06:18:32.30ID:EUZydMuq
>>201
Hourは、0〜23を返す。最後には、
23 + 1 = 24

これで値を見てみれば?
Debug.Print TimeSerial(24, 0, 0)
02051912015/12/31(木) 08:06:51.15ID:D5b/7JR8
みなさん不正解。がんばった人もいるけど残念!
答は、For eachループに入る直前にその1回目の書きたかったコードを書けばいいだけでした。
0206186 (=191)2015/12/31(木) 08:07:43.82ID:D5b/7JR8
上は>>186でした。
0207デフォルトの名無しさん2015/12/31(木) 08:13:13.18ID:xcpAmXWK
>>205
ひとつ目の値を使うんじゃないのか?それをどうやって取得するんだよ?
0208デフォルトの名無しさん2015/12/31(木) 09:43:58.89ID:18DEmBMj
残念も何もそう指摘されてるだろうに。
もしかして「僕はVBAにとても詳しいんだ」ってプライドを崩されてへそ曲げたのか。
0209デフォルトの名無しさん2015/12/31(木) 11:11:22.46ID:xcpAmXWK
パフォーマンスに関しては他の人も言ってるけど、
For Each z in M 構文での z と、For i = 0 To 〜 での M(i) の違いとして、
z はM(i)のコピーでしかないという点がある。(Mが配列の場合)
M がジャグ配列で要素が再び大きな配列だったりしたら重い処理になりえるな。
それに、コピーだから z に何か代入しても M には反映されない。
For i = 1は古い、なんて決めつけてると(以下略
0210デフォルトの名無しさん2015/12/31(木) 12:11:06.57ID:3FCNx6UT
For i 〜の構文内での話なのですが・・・

1.iやjの変数の宣言がされてないとエラーが出ます。
2.下記の記述をしていますが、自分が想定したのと違う動きになります。
   For i = 1 To 9
For j = 1 To 9 - i
      If IsNumeric("TextBox" & (2 * (i - 1) + 2 * j + 7)) = False Then

テキストボックスを順にチェックしていきたかったのですが
なにか記述方法が間違っているのでしょうか?
ご指導のほど、よろしくお願いたします。
0211デフォルトの名無しさん2015/12/31(木) 12:21:48.92ID:e/tEw3yP
>>208
もうその通りだろうね。稚拙すぎて笑える
0212デフォルトの名無しさん2015/12/31(木) 14:10:55.55ID:KhBichDl
>>210
こんなかんじで指定するんじゃなかったっけ
Controls("TextBox" & i).Value
0213デフォルトの名無しさん2015/12/31(木) 15:23:07.54ID:18DEmBMj
>>210
For i = 1 to 9
For j = 1 to 9 - i
Next
Next

だけならエラー吐かないのでテキストボックスの問題だなぁ。
それ以上はどういう形か分からない以上調べようがないから何とも。

全部のテキストボックスを調べて良いなら

For Each x In Me.Cotrols
   If TypeName(x) = "TextBox" then
     ...
   End If
Next

とやると簡単。Tag使って判定すれば特定のものだけ除外できるし。
02142102015/12/31(木) 17:47:16.72ID:3FCNx6UT
いろいろ試したのですが、やはりテキストボックスの表記の問題のようです。
順番にチェックしていく関係でこのような記述をしました。
最初にテキストボックスの7-9、7-11、7-13、・・・・7-23、9と-11、9-13のようにしたかったのです。

For i = 1 To 9
For j = 1 To 9 - i
If Abs(("TextBox" & 2 * i + 5) - ("TextBox" & 2 * (i - 1) + 2 * j + 7)) <= 100 Then
          【処理内容】
End If
Next j
Next i

の記述をしたのですが・・・テキストボックスの記述方法がダメなのでしょうか?
0215デフォルトの名無しさん2015/12/31(木) 18:21:50.17ID:xcpAmXWK
ActiveSheet.OLEObjects("TextBox" & 1).Object.Value
のように指定すればいいみたいだけど?
0216デフォルトの名無しさん2016/01/01(金) 08:16:43.96ID:sVrrx3Fu
On Error Resume Nextってそれを実行した行のあとも
プログラムが終了するまでずっと有効ですか?
ある区間だけ有効にしたい、あるいはずっと有効しておきたい、のように使い分けたいこともこれから出てくると思うのです。
0217デフォルトの名無しさん2016/01/01(金) 08:18:12.65ID:sVrrx3Fu
Application.DisplayAlerts = Falseも、(以下同文)
0218デフォルトの名無しさん2016/01/01(金) 09:06:31.31ID:HVUfaNaT
>>216-217
あけおめ

On Error はプロシージャ内のみ有効
Application.DisplayAlertsは Excel終了するまで継続のハズ

ちなみに
On Error Resume Next
は短い範囲でかつどうしても実行時エラーの可能性が排除できない
時のみ使う方が良いとおもうよ
ステートメント毎に Errオブジェクトを見てればいいけど
不具合発生してもスルーされるからどこでどんなエラーが発生したか分らなくなる
せめて
On Error Goto ラベル
でトラップ処理するなら別だけど
0219デフォルトの名無しさん2016/01/01(金) 10:06:58.64ID:sVrrx3Fu
>>218
どもあり、ことよろ。

そうなんですか、スッキリしました。これでこれから使い分けができそうです。
0220デフォルトの名無しさん2016/01/01(金) 10:17:22.33ID:NO+H6ZMg
>>216
> ある区間だけ有効にしたい、あるいはずっと有効しておきたい
On Error Goto 0
0221デフォルトの名無しさん2016/01/01(金) 19:56:00.98ID:xpOY3CWT
手元にExcelがないから試せないけど、確かOn Errorは呼び出し先の関数内でも有効になるんだよね
個人的にはErr.Raiseをthrowのように使いたいんだけどね
0222デフォルトの名無しさん2016/01/01(金) 20:52:55.76ID:sVrrx3Fu
>>220-221
なるへそありがとう。
0223デフォルトの名無しさん2016/01/01(金) 20:55:39.83ID:sVrrx3Fu
自分で作った列挙型(Enum)ってその全体のマクロでどこででも参照して利用できるようにするには
どこに書けばいいとか注意点はありますか?
自分で作ったクラスの中ででもその列挙型定数は使いたいです。
0224デフォルトの名無しさん2016/01/01(金) 21:04:54.88ID:+cD+YD5u
イミディエイトウィンドウに出力された内容を取得する方法ってありませんでしょうか
0225デフォルトの名無しさん2016/01/01(金) 23:06:06.65ID:+cD+YD5u
あとマクロ開始時にイミディエイトウィンドウをクリアする記述ってありますでしょうか
0226デフォルトの名無しさん2016/01/02(土) 01:20:56.54ID:jWkoNf5r
>>223
>自分で作ったクラスの中ででもその列挙型定数は使いたいです。
やめたほうがいいです。
ライブラリとして再利用する為なんじゃないの?
むしろ、そのクラスで使うならそのクラスに実装すべきで、他でも使いたいなら
公開すればいいだけ。
クラス以外で実装した列挙型をクラス内で使いたい場合は、クラスの中で再定義
するか、橋渡しするようなプロシージャを用意する必要があるかな。
めんどくさいけどね。
>>224
コピペしかないと思うけど、
そもそもイミディエイトに出力ってDebug.Print使ってるって
ことなんだろうけど、そろそろテキストファイルに出力する方法も
覚えたらどう?
0227デフォルトの名無しさん2016/01/02(土) 09:24:31.29ID:Dnf2flaM
イミディエイトをシェルとして使って作業の大部分を完結させている自分としては、イミディエイト内での
「もとに戻す」と「繰り返し」をショートカットでできるようにしてほしい。
ついでに「繰り返し」はctrl + yに統一してくれ。
0228デフォルトの名無しさん2016/01/02(土) 09:44:03.17ID:Nffz1P8X
文字列をためこんどいて
マクロ終了直前にメモ帳を起動してその文字列をそこに入力させておくためのコードは
どう書けばいいですか?
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ボタン
■ このスレッドは過去ログ倉庫に格納されています