1 名前:デフォルトの名無しさん mailto:sage [2009/07/14(火) 19:07:54 ] ExcelのVBAに関する質問スレです 前スレ pc12.2ch.net/test/read.cgi/tech/1241885130/ ★1 質問テンプレ(雛形)は用意しませんが、OSとExcelのバージョンは必ず書きましょう。 ★2 ExcelのVBA以外の部分に関する質問はNGです。 但し、VBA無しでも出来ることだが、あえてVBAでやりたいって物に関してはOK。 ★3 ExcelのVBE(Visual Basic Editor)を使うとしても、VBAの分野以外に関してはスレ違いです。 VBAとは、『Visual Basic for Application』の略で Application ├Workbooks |└Workbook | ├Worksheets | |└Worksheet というApplication以下のオブジェクトを、VB言語で操作するものを指します。 例えExcel付属のVBE(Visual Basic Editor)を利用しようとも、このApplication以下のブックやシート、 セルやオブジェクト等を操作するもの以外はVBA分野の話ではないので、ここでは聞かないでください。 ★4 とりあえず、Excelのインスタンスを作らずにVB6で出来ることは全てスレ違いだと思ってください。 ★5 レベルはどうあれ、ここはプログラマ用の板スレです。プログラマとは、自分でプログラムを組み コードを書く人の事なので、自分でやるきは全く無く、丸投げしようって人はお断りです。 ヒントを貰えばあとは自力でなんとかしますって人のみどうぞ。 ★6 わからなければとりあえず「マクロの記録」(Alt, T, M, R)
196 名前:デフォルトの名無しさん mailto:sage [2009/07/26(日) 23:47:19 ] >191 確かに。後だしは良くないですよね。すみません。 出来るだけ簡単なシチュエーションにしたかったんです。 ところで、どなたか>185のやり方をご存知ないでしょうか?
197 名前:187 mailto:sage [2009/07/26(日) 23:59:08 ] >192 当方の手順(マクロの自動記録)シートAに図形があって選択していない状態から 1 図形をクリック 2 メニューの編集−コピー 3 シートBのタブをクリック 4 メニューの編集−貼り付け これだけです。できたソースは↓で、1行目だけ削除すればいい。 ActiveSheet.Shapes("Picture 1").Select ←これだけ削除 Selection.Copy Sheets("SheetB").Select ActiveSheet.Paste 実行する際は、マクロを呼び出す前にコピーしたい図形をクリックして選択 状態にしておくこと。シートBの貼り付け先を指定したいときは、自動記録 のときに当該セルをクリックする。
198 名前:デフォルトの名無しさん mailto:sage [2009/07/27(月) 00:04:47 ] >192 196ですが、世の中ギブアンドテイクって事で、試して見てください。 Worksheets("A").shapes(i).Copy Worksheets("B").Activate Active.Sheet.Paste iの部分に画像が何枚目かを代入。
199 名前:デフォルトの名無しさん mailto:sage [2009/07/27(月) 00:07:40 ] >>197 >>実行する際は、マクロを呼び出す前にコピーしたい図形をクリックして選択 状態にしておくこと。 この作業無しでする方法はないですか?
200 名前:デフォルトの名無しさん mailto:sage [2009/07/27(月) 00:22:25 ] >>198 できました! みなさんありがとうございました
201 名前:デフォルトの名無しさん mailto:sage [2009/07/27(月) 01:24:29 ] >>185 Range(Cells(1, 1), Cells(3, 100)) = a として 各行の平均を出す
202 名前:デフォルトの名無しさん [2009/07/27(月) 01:28:15 ] >>194 k = 5 For i = 5 To 101 Step 24 If k > 20 Then Exit For '↑はkのTo 20があまり重要でないならいらない Cells(i,k).Copy Selection.Paste k = k + 5 Next こんなんなったけどいいか? これだと、変数iとkがいずれかはみ出したらループを抜ける。 これだと、(i,k)=(5,5),(29,10),(53,15),(77,20)の4回ループ内を実行する。
203 名前:デフォルトの名無しさん mailto:sage [2009/07/27(月) 01:42:17 ] >>202 ありがとうございます。 上記の方法で無事動作しました。 ちなみに変数にしたい要素が3つ以上ある場合というのは一般的にどういう処理が効率的でしょうか? 今はいちいちすべての場合分けをして記述していますが、それぞれの増減は規則性があるので なんとか簡易にしたいと思っています。
204 名前:デフォルトの名無しさん mailto:sage [2009/07/27(月) 01:53:41 ] >>185 Sub test() Debug.Print WorksheetFunction.Average(Range("A1:A100")) Debug.Print WorksheetFunction.Average(Range("B1:B100")) Debug.Print WorksheetFunction.Average(Range("C1:C100")) End Sub
205 名前:デフォルトの名無しさん mailto:sage [2009/07/27(月) 01:53:48 ] >201 ありがとうございます。 やはりシートを利用するしかないんでしょうね。 それか個別の一次元配列変数を宣言して代入とか。 出来れば、.Average(A(2))とかの記述でその従属二次元配列が計算されるのを期待したんですが、 特定の次元を宣言するような関数なり構文はないんですね。。 今日はもう寝ます。明日会社だし。 ありがとうございました。
206 名前:デフォルトの名無しさん mailto:sage [2009/07/27(月) 10:20:03 ] >>203 「一般的」と「効率的」と「簡易」は両立が難しい。 何がやりたいのか自分でもわかってない気配がするが、まずは質問を絞れ。 ループ終了の条件が2つ以上ある時は無理にFor Nextを使わない。 Exit ForやGotoのような、プログラムの流れを強制的に変える命令は、 あまり使わない方がいい。 i = 5 k = 5 While (i <= 101) And (k <= 20) Cells(i, k) 以下略 i = i + 24 k = k + 5 Wend
207 名前:デフォルトの名無しさん mailto:sage [2009/07/27(月) 10:44:58 ] 変数が大量にあって、ループの回数も多くなると、 ForとIfでもWhileでも、終了条件の判定回数が増えるから少し効率が落ちるね。 そういう時は最初にループの回数を調べしまうといい。 回数i = (101 - 5) / 24 回数k = (20 - 5) / 5 If 回数i < 回数k Then 回数 = 回数i Else 回数 = 回数k End If i = 5 k = 5 For a = 1 To 回数 Cells 以下省略 i = i + 24 k = k + 5 Next あとはケースバイケース。 可能なら、こんなふうに数式を短縮してみるとか。 For a = 0 To 回数 - 1 Cells(5 + 24 * a, 5 + 5 * a) 以下省略 Next
208 名前:デフォルトの名無しさん mailto:sage [2009/07/27(月) 17:17:40 ] strTextLine = "A,B,C,D," というCSVファイルがあって、これをDataという配列変数に Data = Split(strTextLine, ",") とすると DATA[0]はA DATA[1]はB DATA[2]はC DATA[3]はD ですが DATA[5]にナルが入るんでしょうか? それとも最後のカンマは無視されるんでしょうか? 配列に入れて処理を加えた後に strTextLine = Data(0) For C = 1 To UBound(Data) strTextLine = strTextLine & "," & Data(C) Next C で戻してやると最後のカンマは生きているので、無視はされてないのではないかと思うのですが、確証が得たいので質問しました。
209 名前:デフォルトの名無しさん mailto:sage [2009/07/27(月) 17:33:58 ] あれ使うといいよ イミディエイなんとか
210 名前:デフォルトの名無しさん mailto:sage [2009/07/27(月) 18:53:26 ] >>208 さすがにDATA[5]には何も入らんだろう。という挙げ足は置いといて。 たとえば元のデータが"A,,,B"で長さが0の文字列が無視されてしまったらどうなると思う?
211 名前:デフォルトの名無しさん mailto:sage [2009/07/27(月) 18:57:25 ] 何百行あるか何千行あるかわからないテキストファイルを一行ずつ配列に入れたいんですが LineInputを繰り返す度に毎回ReDimしながら代入するしかありませんか? なんとなくRedimを繰り返すのは処理速度的にあまりスマートではないのではという懸念があるのですが。 一度LineInputの度に変数に+1して行数を求めてから もう一度LineInputと代入を繰り返すのとどっちが良いでしょうか。
212 名前:デフォルトの名無しさん mailto:sage [2009/07/27(月) 19:25:27 ] 俺なら最初に何行あるかを確認して、その分の配列をとり格納するようにすると思うけど、 スマートとかどうとか言う以前に目的を達成できたら、それで良いのでは? デバッグの容易さとか保守性の容易さとかを考慮するのは大事だと思うけど。
213 名前:デフォルトの名無しさん [2009/07/27(月) 21:51:33 ] >>208 ,209 イミディエイトウインドウのことですな。 DATA[4]なら Debug.Print DATA(4) で調べられますYo. っていうかこの場合ローカル ウィンドウで直接見たほうが早くね?
214 名前:デフォルトの名無しさん mailto:sage [2009/07/27(月) 23:35:50 ] >>211 1行ずつ増やすんじゃなくて、たとえば100行とか200行単位で拡張していって、 最後に余った分はもう一度ReDimして削るようにすれば、だいぶ軽くなる。 行の長さの最大値とかファイルの大きさがある程度わかってれば、 もうちょっと別のアプローチもあるんだけど。
215 名前:デフォルトの名無しさん mailto:sage [2009/07/27(月) 23:44:05 ] >>211 ファイル全体を文字列変数に一気に読み込んだあと Split関数で区切りを改行コードにして分割
216 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 00:35:54 ] WindowsXPのOffice2003を使用しています。 型番や製品名の一覧があり、これらが別に用意されている製品の型番などの書かれたリストと 一字一句相違ない事を確認する作業を補助するマクロを作ろうとしています。 列Aに aaa bba ccc zzz とあり、別のシートにリストがあって aaa bbb ccc ddd の様に書かれていたら、列Aのbbaとzzzがリストにないのでそのセルを着色する、と言う処理を考えています。 この様なリスト総当たり的な判定、間違い探しを行う事は可能でしょうか。 ttp://paint.s13.dxbeat.com/up/src/paint_18511.jpg 画像は処理前後のイメージです。列Cにコピーするわけではありません。 実際にはリストもデータもそれなりの量があります。 (なお、ループ処理、次の行、列、リストへの移動などは別に変数を切ってある範囲を直指定するなど力業でやってしまう予定です。) マッチングのやり方として、以下を考えています。 1.リストの先頭の文字列をデータの列Aの先頭から総なめして、次のリストの文字列へ、、の繰り返し。 2.何かしらの関数でリストを一括で読み込めて、データの列Aを上からマッチングしてくれるやり方。 2は希望ですが、何か良い手段がありましたらご教授お願いします。
217 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 00:42:41 ] よし!ここでVLOOKUP関数だ!
218 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 00:46:43 ] >216 そういう関数があるかは解りませんが、結局マッチングしなかったセルを色付けしないといけないので、 For〜Next構文を使用する事になると思いますので、1.をお勧めします。
219 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 00:53:48 ] >>216 作業列を1列使えばワークシート関数だけでできるんだけど、VBA使わないとだめ?
220 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 00:54:27 ] VLOOKUPと条件付書式を使えばできるんじゃないかな。 俺ならマクロでするけど。
221 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 00:58:52 ] >>216 個人的お勧めは3.フィルタオプション だけれどちょっと調べてよくわからないなら1.総ナメが堅いかな 結構な量あるとはいっても2003の行に入る分量なら よほど下手なコード書かない限りたいして時間かからない
222 名前:216 mailto:sage [2009/07/28(火) 01:13:53 ] 皆さんレスありがとうございます。 >>217 調べてみました。まさにマッチングはこれだ!と言う感じでしたが、リストの別の値を代入するのではなく 色を付けたいのでどうして良いものか… あ、何でも良いから値をマッチしたら変数に値を一旦格納して その後if文で変数を見て色塗りを振り分ける、、って感じなら出来そうですね。 >>218 はい、1も考えてみます。パフォーマンスがやや心配ですが^^; ループはいずれかの方法を使いますが、時間の関係と空のセルも多々あり得るので手を抜こうと画策中です。 >>219 実は既にデータシートに数式が入っていたりして、なるべく体裁をいじりたくないというのが一点と 列が20個ほど、列の数だけリストも存在し、行数は100〜200位なのでVBAの方が良いのかなと考えました。 >>220 はい、vlookupをちょっと調べてみます。 条件付き書式は多分勝手に組んじゃダメと言われそうなので回避する方向で考えています。 >>221 なるほど、オートフィルタの制限無しバージョンみたいな感じですね。しかもリストの範囲も指定できて出力も出来ると。 参考にさせていただきます。ただ、各ファイルで毎回設定各列を指定する必要がありそうですね。 上記データシートが一日に10〜20ファイル届いて捌かないと行けないので、もう少し自動化の道も探ってみます。
223 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 01:37:25 ] >222 218です。20*200なら配列変数に格納してMatchなりVlookUpなりで検索かける方がセルに情報を読みに行く時間が短縮出来ますよ。ほんと僅かですけど。 変数格納もRangeオブジェクト使えば一瞬ですし。
224 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 01:42:13 ] 223です。 はあ?って思われたでしょうね。 誤爆しました。223は忘れて下さい。時間は同じでした。
225 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 07:35:38 ] すいません、Excel2003なんですが質問が二つあります。 1.セルに複数行のデータがある場合、指定行だけ参照することはできますか? 2.セルに入力されたパスが読み取り専用のフォルダかどうか調べることはできますか? よろしくお願いします。
226 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 07:49:41 ] >>225 1については、セルの折り返しでなく改行入力ならば、改行をカウントして文字列抜き出す 2はFSO使えばおk
227 名前:デフォルトの名無しさん [2009/07/28(火) 10:02:18 ] Excel2003 XPです。 Private Sub Worksheet_SelectionChange(ByVal Target As Range) で渡されるTargetが連続した複数のセル範囲である場合、行を1行に 変更する処理を行いたいのですが、とりあえず力技で以下のように しています。 myRange1 = Target.Address myRange2 = myRange1 If InStr(myRange1, ":") Then myRange = Split(myRange1, "$") myRange2 = myRange(1) & myRange(2) & myRange(3) & Left(myRange(2), Len(myRange(2)) - 1) End If 要は"$"で列行列行に分割して文字列を作り直しているのですが、 何とも見難いのでもっとスマートなコマンドやテクニックは無いでしょうか? よろしくお願いします。
228 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 10:36:53 ] >>215 ありがとうございます! すばらしくスマートです。
229 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 12:20:58 ] >>227 とりあえず$記号をまとめて消したいなら myRange2 = Replace(Target.Address, "$", "") あと、そのプログラムにはバグがあるよ。 選択された領域が2つ以上に分かれて離れていた場合、2つ目以降がすべて消えたり $記号が残ったりする。 それよりも、セルが1個の時と複数の時を区別する意味がわかんないし、 $を消す理由もよくわからん。普通はTargetはそのまま使うもんだし。 たぶん、他の部分でもカンチガイしてる可能性が高い。 何がやりたいのか全部書いてみ?
230 名前:227 mailto:sage [2009/07/28(火) 13:27:12 ] >229 よく読んでください。 $をまとめて消したい訳ではありません。 連続領域の最上位行が対象ですので離れていようがバグりません。 >何がやりたいのか全部書いてみ? >227の通りです。
231 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 13:35:49 ] >>227 データ解析の色分けで同じようなことをやったことがありますが $を探して無理やりやった記憶があります。 今でも勉強中の身ですのでその程度の知識しかありません。 SPLITで配列に入れて結合し直すのは感心しました。 無駄レス失礼。
232 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 13:59:52 ] >>229 よく読めば>>227 さんの言ってることくらいわかるはずだろ! 二度と質問者様の手を煩わせることのないようにな! あと分かりやすく説明するんだぞ!! (・д・)
233 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 14:09:26 ] 俺の頭が悪いのかなあ 「行を1行に変更する」の意味がどうもわからん じゃあ変更する前の「1行じゃなかった行」ってどういう状態のことだろ
234 名前:22 mailto:sage [2009/07/28(火) 14:27:27 ] dim header as range set header = target.rows(1)
235 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 14:28:12 ] う、変な名前が・・・
236 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 15:42:54 ] >>233 奇遇だな、俺もわからないんだ
237 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 15:56:24 ] わからないなら書き込まないでくださいね
238 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 16:14:20 ] >>227 具体的な例を出してないのが悪いな 例えば$A$3:$E$6が選択されてたらどうしたいんだ?
239 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 16:32:41 ] >>237 そうだな、なんで解らないってレスが付いてるかも理解出来ないやつは書き込み禁止にすべきなんだよな
240 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 17:04:07 ] >>227 そのプログラム、Target.Addressが"$A$1,$C$3:$D$4"の時、 myRange2は"A1,C1"という結果になるんだけど、本当にこれでいいの?
241 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 17:13:21 ] まさかと思うけど… 1行にしたいってこういうこと? Set myRange2 = Target.Resize(1)
242 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 17:28:21 ] myRange2は範囲を示す文字列だから myRange2 = Replace(Target.Resize(1).Address, "$", "") じゃないか? $を消す必要があるかどうかは不明だが ちゃんと説明してもらえそうにないんで、とりあえず。
243 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 17:30:30 ] 実は文字列に変換する必要はなかった、に一票 たぶん>>241 で正解だと思
244 名前:227 mailto:sage [2009/07/28(火) 17:31:34 ] >233 >236 >238 現状のコードまで書いてるのに・・・ >240 そのケースは想定しておりませんでした。 ご指摘ありがとうございます。 変な流れになってますので出直します。 失礼しました。
245 名前:227 mailto:sage [2009/07/28(火) 17:36:06 ] >241 それです。 Resizeがありましたね。 ありがとうございました。
246 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 17:53:30 ] 現状のコードってあんた、>>240 の例にもあるように そのコードが理解不能な結果を出してんだから答えようがないじゃん ちなみにCtrl+クリックで離れたセル領域を選択すると Resizeでエラー出るよ
247 名前:227 mailto:sage [2009/07/28(火) 17:58:01 ] >246 >233,236,238の問いには充分かと思いますが? またResizeでエラーがでるのは承知しております。 >229でとんちんかんなレスをされていた方でしょうか? いずれにせよ不毛ですのでこの辺で失礼します。
248 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 18:42:48 ] >>247 ほんと変な流れになってるよね、なんでかわからないけどkkwr ちゃんとした質問kkwrだったし、口調も丁寧kkwrなのに・・・ 多分タイミングが悪かったんじゃないかな・・・また何かあったらその時はきちんとしたレスが付くといいねkkbk
249 名前:231です mailto:sage [2009/07/28(火) 20:20:23 ] そうか、RANGEのままサイズ変更できるんだ。 何で>>227 が絡まれてるか分からんけど自分の勉強になりました。
250 名前:デフォルトの名無しさん [2009/07/28(火) 21:14:36 ] OS:XP、EXCEL2003 を使っています。 こちらのコードを実行すると(0 2)、(0.1 1.9)...(1.8 0.2)、(1.9 0.1)と出力されます。 最後に出力させると思われる(2 0)が出力されません。 小数処理の関係かと思うのですが、どなたか詳しい方 解説いただきたくよろしくお願いいたします。 Sub test() Dim a As Double Dim b As Double For a = 0 To 2 Step 0.1 b = Round(2 - a, 1) Debug.Print a & vbTab & b Next End Sub
251 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 21:48:48 ] >>250 演算誤差詳しくないけれど Excelの0.1は厳密な0.1じゃないからループ21回目でfor文の終了条件の2を越えてるんじゃね?
252 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 21:52:15 ] >>250 浮動小数点の問題ね As Double を As Currency にしてみたら・・どうなるかな!
253 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 22:11:06 ] 四捨五入せずに For a = 0 To 2 Step 0.1 b = 2 - a Debug.Print a, b Next でやってみ。誤差が見えるよ。 あとPrintメソッドで「 , 」を使うとTabの働きをする。これ豆知識な
254 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 22:20:08 ] 通貨型 (Currency) 通貨型 (Currency) の変数は、64 ビット (8 バイト) の変数です。 整数形式で表され、10,000 倍されて整数として記憶された、15 桁の整数部分と 4 桁の小数部分を持つ固定小数点数です。 -922,337,203,685,477.5808 〜 922,337,203,685,477.5807 の範囲の値をとります。通貨型の型宣言文字は、アット マーク (@) です。 通貨型 (Currency) は、金額に関連する計算に役立つデータ型です。また、固定小数点を含む計算にも役立ちます。
255 名前:250 [2009/07/28(火) 23:14:54 ] >>251-254 試してみて0.1ステップだと誤差で21回目に2より 少しだけ大きな値になってしまうことが理解できました。 Printメソッドでの「 , 」も勉強になりました。 通貨型でも期待通りの動作をすることを確認できました。 こういった誤差に強い型だとわかりました。 ご回答ありがとうございました。
256 名前:デフォルトの名無しさん mailto:sage [2009/07/29(水) 00:14:45 ] 応用は利かないけど、こうするな For a = 0 To 20 Step 1 b = ( 20 - a ) / 10
257 名前:デフォルトの名無しさん mailto:sage [2009/07/29(水) 00:21:19 ] > あとPrintメソッドで「 , 」を使うとTabの働きをする。これ豆知識な 豆知識ではなく基礎知識じゃね? ;で区切ると結合になって、末尾に;入れると改行されないのとセットで
258 名前:デフォルトの名無しさん mailto:sage [2009/07/29(水) 10:09:22 ] メインのSubで動的配列を Dim A() As String Dim B() As Long Redim A(10) Redim B(10) と宣言して別のルーチンで配列の中身をいじりたい時 ルーチンの呼び出しと呼び出し側の指定はどう書いたら良いですか? 配列操作 A(), B() private sub 配列操作(ByRef A() As String, ByRef B() As Long) な感じでしょうか、それとも 配列操作 A, B private sub 配列操作(ByRef A As String, ByRef B As Long) な感じでしょうか
259 名前:デフォルトの名無しさん mailto:sage [2009/07/29(水) 11:05:06 ] >>258 配列は自動的にByRefになるので省略できます。逆にByValは指定できません。 Call 配列操作(A(), B()) Private Sub 配列操作(A() As String, B() As Long)
260 名前:デフォルトの名無しさん mailto:sage [2009/07/29(水) 11:23:33 ] ()は必要なんですね、ありがとうございます。
261 名前:デフォルトの名無しさん mailto:sage [2009/07/29(水) 11:50:09 ] >>259 おい、嘘つくな。
262 名前:デフォルトの名無しさん mailto:sage [2009/07/29(水) 11:53:36 ] 直後にすみません、もうひとつひっかかってしまいました。 Split関数で文字列をAというVariant型の配列に格納した場合、この変数は 配列操作 A Private Sub 配列操作(A As Variant) とすれば配列を維持したままByRefで渡せるんでしょうか?
263 名前:デフォルトの名無しさん mailto:sage [2009/07/29(水) 12:12:18 ] 自分で実験すれば済むことをここで聞くか?
264 名前:デフォルトの名無しさん mailto:sage [2009/07/29(水) 13:37:55 ] 聞けばわかるのにわざわざコード組むか? なんだろ どちらも真理だ
265 名前:デフォルトの名無しさん mailto:sage [2009/07/29(水) 14:31:15 ] わかったら終わりなの?結局コードは書かなくていいの? 宿題?
266 名前:デフォルトの名無しさん mailto:sage [2009/07/29(水) 14:37:35 ] >聞けばわかるのにわざわざコード組むか? ただの疑問なら聞けば済むだろうが ここで出る質問のほとんどは最終的に組まないと終わらないだろ? まぁ実験の仕方がわからないって場合は仕方ないかも知れんが
267 名前:デフォルトの名無しさん mailto:sage [2009/07/29(水) 15:44:29 ] 結局コード組むんだから間違ってるかも知れない面倒はやりたくないのだよ!
268 名前:デフォルトの名無しさん mailto:sage [2009/07/29(水) 15:55:18 ] いきなり成功するより、いっぺん間違えた方が身に付くし 理解が深まって応用がきくようになる
269 名前:デフォルトの名無しさん mailto:sage [2009/07/29(水) 16:59:34 ] それは当然 だが結果しか望まない者もいるのだよ・・・
270 名前:デフォルトの名無しさん mailto:sage [2009/07/29(水) 17:18:10 ] Sub test() Dim V() As Variant ReDim V(10) V(0) = "自分で調べろ" VVV V End Sub Private Sub VVV(V As Variant) MsgBox V(0) End Sub
271 名前:デフォルトの名無しさん mailto:sage [2009/07/29(水) 17:57:12 ] >>270 そのコードは冗長的だな 今後の保守のためにもこうすべき Sub test() 略 V(0) = "ググレ" 略
272 名前:デフォルトの名無しさん mailto:sage [2009/07/29(水) 18:04:34 ] >>271 そのコードは冗長的だな 今後の保守のためにもこうすべき ググレ
273 名前:デフォルトの名無しさん mailto:sage [2009/07/29(水) 18:37:56 ] で、このスレの存在価値も無くなりましたとさ チャンチャン
274 名前:デフォルトの名無しさん mailto:sage [2009/07/29(水) 18:43:57 ] ではこういうのは Sub b() Dim myStr As String Dim myMsg As String Dim i As Long Do myStr = Mid(Rnd(), 3, 14) If myStr = "718571858269" Then Exit Do sleep 1 Loop For i = 1 To 12 Step 2 myMsg = myMsg + Chr(Mid(myStr, i, i + 1)) Next Debug.Print myMsg End Sub >273 そもそも質問するスレだしな 答えたくないなら答えなければいいだけ・・・でもある
275 名前:デフォルトの名無しさん mailto:sage [2009/07/29(水) 18:55:03 ] 桁が足りないな 素直に for ri = 0 to 5 Randomize rndStr(i) = mid(rnd()3,2) next
276 名前:デフォルトの名無しさん mailto:sage [2009/07/29(水) 19:55:37 ] ワークシート関数を眺めていて、気になったのですが、 countif(range,"<100") のように、第2引数が文字列型(?)のように見えます。 試しに、 dim str as string str = "<100" msgbox 10 & str '← 10<100 と計算をさせたい。= true の結果を出したい。 と組んだのですが、 結果は 10<100 と文字列で表現されるだけでした。 引数に含まれる演算子をそのまま読み込ませる方法はありますでしょうか。 なにとぞよろしくお願いします。
277 名前:デフォルトの名無しさん mailto:sage [2009/07/29(水) 20:20:41 ] それをやるのはevaluate()だが、お前が本当にやりたいのはworksheetfunction()じゃないか?
278 名前:デフォルトの名無しさん mailto:sage [2009/07/29(水) 20:48:18 ] str = "<100" MsgBox CBool(Val(10 & str))
279 名前:デフォルトの名無しさん mailto:sage [2009/07/29(水) 20:52:22 ] つまらん
280 名前:デフォルトの名無しさん mailto:sage [2009/07/29(水) 20:52:34 ] sumif関数について質問です。 検索条件を2つ指定する場合はどのようにしたらいいのでしょうか? A列にある「あ」という文字とB列にある「い」という文字があるときの C列にある数値の合計。 よろしくお願いします。
281 名前:デフォルトの名無しさん mailto:sage [2009/07/29(水) 21:00:45 ] >>280 ここはvbaの質問スレだけどvbaの回答でいいのか? (なんとなくスレ違いっぽい文章に見えたので念のため確認)
282 名前:デフォルトの名無しさん mailto:sage [2009/07/29(水) 22:51:02 ] >>277 いや、ワークシート関数をVBAで使うって話ではなくて、 例えば、countif だと条件2個はネストしないと出来ないので、 それを1つの関数で出来るようにユーザー定義関数を作ろうと思ったのです。 その時に、ワークシートの countif は、第2引数に文字列で条件を入れてるのに、 それをダイレクトに演算式に代入出来てる事を疑問に思いまして。
283 名前:デフォルトの名無しさん mailto:sage [2009/07/29(水) 22:59:55 ] そうならそうと最初から言え馬鹿
284 名前:デフォルトの名無しさん mailto:sage [2009/07/29(水) 23:00:54 ] 私の政策はブレてません。
285 名前:デフォルトの名無しさん mailto:sage [2009/07/30(木) 05:32:07 ] 馬鹿ではないでしょ。読めば分かるし。 >282 Rangeオブジェクトのように、セル範囲を" "で囲んであるものも有りますよね。 これはVBAがコードをコンパイルする時に、区別しやすくするためだと思います。 なので必ず文字列として機能している訳ではないです。 最終的にはマシン語で動く訳ですから。
286 名前:デフォルトの名無しさん mailto:sage [2009/07/30(木) 06:24:27 ] VBAはコンパイルはしないだろ
287 名前:デフォルトの名無しさん mailto:sage [2009/07/30(木) 07:35:20 ] メニュー > デバッグ > VBAProject のコンパイル
288 名前:デフォルトの名無しさん mailto:sage [2009/07/30(木) 07:41:11 ] そういう表記だとしてもコンパイルじゃないよね? コンパイルの意味わかってる?
289 名前:デフォルトの名無しさん mailto:sage [2009/07/30(木) 07:42:52 ] 機械語に訳すとならったが、ちがうのか?
290 名前:デフォルトの名無しさん mailto:sage [2009/07/30(木) 07:51:58 ] そうだね。 それでVBAは機械語に訳した実行ファイルを作るのかい?
291 名前:デフォルトの名無しさん mailto:sage [2009/07/30(木) 07:53:31 ] VBAはコンパイラじゃなくて、インタプリタだろ?
292 名前:デフォルトの名無しさん mailto:sage [2009/07/30(木) 09:02:19 ] VBAはインタプリタ言語でもあり、コンパイル言語でもある
293 名前:デフォルトの名無しさん mailto:sage [2009/07/30(木) 10:04:31 ] アセンブラのほうが好みだわ
294 名前:デフォルトの名無しさん mailto:sage [2009/07/30(木) 10:31:03 ] 機械語を吐くのは「狭義の」コンパイル。工業高校レベルの回答。 「Pコードマシン」でぐぐれ。
295 名前:デフォルトの名無しさん mailto:sage [2009/07/30(木) 13:08:27 ] Excel2007のVBE、インテリセンスが効かないんだけど何か設定がいるの?
296 名前:デフォルトの名無しさん mailto:sage [2009/07/30(木) 13:10:25 ] ああ、オブジェクトの種類によって効かないやつがあるのか Rangeならいけるわ