>1 乙でした。テンプレです。 ExcelのVBAに関する質問スレです ★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)
2つユーザーフォームについて質問です 一つはユーザーフォームを多重で起動することは可能でしょうか? userform1.show userform2.show 二つ続けても消さないと次が出てきません。 二つ目はユーザーフォームの番号を変数で表示することは可能でしょうか? UserForm(i).Show こんな感じに、でもこれだとエラーでてしまいます。
>>4 まず最初の質問は
userform1.show False
とすると多重で表示できます。
これをすると、シートのデータがいじれるので
場合によっては危険です。
2番目の質問は、下のコードを見て色々試してみてください。
(UserFormsとUserFormの違いに注意)
Load UserForm1
MsgBox ("UserForm1 を読み込みました。表示はまだです。")
Load UserForm2
MsgBox ("UserForm2 を読み込みました。表示はまだです。")
UserForms(0).Show False
MsgBox ("最初に読み込んだUserFormオブジェクトを表示しました")
UserForms(1).Show False
MsgBox ("2番目に読み込んだUserFormオブジェクトを表示しました")
表示形式が、文字列(A)、数値(B)、日付(C)の値のみを消去する場合 1)Range("A1:C50").value = "" 2)Range("A1:C50").ClearContents 上記1,2、どちらでもOKか?
>>5 できました。
丁寧にありがとうございました。
>>6 jsk駄目だろ?
例えば後ろにデータがないときMsgBox Range("A1000").End(xlUp).Addressってやってみなよ。
9 :
6 :2011/02/23(水) 13:40:24.46
>>10 俺だったら配列で引き渡すわ
それが個人的には1番楽だし改修も引数だけでいいしね
あと、Variantは関係ない
WinXP sp3 Excel 2003 1024列×768行の数値が書かれたCSVファイルをラインモードで読み込み、平均した後、 256列768行にして数値を入力するような命令を実行しています。 この数値の中で、ある値以下の平均を取っていき、その変動が最小になる値を求めたいです。 (10以下平均-9以下平均)、(11以下平均-10以下平均),,,,(30以下平均-29以下平均) Averageifがないので、SUMIF()/COUNTIF()のように計算させ、Do loop等で 順番に計算させようとしたところフリーズしてまともに計算できません。 そこであらかじめシートの方に、A列にSUMIF/COUNTIFを入力し、 B列にA3-A2のように入力し、B列が最小になる行のA列の値を取得しようと思います。 どのようにしたらよいでしょうか。またほかに何かよい方法はないでしょうか。
>12 パフォーマンスを求めるならExcel/VBAじゃなくて.NETなり 数学計算できるソフトほうがいいんじゃないかな? あと、どうしたらいい?じゃなくて思ったことをじゃなくてVBAやってみたら? ロジックを考えてくれっていうのはナシの方向で。
>>12 if文で最小値比較して、それをfor文で回すだけじゃね?
>>13 >>14 あまり美しいとはいえないですが、
A列にSUMIF/COUNTIF
B列にA3-A2,,,,
適当なセルにSUMPRODUCT((B10:B30=MIN(B10:B30))*ROW(B10:B30))で行番号取得、
Cells()でA列のこの行番号の値を入れて取得でできました。
SUMIF/COUNTIFもマクロ上だと重いですが、セル上だとさくっといくみたいです。
>>12 たかだか70万件のデータでフリーズするとは、あきらかにプログラムがタコだな
アルゴリズムをよく考え直した方がいい
まあ、とりあえずExcel2010買ってこい
小細工しなくても1024列のデータがそのまま読み込めるから
プログラムが少し楽になる
>>16 ど素人ゆえプログラムもかなりのへたれですが、
パソコンもへたれです。pen4世代のCeleron1.8Gのノート。
会社パソコンなもので、ハード、ソフトともにアップデート不可です。
>>12 何をやりたいのか、よく判らないが
『フリーズしてまともに計算できない』コードにはバグがある可能性が
高い気がする
昔、同じくらいのマシンで数十分かかる処理をさせた事もあるが
この場合、無限ループに陥っている可能性を疑う
それと毎回セルに書いていたりする?
その場合、
Application.ScreenUpdating = False
とかは使っている?
フリーズ=単に時間のかかる処理の実行中でエクセルが反応しない の意味なんじゃね?
>>12 たぶん、プログラムをちゃんと作ればそんなに時間はかからないと思うんだけど、
その説明だけでは不明な部分がいくつかあるから具体的なプログラムが示せないんだよなあ
まず「ラインモード」ってなんだ?
たぶん、文章で説明するのはかなり難しいだろうから、現物を見た方が早い
そのデータとExcelのファイルは公開できる?
あとメモリはいっぱい積もうな。8Gなんて今余裕だろ。 これで100万件ぐらいでフリーズしない。
>>22 >>17 の状況じゃ無理だろう
まあ、このスペックでもこのデータ量なら動くと思うけどね
頭の弱いやつがいくら高性能パソコンでメモリいっぱい積んでも根本的な解決にはならん。
他言語でも同じ。
まず計算ロジックの見直しだな。
SUMIF()/COUNTIF()なんてのは論外だよ。
>>16 の言うとおり。
(10以下平均-9以下平均)、(11以下平均-10以下平均),,,,(30以下平均-29以下平均)をSUMIF/COUNTIFかよ。 ソートすりゃどうにでもなりそうだな。
ピボットテーブルでグループ化して平均出せばいいんじゃないの?
無駄ってことも無いとは思うが、昔納品した客から Excelのバージョンアップしたら色々問題が出て VBA使うPCのExcelを前のバージョンにしたと聞いた
>>27 このスレを見てればわかるとおり、VBAのエキスパートになる必要はないけど
Excelを使うならVBAは知ってた方が捗る
30 :
デフォルトの名無しさん :2011/02/24(木) 18:37:52.75
このスレを見てればわかるんですか?
VBAのエキスパートにならなくても ここで質問すれば解決って意味でしょ
32 :
デフォルトの名無しさん :2011/02/24(木) 20:37:23.79
B7からK19までを一行おきに色を付けたいと思い下の通りに 作ったのですがうまくいきません;;どこが間違っているか教 えて下さい。宜しくお願いします。 Sub test() For CellGyo = 7 To 19 Step 1 Range("B" & CellGyo & ":" & "K" & CellGyo).Select Selection.Interior.ColorIndex = 34 Next CellGyo End Sub
step 1 じゃなくて step 2 step 1ってことは、色を塗って、次はその下の行を塗る 1行ずつってことは、色をぬった行の2行下の行を塗るわけだ
34 :
デフォルトの名無しさん :2011/02/25(金) 12:12:12.41
>>33 ありがとうございます!理由まで書いて頂いて本当に助かりました!!
>>32 Sub a()
With Range("B7:K19")
.FormatConditions.Add Type:=xlExpression, Formula1:="=MOD(ROW(),2)=1"
.FormatConditions(1).Interior.ColorIndex = 34
End With
End Sub
良スレ
>>32 Sub b()
Dim R As Range
For Each R In Range("B7:K19")
If R.Row Mod 2 Then R.Interior.ColorIndex = 34
Next
End Sub
38 :
デフォルトの名無しさん :2011/02/26(土) 00:27:10.81
みなさん昨日はありがとうございました。VBAを始めてまだ数日なので、教えて頂けてとても助かります! 今日は4月度売り上げデータのシートの値を月別売り上げ報告書のシートに転記したくて次の様に作った のですがエラーになってしまいました;;どうしたらエラーにならないか教えてください。本を読みなが らやりましたが分からないのでどうか宜しくお願いします。 Sub 報告書作成() Dim CellGyo As Long Dim HoukokuGyo As Long Dim Tanto As String Dim Tokuisaki As String Dim Tiku As String Dim Gyoshu As String Dim Month As String Dim Uriage As Currency For CellGyo = 3 To 65536 Sheets("4月度売上げデータ").Select
39 :
デフォルトの名無しさん :2011/02/26(土) 00:28:53.04
続き@です Range("C" & CellGyo).Select Tanto = Selection.Value Range("D" & CellGyo).Select Tokuisaki = Selection.Value Range("E" & CellGyo).Select Tiku = Selection.Value Range("F" & CellGyo).Select Gyoshu = Selection.Value Range("H" & CellGyo).Select Uriage = Selection.Value If Tanto = "" Then Exit For MsgBox "処理が終了しました" End If Next CellGyo
40 :
デフォルトの名無しさん :2011/02/26(土) 00:29:43.70
続きAです Sheets("月別売り上げ報告書").Select For HoukokuGyo = 7 To 65540 Range("C" & HoukokuGyo).Select Selection.Value = Tokuisaki Range("D" & HoukokuGyo).Select Selection.Value = Tiku Range("E" & HoukokuGyo).Select Selection.Value = Gyoushu Range("F" & HoukokuGyo).Select Selection.Value = Uriage Next HoukokuGyo End End Sub
>>38 デバッグのやり方は経験を必要とするが、コードを書いたら
まず、メニューの『デバッグ』から『VBAProjectのコンパイル』を選ぶ
これにより、あなたのコードで、すぐ判るのは
Dim Gyoshu As String
で定義しているが
Selection.Value = Gyoushu
と書いているところがあり、これの定義がされていない
(つまり変数名が間違い)
なお、『ツール』メニューの『オプション』を選び、『編集』タグで
『変数の宣言を強制する』にチェックをつける事が前提
>>38 エラーが出たなら最低限どんなエラーが出たかぐらい書け。あとExcelのバージョンも書け
エラーの原因をエスパーすると、
4月度売上げデータのH列に数字以外が入ってる行がある
Excelのバージョンが古くて月別売り上げ報告書に65540行もデータを作れない
のどっちか。でもたぶんエラーでなくても思った通りには動いてないと思うけどw
Sub 報告書作成()
Dim CellGyo As Long
For CellGyo = 3 To 65536
If Sheets("4月度売上げデータ").Cells(3, CellGyo).Value = "" Then
Exit For
End If
Sheets("月別売り上げ報告書").Cells(CellGyo + 4, 3).Value = Sheets("4月度売上げデータ").Cells(CellGyo, 4).Value
Sheets("月別売り上げ報告書").Cells(CellGyo + 4, 4).Value = Sheets("4月度売上げデータ").Cells(CellGyo, 5).Value
Sheets("月別売り上げ報告書").Cells(CellGyo + 4, 5).Value = Sheets("4月度売上げデータ").Cells(CellGyo, 6).Value
Sheets("月別売り上げ報告書").Cells(CellGyo + 4, 6).Value = Sheets("4月度売上げデータ").Cells(CellGyo, 8).Value
Next CellGyo
MsgBox "処理が終了しました"
End Sub
やりたいのはこういうことじゃないのか
43 :
42 :2011/02/26(土) 01:43:43.61
>>41 うは、普通に見落としてたわ
ちなみに、『変数の宣言を強制する』は後からチェック入れてもダメだからな
あれは最初からコードの頭にOption Explicit入れてといてくれるだけだから
俺の感では今回はおそらくそのエラーではないと思うが
44 :
41 :2011/02/26(土) 07:33:55.33
>>43 実は、同感
何度か回答してきたけど、デバッグの基本的なやり方とか
書いておかないと、きりがない気がしてきたのでw
コンパイルとブレークポイントを覚えるだけで質問以前に
解決する事例も少なくないように思う
終了判定をループ外に出して シート名のハードコードも個人的に気持ち悪いので定数にしました。 Sub 報告書作成() Dim CellGyo As Long Dim GyoEnd As Long Const Read_Sh As String = "4月度売上げデータ" Const Write_Sh As String = "月別売り上げ報告書" GyoEnd = Sheets(Read_Sh).Cells(3,3).End(XlDown).Row If GyoEnd > 65532 then GyoEnd =65532 End If For CellGyo = 3 to GyoEnd Sheets(Write_Sh).cells(CellGyo + 4, 3).Value = Sheets(Read_Sh).cells(CellGyo, 4).Value Sheets(Write_Sh).cells(CellGyo + 4, 4).Value = Sheets(Read_Sh).cells(CellGyo, 5).Value Sheets(Write_Sh).cells(CellGyo + 4, 5).Value = Sheets(Read_Sh).cells(CellGyo, 6).Value Sheets(Write_Sh).cells(CellGyo + 4, 6).Value = Sheets(Read_Sh).cells(CellGyo, 8).Value Next CellGyo MsgBox "処理が終了しました" End Sub ただ、質問主さんが説明不足なので分かりませんが、 もしかしてこのシート、別々のブックだったりしませんかね? 同じブックの中でこんな転記したってあまり意味が無い作業のような・・・ 本来は、全体の売り上げデータが入ったブックから担当ごとのブックに転記、 という作業なんじゃないかなぁという気がします。 (それにしては担当者の選択処理が無いけど)
個人的な好みで言えば、同じオブジェクトを何度も参照する時はWith、 複数ある時は変数にまとめたいところ Set WS = Sheets(Write_Sh).Cells(CellGyo + 4, 3) Set RS = Sheets(Read_Sh).Cells(CellGyo, 4) WS.Offset(0, 0).Value = RS.Offset(0, 0).Value WS.Offset(1, 0).Value = RS.Offset(1, 0).Value 以下略 わざわざOffsetを並べてるのは、セル番号が不自然に飛んでるから、 あとで参照先を増やしたり減らしたり改造が必要になる可能性がありそうだから 修正箇所をわかりやすくするのが目的
47 :
38 :2011/02/26(土) 12:55:34.54
何のエラーか書いていなくてすみません。次からはちゃんと分かって頂ける ように書きます。エクセルは2007です。そして2つのシートは同じブックの ものです。 これは実際仕事で使うものではなく通信教育の課題です。もっと勉強して から課題に取り組めば良いのですが提出期限明後日なので・・・。 みなさんありがとうございました!!
GetAsyncKeyStateで何かボタンが押された処理はどうするのでしょうか Cでいうwaitkeyです Do If GetAsyncKeyState Then Exit Do Loop したいのはこういう感じです
言い忘れていました 引数を指定せずに何でもいいのです
>>50 >>49 を参考に出来ると思うのだが?
GetAsyncKeyState は、256 とおりの仮想キーコードのいずれかを指定することで
そのキーが押されたかどうか調べるわけだから、マウスボタン等の不要なキー以外の
いずれかが押されれば、Loopを抜ければいいんじゃないの?
まあ、Escキーを押されたらというのは工夫がいるかもだけど
まあ、最終的に何をやりたいかが判らないけど UserFormのKeyDownイベントで拾うという方法も考慮してもよいかもね
testtese
Private Sub Main() Dim c As Variant,i As Long c=ThisWorkbook.Worksheets("Sheet1").Range("A1:V17616") For i = 0 To 999999999999999 calc c Next i End Sub Main内で全く変更されない変数cがあって、その変数cがcalc関数にパラメータとして渡される場合 変数cはモジュールレベル変数とした方が良いか、ローカル変数とした方が良いかアドバイス下さい
訂正 全く変更されない ↓ c=ThisWorkbook.Worksheets("Sheet1").Range("A1:V17616")以降全く変更されない
Step 1 も忘れてた
>>54 変数等のスコープは可能な限り狭いほうがいい。
>>57 パラメータとして渡した方が良いんですか
ありがとうございました
>>57 それ、何故か?ということについて、
詳しく開設されている本とかサイト知りません?
その変数がどこで使われているのかとか判り辛くなるから。
一ヵ月後に修正とかしようとすると簡単に死ねる。
>>54 の例だと、cに設定した内容が他で参照される可能性とか
考えなくてはならなくなる。
ローカル変数なら、そもそもあり得ないから頭を使わなくて済む。
>>59 >>57 じゃないけど
友人がシステム保守の仕事をやっているわけだが
パブリック変数を安易に使うな!と怒っていたなw
パラメータで渡しておけばデバッグは相当楽になる
(大抵はその関数だけ見ておけばよい)
自分は一人で組んでいる場合は、パブリックに逃げる癖があるけどw
>>59 個人的には、
メソッドを後でコピペで再利用しようと思っても出来ない。
変数の状態が追跡しにくい。
その中でもフラグ系は特にひどいな。
>>61 >>62 なるほど。ありがとうございました。
今、高速化する方向で書いている最中なので気になりました。
>>63 可読性や安全性、バグの出にくさと処理速度は反比例するからねー
コア部分をうまくモジュール分けしてブラックボックス化するぐらいしか対応策はないと思う
引数渡しをパブリック変数化することで高速化? まずは本当にそこがネックになっているか確認したほうがいいと思うよ。
VBA でブロック変数って With しか思いつかないんだけど、
どこからそんな話が出てくるんだ?
そもそも
>>58 で、「パラメータとして渡した方が良いん
ですか」と言ってるし。
>>67 すみません。
>>57 から乗りました。
ブロック変数じゃなくてブロック内定義変数について
気になってました。
だから、そもそも VBA に With 以外のブロックなんてないだろ。
これ以上何か聞きたいなら、
>>52 のようにソースとともに書き
込んだほうがいいよ。
>>54 だったら定数化もありだね。
const付けられないから変数になっちゃうけど。
71 :
デフォルトの名無しさん :2011/03/01(火) 10:29:40.84
問題で月別売上集計のマクロを作成しないといけないのですがわからないのでどなたかおしえてください! 例えばセルB2からセルB299までに1年分の日付がランダムで入力されてるとします。 で、セルK2からセルK299に金額がランダムで入力されています。 マクロを使って月別の売上を出すにはどのようにしたらよろしいですか? 説明が下手で申し訳ないです
VBA使わずDSumでいけるという話だが あえてなおVBAならWorksheetfunction.DSum
73 :
デフォルトの名無しさん :2011/03/01(火) 11:04:52.81
ありがとうございます! VBAでしないといけないのです。。。 とりあえずWorksheetfunction.DSum でやってみます
74 :
デフォルトの名無しさん :2011/03/01(火) 11:54:19.80
何度もすみません 1月の集計 ○○円 2月の集計 ○○円 ・・・ と続くのですが月別にするのがわかりません。。。 またアウトラインを使わないといけないのですが 1、総計 2、月別 3、全体の表示 としないといけないのですがわかりません。 どなたかおしえてください
>>74 アウトラインって集計か?
集計とか統合はウンコだから覚えなくてよい。
ピボットテーブルを覚えりゃよい。
月でグループ化すれば簡単だ。
ピボットテーブル使えない人は日付でソートして同じ月の間だけ加算していくマクロになるが,、ピボット覚えた方が楽。
VBAでやるにしたって、ソートなんて必要ないだろ… 月をインデックスとした配列に順番に足すだけ
>>76 1年分の月に関しては確かにそうだな。
一般的なピボットの内部ロジックを書いた。
複数年の月別でも列が年で行が月とかなら次元配列でもいいか。
上は2が抜けた。
問題でって書いてるから、まあなんかの実習問題なんだろうけど それってVBAでやれって問題なのか? VBAでやるのにアウトライン使えとか普通ないだろ エクセルの機能とかの実習ならむしろVBAつかっちゃいかんのじゃないか
>>74 VBAで「ピボット操作して集計シートにコピペ」までやれば
「マクロを使って月別の売上を出」したことにならないかな。
同じ結果を出すなら、自作コードでやるより
エクセルの機能を使ったほうが明らかに動作速いし。
ワンタッチで全部済むと とても気分はいいけどな
84 :
デフォルトの名無しさん :2011/03/02(水) 13:38:32.17
置換について分からないことがあるので教えてください。 セルA1に文字と数字が入った ABC123DEFというような文字列があります。 この中の数字のみ(文字も数字も桁数は一定ではありません) 置換したいのですが、例えば0から200の間であれば置換 というようにReplaceを使った場合指定する方法はあるのでしょうか? お願いいたします。
>>84 ない
数字と文字を分けて数字の大きさを判断して置き換える、というプログラムを自分で作る必要がある
流れぶった切ってすみませんが、どなたか教えてください。 Win7 64bit、Excel2007、CPU Corei7 980X、メモリ12GB の環境です まず一地点分のファイル(新規ワークブック)を作成して、 次に 一日分のデータ(一つ30MBぐらいのcsvファイル)を開いて、 その中の一列(約43万行)を新規ブックにコピー クローズして次のcsvファイルを同様に処理、 一か月分で新規ブックを保存、 新たな新規ブックを作成 というのを30回ほど繰り返すマクロがあるのですが、 (つまり30地点、30日で計900回オープン、クローズを繰り返す) このマクロが処理の途中でよく止まりました。 (エクセルは起動しているがマクロは終了している エラーメッセージも特に無し) タスクマネージャで見てもCPU使用率もメモリ使用量も20%弱なので PCスペックの問題ではなさそうなのですが、 エクセル上のリソース不足を疑いました。 そこでWebで調べたら DoEventsという命令を実行させれば良いらしいと分かったので、 実際に試したら確かに止まらなくなりました。 ただ、なぜ効果があるのかが分からないのでちょっとモヤモヤしてます。 どなたか、DoEventsにどのような効果があるのか教えてください。
VBAからタスクが帰ってこないことを無限ループとみなしてExcelが強制的にストップさせてたのを DoEventsで定期的にExcelにタスクを回すことで処理が継続できるようになったとか 勘ですまん
>>84 正規表現で数字を取得してCintした数値を条件分岐すれば良い
89 :
86 :2011/03/02(水) 22:16:20.31
>>87 さん
どうもありがとうございます。
無限ループですか。
確かにForNextで地点ごとのループと、一月分のループをネストして
その中でひたすらオープン・コピー・クローズを繰り返してましたから
無限ループに近かったかもです。
処理を完走させるには10時間以上回しっぱなしで、
その間エクセルでは他の作業が一切出来ませんでした。
私はファイルオープンしたときに確保したメモリを
ファイルクローズ時にきちんと解放できていないのではないかと疑っていましたが、
理由はなんにせよ、
エクセルには止まるなら止まるで何らかのアナウンスをしてほしいところですね。
マクロ停止の理由はともかく、
それを何らのエラーメッセージも出さずにただ止まるだけというのは
アプリケーションの挙動としてどうかと思いますね。
90 :
デフォルトの名無しさん :2011/03/02(水) 23:26:44.73
splitに関してお聞きしたいことがあります。 セル内の最後の空白から前と後ろで分けたい場合 どのように記述すればよいでしょうか?
>>90 InStrRevで場所を特定して分割すればいいんじゃないか?
Splitで返された配列の最後の一つ以外を繋ぎ直す手も無くはないけど。
>>89 何となくですが、
Application.ScreenUpdating = False
が記述されていない気がします。
何回もオープン・コピー・クローズしたため、
描画の方に問題が生じた可能性は無いでしょうか?
>>89 >マクロ停止の理由はともかく、
>それを何らのエラーメッセージも出さずにただ止まるだけというのは
>アプリケーションの挙動としてどうかと思いますね。
いや理由は大事なんだが
VBAのエラーなのに何のメッセージもなく停止するのは確かにどうかと思う
が、あまりそういう状況は見たことがない
VABが無限ループしたからと言って、勝手に停止する機能も聞いたことがない
(スタック不足等のエラーで止まることはあるけど)
それらがDoEventsで解消される理由もわからない
あれは制御をいったんOSに戻すだけのものだが
(まあ、DoEventsについては不思議な副作用を起こすことはまれによくあるが)
実際にはエラーでとまってるのに、エラーハンドリングが適切じゃないので
だまって停止したように見えるだけじゃないかと思うんだが、差し支えなければ
実際のコードを晒してみてはくれないか
>>89 Application.Calculation = xlManual
も入れた方がいいな
今どきの64bitマシンで、ファイルをたった900個開く程度で落ちるなんて考えられん
計算してみると1ファイルあたり40秒もかかってることになるわけで
全体で10時間というのも、ちょっと遅すぎる気がする
いっぺんコード晒してみ?
95 :
90 :2011/03/03(木) 00:38:13.04
>>91 お陰さまで無事成功しました。
ありがとうございます。
ただ、こんなことで躓いていてはまだまだだなーと・・・
VBAだし43万行だし、40秒はあり得ない話ではなさそう ところでOffice 2007って32bitアプリじゃないの? 32bitプロセスってメモリ空間2GBしか使えないんじゃなかったかな。12GBの20%弱ってそれに合ってるよね。 メモリの問題ではないかもしれんが、もしかしたらDoEventsでガベージコレクトできるようになって、メモリが解放されたから動く、とか。
97 :
86 :2011/03/03(木) 00:47:46.46
>>92-93 どうもすみません、コードを出したくても会社のPCにしか入ってなくて
しかもデータの持ち出し禁止なのでちょっと提示できません。
一応、守秘義務契約もあるのでデータの詳細も明かせないのですが、
頭で覚えてる範囲で書きますと以下のような流れです。
Application.ScreenUpdating = False
Application.Calculation = xlManual
でシートの再計算と画面更新を停止
For i= 1 to 30 '地点ごとループ
転記用の新規ブック作成
For j=1 to 30 ’日を表すループ(実際の日数は31とか28とかの事もあります)
i地点、j日 のCSVファイルをひらく
新規ブックの J列にCSVのデータをコピー
CSVクローズ
Next j
i j を基にした名前で新規ブックを保存
Next i
シートの再計算と画面更新を再開
大体こんな感じです。
扱うデータの大きさはちょっと大きめですがマクロとしては至極単純なものだと思います。
エラー処理は入れてませんが、起こりうる可能性のあるエラーとしては
読み込み元のCSVファイルが存在しないとか、
保存するブックと同名のファイルがすでに存在する、などがありますので、
そういったエラーは起きないようにマクロ実行前にファイルの確認はしています。
(というかそういうミスではエラーメッセージがちゃんと出ます。)
・・・ちょっと自分でも分かりにくい説明なので、
明日にでもコードをきちんと確認して再度書き込みさせていただきます。
98 :
86 :2011/03/03(木) 00:52:25.74
>>95-96 すみません、
>>93 を読んでからリロードせずに書いてたので
気づきませんでした。
アドバイスどうもありがとうございます。
99 :
86 :2011/03/03(木) 00:54:40.63
あとCorei7 980Xは12スレッドだから、Excelが計算に2スレッドをフルに使えば20%弱だな たしか設定で使うスレッド数を決められた様な気がするから、増やせばもっと早くなるかもね
行数だけでなく列数も書いてもらえると、再現実験がやりやすくなるんだけどなあ
>>97 保証はできないけれど
For j=1 to 30 ’日を表すループ(実際の日数は31とか28とかの事もあります)
i地点、j日 のCSVファイルをひらく
新規ブックの J列にCSVのデータをコピー
CSVクローズ
Next j
の、CSVクローズの直後か直前に、新規ブックを保存 した方が良い気がする
昔、ワードのVBAで新規ファイルを大量にいじる処理をした時、
同様のエラーが出て、随時保存で解決した
ワードとエクセルは違うかもだけ、大量の変更履歴を内部的に
保持できなくなったのが原因の模様だった
>>97 それと
『エラー処理は入れてませんが』
とあるけど、転ばぬ先の杖で入れた方が良いと思う
ホント、世の中、びっくりするようなことが起きるもんだってw
>>97 五月雨式で、申し訳ないがもう一つ
それだけ長い処理だと、自動バックアップが影響しているのかも?
(結果的に
>>102 、あるいは自動バックアップをオフにするべきか?)
105 :
86 :2011/03/03(木) 07:38:10.09
>>100-104 おおっ!
みなさん有難うございます。
出勤前でばたばたしてますのでひとまずお礼のみで失礼します。
良かったらまた今晩よろしくお願いします。
とある文字列をA1からA1000までの中から検索するときに forとifで比較しながら探すのって馬鹿なんでしょうか・・・
forは使うけど、variable型配列に入れてInStrを使うかな
>>106 個人的信条ですが、プログラムは正しく動くなら問題なしです^^
ただ、より簡単な方法もあります
ご参考まで
Sub test()
Dim FindCell As Range
'A1:A1000の中から最初に"xyz"が入力されたセルを探します
Set FindCell = Range("A1:A1000").CurrentRegion.Find(What:="xyz")
If FindCell Is Nothing Then
MsgBox "検索に失敗しました"
Else
MsgBox "見つかりました"
FindCell.Select
End If
End Sub
109 :
108 :2011/03/03(木) 18:14:32.29
追記
>>108 の例ですと、部分一致の場合も見つかったと言いますので注意してください
完全一致のものを探すならば
Set FindCell = Range("A1:A1000").CurrentRegion.Find(What:="xyz", lookat:=xlWhole)
と、lookat:=xlWholeを指定の必要があります
110 :
108 :2011/03/03(木) 18:26:52.55
111 :
デフォルトの名無しさん :2011/03/03(木) 20:37:06.02
Excel2007 Sub settest() Const dataf As String = "test" Dim datafile_path As String datafile_path = "g:\data\" Set ws3 = Workbooks(datafile_path & dataf & ".xlsx").Worksheets("test") ←エラー部分 Set ws3 = Nothing End Sub インデックスが有効範囲にないってエラーになります ファイル及びtestシートの存在は確認しています 回避方法を教えてください
Excel 2003と2007、XP SP3またはVistaが対象です。 諸事情あって、VBAからWin32 APIを直接使っています。 DIBを使って画像処理をしているのですが、ワークスペース上の画像を 直接LoadImage(API)するような荒業ってありますでしょうか。 今は、SaveAsを使いxlhtml形式でまるごと保存>そのうち画像ファイルをLoadImageでメモリ上にロード >保存しているファイルを削除・・・・という方法でやっていますが、どうにも泥臭くて・・・。
>>111 Workbooksの使い方が間違っているとおもう
Workbooks(....)は既にオープンされている ブックにしか使えない
Set wb = Workbooks.Open(datafile_path & dataf & ".xlsx")
Set ws3 = wb.Worksheets("test")
又は
Set ws3 = Workbooks.Open(datafile_path & dataf & ".xlsx").Worksheets("test")
後処理で ブックを クローズ(場合によってはセーブ)する事を考えると前者の方が良いと思うけど
wb.Close とかね
グラフに誤差範囲をVBAでつける事って可能ですか? ユーザー設定でマスを指定したいです。 可能ならばやり方をお教えください。 windows7 SP1でExcel2007です。
116 :
86 :2011/03/04(金) 01:20:52.85
86です。昨日の続きをよろしくお願いします。 必要ない部分は省きましたが大体こんなコードです。 モジュールの頭に Option Explicit Option Base 1 が書いてありまして、 Application.ScreenUpdating = False Application.Calculation = xlManual も実行済みです。 また、下記変数は親プロシージャから引数として渡してます。 Dim Mnth As Long '月 Dim Yr As Long '年
117 :
86 :2011/03/04(金) 01:22:26.42
Private Sub ファイル集計(ByVal Yr As Long, ByVal Mnth As Long) Const POINT_COUNT = 30 '地点数 Dim MyLdPth As String '読込元のパス Dim MySvPth As String '保存先のパス Dim MyFldr As Variant '地点名 Dim MyNwBk as Workbook '新規ブック Dim i As Long Dim j As Long MyLdPth = "C:\****\****\" MySvPth = "C:\****\****\" MyFldr = Array(***,***,***,***,……) '各地点の名称セット For i = 1 to POINT_COUNT Set MyNwBk = Workbooks.Add(xlWBATWorksheet) '本来はここに1列目に時刻、1行目に日付を入れる処理が入ってます。 '約43万行とは0.2秒刻みで24時間 = 43,2000行です。 For j = 1 to MnthCnt(Yr, Mnth) '月の日数はFunctionで処理してます Workbooks.Open(MyLdPth & MyFldr(i) & "\" & Format(i,"00") & "_" & Yr & Format(Mnth,"00") & Format(j,"00") & ".csv") With ActiveWorkbook.Sheets(1) .Columns(4).EntireColumn Copy Destination:= MyNwBk.Sheets(1).Cells(2,j+1) End With ActiveWorkbook.Close '**** ここにDoEvents を入れたら止まらなくなりました。 **** DoEvents Next j MyNwBk.Close SaveChanges:=True, FileName:= MySvPth & "\" & MyFldr(i) & "_" & Yr & Format(Mnth,"00") & ".xlsx" Set MyNwBk = Nothing Next i End Sub
118 :
86 :2011/03/04(金) 01:23:18.98
'月の日数を求める関数 Private Function MnthCnt(ByVal Yr As Long,ByVal Mnth As Long) As Long Select Case Mnth Case 1, 3, 5, 7, 8, 10, 12 MnthCnt = 31 Case 4, 6, 9, 11 MnthCnt = 30 Case 2 MnthCnt = CDate(Yr & "/03/01") - CDate(Yr & "/02/01") End Select End Function 現時点で(DoEventsがあれば)問題なく動作してますので ループ中でのブック保存などは入れてません。 現状でもファイルのオープンとクローズ(セーブ含む)に一番処理時間がかかって いるので、ループ中に保存処理を入れると処理速度が極端に遅くなりそうです。 エラー処理については、 何をチェックすべきかも良く分かっていません。 先にも書いたとおり ループ中でオープンするファイルは確実に存在しているので、 他にチェックすべきものが思いあたらないです。
119 :
86 :2011/03/04(金) 01:36:28.13
>>117 におかしなところがありました
正しくはこうです
With ActiveWorkbook
.Sheets(1).Columns(4).EntireColumn Copy Destination:= MyNwBk.Sheets(1).Cells(2,j+1)
.Close
End With
>>117 Workbooks.Addでは追加したブックがアクティブになるとの記載があるが
Workbooks.Openにはその保障はなさそうだ(EXCEL2007のヘルプによる)
なので With ActiveWorkbook.Sheets(1)のなか辺りでエラーが出てる可能性はある
その位置でDoEventsいれて正常に動作するなら、連続でオープンクローズすると
思ったブックがアクティブになってないのが改善してるのかもしれん
OS側の処理が追いついてなかったのがDoEventsで改善されてる可能性が無いわけでもないが
いちど
Workbook.open ...
With ActiveWorkbook...
を
With Workbook.open ...
にして、DoEventsなしで動くかみてみたら?
ちなみに、行全部コピーして、行全部じゃないRangeに張りつけって、正常に動くのか?
>>120 セルのコピペの動作は手動でやるのと同じだよ
選択範囲のサイズが違った場合は一部が切り取られたり、同じ物の繰り返しになったりする
全データコピーなら、あまりいい方法じゃないね
122 :
86 :2011/03/04(金) 03:58:15.55
>>120 ありがとうございます。
実は明日から3日間休みなので、次にPCさわれるのが月曜日でして月曜日に確認したいと思います。
>ちなみに、行全部コピーして、行全部じゃないRangeに張りつけって、正常に動くのか?
すみません、
これに関しては実はこの辺うろ覚えで書いたんで間違いかもしれないです。
会社のPCではUSBメモリその他のメディアが使用禁止なので、
VBE開いて該当部分を手書きでメモにしまして、
さらに家のPCにはエクセルが入ってないので
手書きのメモを元にメモ帳で書いたのをレスとして貼り付けました。
ですので若干おかしなこと書いてる可能性があります。
改めて確認しなおして月曜日以降に報告させていただきます。
勝手ながら今日はこれにて失礼します。
123 :
デフォルトの名無しさん :2011/03/04(金) 07:19:11.15
>>113 遅くなってすいません。ありがとうございました。
>>118 DoEventsを入れて動くのであれば、完成としてもよいかもしれない
そもそも、最初の質問が『DoEventsにどのような効果があるのか』なので
それについて考えてみた
DoEventsは、制御を一時的にOSに渡すための命令で使う例としては
数時間かかるような処理を、ボタンのクリックで中止させるような場合に
使われる
この場合、メイン処理のLoop中で、ある変数がTrueならば処理を抜ける、
さらにボタンを押すとその変数にTrueをセットするという書き方ができるが
DoEventsを使わないと、『ボタンをクリックした』というイベントが
メイン処理が終了するまでExcelに伝わらない
上の例では、人間が起こしたイベントが処理されないというものだが、
OSやExcel自身が起こしたイベントも処理できないと推測できる
質問者の例でいえば、Excelのでかいデータをスワップさせようとして
上手くいっていないのかもと推測した
>>121 いやだから、手動でやると、コピー領域と貼り付け領域の形が違うため...
ってエラーになるんだが?
Private Function hoge(c As Long) As Boolean If c > 0 Then hoge = True '------(a) End If If c < False Then hoge = False '------(b) End If End Function たとえばこういうプロシージャがあって、cが正の値だったとき (a)の所で呼び出し元に戻ると思ってたのですが実際は If c < False Thenまで処理が行きました これが普通なんですか?自分はC言語のreturnと同じだと思ってたのですが
訂正 自分は hoge = True はC言語の return 1; と同じだと思ってたのですが
訂正 Private Function hoge(c As Long) As Boolean If c > 0 Then hoge = True '------(a) End If If c < 0 Then hoge = False '------(b) End If End Function
普通です いやでしょうが hoge = True '------(a) Exit Function と書いてください
>>129 そうやるんですか!ありがとうございました!
c == 0の時どうなるのか気になる・・・
>>131 False
Booleanのデフォルトの値はFalseだから
うん、VBAってhoge = c > 0って表記できなかったっけ?
>>133 普通はそうする罠
Private Function hoge(c As Long) As Boolean
hoge = c > 0
End Function
これなら
>>131 みたいな疑問は湧かないし、
>>132 みたいな知識がなくてもわかる
137 :
134 :2011/03/04(金) 19:40:30.59
138 :
135 :2011/03/04(金) 19:41:19.70
ごめん 134でなくて135でした
ATPVBAEN.XLAM!Histogramで作成したヒストグラムのグラフを 任意の位置、大きさに表示することは可能ですか?
140 :
デフォルトの名無しさん :2011/03/05(土) 00:01:17.85
WorkSheetFunction.matchって#N/Aは返さないんだよな? on error resume next val = WorkSheetFunction.match blnIsFind = iif(err.number=0, true,false) on error goto 0 みたいな使い方にしないと駄目?
>133 これって (hoge=c)>0 って解釈されないのかな? =は比較演算子としてより優先して代入演算子として解釈される?
試せ 以上
>>141 >これって (hoge=c)>0 って解釈されないのかな?
されない。
VBA は、C と違って、文を書くところに式は書けないなら hoge = c > 0 の
"=" は、代入演算子にしか解釈されない。
>>142 ,143
試した
(Let)a=b=cだとb=cの比較結果をaに代入
if a=b=c then...だとa=bの比較結果とcを比較
代入文だと最初の=は代入演算子なのね
で、比較式として使うと比較演算子として解釈される
比較も代入も同じ記号だけど、文脈で完全に区別されるのね
ビジュアルプログラミング言語というものがあるようですが 将来的にEXCELもそんな感じにならないものでしょうか?
そんな余裕があるなら、とっくにVBAから.NETベースに切り替わっていたと思う。
.NETに移行しやすいVBAの記述法 ・BASE 1を使わない ・Variantを使わない ・クラスモジュールを使う ・コレクションとかディクショナリ、FSOを使う
>BASE 1を使わない むしろ配列のインデックス0を使わない(作らない)方が分り易い。 Excelが絡む時は、VB.NETでも下限値1の配列を作ることがあるな。 >クラスモジュールを使う 使う事で大分判り易くなる時くらいか。 VBAの実装は中途半端過ぎて、よっぽどでないと使う気が起こらない。
セルの値がVariant型だからVariant使うのはしょうがないもんね。
つーかExcel VBAやってる人が VB.Net移行なんてするの? VSTOでも使う気?
そんなもん人によるだろ
例えばどんな場合? Excel捨てるの?
その前にVBAをVBにしてくれ 変な制限が多すぎる
スタイルを削除したいのですが、 vbaで削除をしようとしても削除出来ないスタイルがあります。 削除出来ないスタイルは、スタイル名がハングル文字のみだったり、文字化けしているスタイルなのですが、削除する方法はありますか?
ファイル名に特定の文字列がある場合処理を分岐したいんですが If ファイル名 = "特定の文字列*" Then で引っかからないんですが何故でしょうか 特定の文字列* の所はファイル名そのものにすれば引っかかりますがそれでは意味ないし どなたかお願いします
>>157 早いレスでとても助かりました
LIKEとかすっかり忘れてました。本当にありがとうございます。
>>155 名前で指定できない場合はインデックス番号で指定
>>159 インデックスを指定して削除をしてみたのですが、
上手くいかないようです。
for each でも削除出来ないようです。
>
>>155 >名前で指定できない場合はインデックス番号で指定
>>152 VBAじゃ無くてVB6以前から移行するのはよくあるよ
162 :
デフォルトの名無しさん :2011/03/07(月) 16:16:48.65
質問です VBEで セルA1を指定する つもりで次のように入力し実行すると Sub test() Cells("1,2").Select End Sub なぜかセルL1が指定されてしまいます
>>162 Cells(1, 1).Select
または
Range("A1").Select
>>162 は
>>163 で解決だが、Cells("1,2").Selectだと何でL1が選択されるんだ?
数字を色々変えてみるが理由が分からん。
そうか、カンマが無視されてCells(12).Selectと同じってことだな。 Excel2003でCells("2,5,7").Selectなら多分A2だな。
166 :
162 :2011/03/07(月) 21:13:26.55
>>163 ありがとうございます
解決しました
>>162 は一部数字が間違っています ("1,2")→("1,1")
>>165 試してみたら確かにA2になりました
端っこまでいって二列目に来たということですか?
もうひとつ質問です
今は無料のホームページを参考にしていますが
VBAを効率よく学習するにはやはり参考書を買ったり
教室に行ったりする方が良いのでしょうか?
>>166 本を自宅で読むのなら、ホームページを見るのと変わらない
電車の中とか、空いている時間を活用するならそれでもいい
勉強する上で、一番大事なのは質問できる相手がいること
そういう意味では教室へ行くのがいいかもしれない
>>166 そう端っこまでいって2行目に来たってことだ。
Range("B1:D2")(5).SelectならC2が選択される。
VBAの勉強なら教室行っても無駄だと思うなぁ。
とにかく何か作ってみることだな。
動けばよいって程度なら3か月もすれそれらしきものは作れる。
dim d as new Scripting.Dictionary は、 for each k in d.keys() や for each k in d.items() で ループさせるときにaddした順序が保たれることは保障されますか? VBAに限らないとは思いますが。
>>171 やってみりゃわかるだろ?
保障されるんだよ。
Dictionaryに限らずFor Eachじゃ順番が保障されないなんていうDQNもいるが、いままで順番を外れたのを見たことないわ。
Microsoftの場合、そこら辺は大抵無難に作ってあるよね。 .NET互換のMonoとかは容赦なく保障しない作りになっているようだけど。 まあ、ドキュメントに記述されていない暗黙の了解があっさり覆されて 痛い目にあったりする事も間々あるから、慎重になる気持ちも解る。
一応Microsoftの公式見解はFor Eachの順番は保障しませんってことじゃなかったっけ? 実際は順番通りだけどね。
知恵を拝借 Application.GetSaveAsFilename(initialfilename:="C:\test.txt"... と指定し実行するとダイアログ窓がでて ファイル名前後に "(ダブルクォーテーション)が入ってしまう ファイル名欄に "test.txt" と出てしまう "(ダブルクォーテーション)を取るにはどうすればいいのでしょうか?
コードを記述して完成したら F8 で一行ずつ確認して 正常に動くのを確認してから、マクロを実行したらエラーは 出なかったのですが、確認したのと違う動きになりました。 その後何度もF8で一行ずつ確認したのですが、正常に 動きました。なのでコードやセルの設定は間違っていない と思うのですがこのようなことはあるのでしょうか?? また対処法があれば教えていただけないでしょうか? 分かりにくい文章ですみません。 i = .Range("A1").Value If i <= 76 Then .Range("B1:C1").Value = "20" .Range("D1:F1").Value = "g/L" Else: .Range("B1:C").Value = "-" End If このようなコードなのですが、 i<=76の時に 20 g/L となるはずが - g/L となってしまいます。
>>175 すくなくともこっちで実験したらそうならなかった
環境をちゃんと書け
>>176 g/Lを消し忘れてるだけじゃないのか?
>>177 いいえ、”20”が入るはずのセルに”-”と
ハイフンが入ってしまうのです。
ハイフンは ELSEの判定の時のはずなのに。
>>178 いろいろコードが間違ってると思うが、とりあえず確実にELSEに行ってるなら
A1に入ってる値が数字じゃないと思われ
i = .Range("A1").Value のあとで、iの型確認してみ
iを数値型で宣言してある?
>>179 の言うような、評価が正しくされてない可能性がある
クイックビューかなにかで値を確認して初めて数字評価されて
デバッグ中だと正しく比較されるけど
通常の実行時は型の評価が遅延されてうまくいかない、って現象はある
確かめ方は、i <= 76 を i > 76にして、ifとelseの中身を交換してどうなるか見てみることだね
>>171 が保証される旨の記載ってどこかにないの?
>>179 、180
iはDoubleで宣言しています。
ELSEに行っているのではなく、
If i <= 76 Then
.Range("B1:C1").Value = "20"
.Range("D1:F1").Value = "g/L"
の部分の"D1:F1"セルは"g/L"が表示されるのですが、
"B1:C1"セルのみ"20"が"-"になってしまい、TRUEとELSEの処理が
ごっちゃになっているのです。
>>182 そもそもRange("B1:C")なんて言う指定はエラーだと思うが
コード晒すなら正確に。あとその前後も晒せ
とくにwithのあたりとか、ループしたりしてないかとか、ifのネスト無いかとか
>>181 A Dictionary object is the equivalent of a PERL associative array.
WindowsSDKからのコピペだけど、PERLの連想配列と同等と書かれているから、
あくまで、キーと値のペアの配列として保持されていると考えて良いんじゃないかな。
よって、KeysやItemsも追加した順で返されると。
KeysやItemsの説明には、配列に含まれる全ての〜を返す、としか書いてないけど。
>>182 だからそのifあたりぼ書き方がおかしいかもしんないから検証しろっつってんだろカス
もう勝手にしろ
>176 Else の後ろのコロンを抜いて、 改行してから次の文をかく。 VBのコロンはただの行ラベル。
On Error Resume Nextが書いてあり、Elseの綴りが間違ってるに1000億ジンバブエドル。
188 :
187 :2011/03/09(水) 13:11:03.79
On Error Resume Nexは関係ねーか。 変数の宣言を強制してないでElseの綴りを間違ったんだな。
遅くなりましたが、156です。 削除出来ないスタイルは、バイナリを直接編集して、スタイル名を変更することで削除することが、出来ました。
190 :
175 :2011/03/09(水) 20:32:54.40
分かりました InitialFileNameで設定するファイルの拡張子と FileFilterで設定する拡張子が異なる場合(ファイル名を test.txt にしてfilterを *.xlsにした場合など) "(ダブルクォーテーション)が付くことが分かりました スレ汚し失礼しました
187だがOption Explicitも関係なしか。
Elseの綴りを間違って、ただの行ラベルになってしまったんだな。
綴りを間違わなければ行ラベルにはならんけど、どっちにしても
>>186 が言うように普通の書き方はにすべきだな。
1ページに10行ある表があり印字データが1〜10件の場合は そのまま1ページに印字して10件以上のデータがあった場合は 改ページプレビュでデータ件数の最後までを1ページに印字する 設定は可能でしょうか? もしくは件数に応じて表の行の高さを変更させることは可能でしょうか? どうかお知恵を貸してください。お願いします。
182です。 昨日皆さんのアドバイスを頂いてからいろいろ検証してみました。 179さん、180さん、186さん、189さんおっしゃった通りに すべて見直し、検証した結果上手くいきました。 原因としては他のモジュールで .Range("B1:C1").Value = "-" のコードがあり、記述途中での添削ミスでした。 こんな単純なミスを見逃し、みなさんを混乱させて 申し訳ありませんでした。 レスを下さった皆さんありがとうございました。 大変お騒がせいたしました。
>>193 VBA使わなくても出きるような気がするが.....まあイイか
常に1ページにしたいなら
PageSetup オブジェクトで
Zoom = False
FitToPagesWide = 1
FitToPagesTall = 1
で出来ると思うよ
後 行の高さを変更するには RowHeight プロパティを使う
196 :
193 :2011/03/10(木) 01:19:52.34
>>195 ありがとうございます。
手が空いたら実践してみようと思います。
197 :
デフォルトの名無しさん :2011/03/10(木) 23:58:15.65
自分で作成したユーザーフォームのことについて質問です。 現在は開発タブからVBを開いて実行という形をとっていますが これらの操作をショートカットや他の方法で簡略化することは可能でしょう? 何か解決策ありましたら教えてください。
>>197 フォームを呼び出すマクロを作れば、マクロには自由にショートカットキーが設定できる
保護について教えて下さい。 シートを保護する時にロックをしてるセルを選択出来なくなる する奴あるじゃないですか? あれをやると時々エクセルの挙動がおかしくなります。 矢印キーが効かなくなったり アクティブセルの周りに普段なら出る黒い枠線が出なかったりとか。 スクロールロックが掛かってるとかそんなんじゃないです。 ロック有り無し関係なくして、シートイベントで制御した方が良いでしょうか? 前から時々なってて、ぐぐって調べたんですが 特にこれと言って解決策が見つかりません。 これだという絶対的な発生条件も不明です。なったりならなかったりします。
>>197 一応ショートカットです。
Alt+F8 マクロの実行
とか
Alt+F11 VBEの起動
とかはどうですか?
202 :
197 :2011/03/11(金) 13:31:31.80
203 :
デフォルトの名無しさん :2011/03/12(土) 07:46:57.11
別のPCのエクセル2003で作成したマクロを、別のPCのエクセル2010で動かそうとすると、 「マクロが実行できません。このブックでマクロが使用できないか、 またはすべてのマクロが無効になっている可能性があります。」 と表示されます。エクセル2010で作成したマクロは2010で当然動きます。 なにが理由か分かりません、助けてください。
>>203 まくろが無効になってるから。
マクロ有効ファイルで保存しなおすか、
オプションでマクロの設定を変更するか、
信頼できる発行元の設定をすればいける。
無効になってたら2010も無理なんじゃね?
206 :
デフォルトの名無しさん :2011/03/12(土) 14:56:38.84
>>204 信頼できる発行元以外は全て設定しました。
>>205 なぜ無効になるのでしょうか?なんか分かります?
208 :
204 :2011/03/12(土) 16:57:07.81
>>206 .xlsm形式でブックの保存をし直してみましたか??
209 :
デフォルトの名無しさん :2011/03/12(土) 19:17:14.67
>>207 うん。試してみます。
>>208 はい。マクロ有効のファイルにしましたがダメです・・・。
210 :
デフォルトの名無しさん :2011/03/12(土) 19:26:05.43
>>210 なんでかって言われると、マクロを悪用したトラブルが世界中で起きたから、
簡単には使えないように制限をかけたんだよ。
マクロを使うには、まずマクロ有効ブックとして保存しなおしたあと、
そのファイルを保存したフォルダを「信頼できる場所」に登録しなきゃいけない。
212 :
デフォルトの名無しさん :2011/03/13(日) 22:06:13.43
>>211 有効ブックにして信頼できる場所にしています・・・。
>>212 もしかして64bit版Excelだったりしない?
32bitのマクロはそのままだと使えない機能があるんだけど
public const が良く分かりません Public test as Range Public const test = range("A1") sub a() test.value = 1 end sub このように使いたいのですがうまくできません どうすればいいでしょうか
215 :
デフォルトの名無しさん :2011/03/18(金) 17:00:54.87
うまくできません って言われてもな エラーが出るのか処理が思った通りに行かないのか エラーが出るならそのメッセージを、 思った通りに行かないのなら現在どうなっていてどういうふうになってほしいのか そういう情報を書け
>>214 こうか?
Sub a()
Dim rangeA1 As Range
Set rangeA1 = Range("A1")
rangeA1.Value = 1
End Sub
BMPのピクセル情報を取得して1ピクセル=1セルとして扱って エクセルで画像を再現できると聞いたのですが詳しく教えてくれませんか? VBAでそういうことできるらしいのですがまったくわかりません 誰かわかりやすい解説サイトのURl貼るか解説してくれませんか?
>>217 別に難しいことじゃないだろ、そんぐらい独学でやれよ
BMPのピクセル情報を取得する方法を調べる
セルの背景色を設定する方法を調べる
分ったら、とりあえずBMPのピクセル情報を一つ一つ調べて、それに基づいて
セルの背景を設定していく
ただそれだけだ
219 :
217 :2011/03/19(土) 10:03:18.56
その調べるってのがわかんないんですけど… 馬鹿ですかあなた?
220 :
デフォルトの名無しさん :2011/03/19(土) 12:20:02.65
VBAでADOを使ってデータをCSVから読み込む時、 金額列が一行目に5000、100行目に99999999999 という感じであるとRecordSetがintegerとして型を扱うのか、 100行目のデータがnullになってしまいます。 RecordSetの型認識を明示的に行う方法ってあるでしょうか。 order by 金額 descとすればいけるかと思いましたが、 金額列が複数あるので、その方法では解決しなさそうです。
いっそのこと、Getstringメソッドで文字列として読み込んで後で数値に変換するとか
2,147,483,647 99,999,999,999 vbaのlong型だと、何があっても不思議じゃない数字だね。
>>220 せめてプロパイダ何使ったかぐらい書け
Jetならschema.ini書けば行けるんじゃなかろうか
>>218 ありがとう
調べても急にプログラミング言語が云々とか出てきて
具体的にどういうことをしてそうなるのかがわからなかったんだ
それがわかっただけでもマジ助かったわ
サンクス
225 :
デフォルトの名無しさん :2011/03/19(土) 23:58:51.18
私はVBA初心者です。質問させていただきます。エクセルで、キーボード入力で 遊べる簡単なゲームを作りました。一応、ゲーム中は問題なく遊べるのですが、 ゲーム終了直後に多くのセルに文字が入力されてしまいます。ゲーム中に押した 「z」や「→」などの入力が、ゲーム終了直後にシートに反映されてしまっている ようです(おそらく)。それらの文字を毎回消すのは面倒なので、どのように すれば文字だらけにならないで済むか教えていただきたいです。 Declare Function GetAsyncKeyState Lib "User32.dll" (ByVal vKey As Long) As Long sub ゲーム() Do while ゲーム継続条件 If GetAsyncKeyState(40) <> 0 Then ・ ・ ・ end if Loop 一応、こんな流れです。
>>225 最後に全データを消せばいいのでは
Cells.Clear
227 :
デフォルトの名無しさん :2011/03/20(日) 01:42:35.95
>>226 レスありがとうございます。
そのシートには、ゲームの途中経過や記録など、消えてほしくないデータもたくさん
あるので、全データを消すわけにはいきません。また、一応最後にcells.clearを書いて
見たところ、他のデータはすべて消えましたが、その後に「z」などが入力されてしまい
ました><
チェンジイベントで消せば
229 :
デフォルトの名無しさん :2011/03/20(日) 02:52:57.32
>>228 レスありがとうございます。
チェンジイベントで消すという発想はなかったです!ゲーム終了直後にセルに文字が入力
されることに変わりはないので、セルが高速で選択されまくるのは少し気になりますが、
それらを手作業で消す必要がなくなったので問題はありません。ありがとうございました!
エクセルのマクロで斜めの波線(ジグザグ線?)は引けないでしょうか? A1セルの左上からC3セルの右下まで波線を引いたり、 A1セルの左上からA3セルの右下まで波線を引けると助かります。
232 :
デフォルトの名無しさん :2011/03/20(日) 15:08:58.53
前スレで2003のエクセルマクロが2010で動かないのを質問した者ですが、 オリジナルページではマクロが動くことが分かりました。 使用するときはこのオリジナルページの新規作成ボタンを押して、 新たなエクセルファイルを作成するのですが、この新作成したマクロの パスが新規作成ファイルのパスになっており、全てのパスをオリジナルに 設定しなおさなくてはなりません。設定せずに済むなにか良い方法はないでしょうか?
>232 いまいちわからない。オリジナルページってなんだ? あとパスを設定?書き換える?にしても、 なに用のパスを変更するかわからないと手出できない。 とりあえず、そのマクロを作った人に聞いたほうがいいんじゃないか?
>>234 ' ほい。できたよ
' セルを選択してから実行すると
Sub 選択範囲に斜めの波線を引く()
p = 1.4 ' ピッチ この数字に比例して波が大きくなる
With Selection
w = .Width
h = .Height
x = .Left
y = .Top + h / 2
l = Sqr(w * w + h * h)
With ActiveSheet.Shapes.BuildFreeform(msoEditingAuto, x, y)
For i = 1 To l / p
x = x + 2
y = y + 2 * Sgn(i Mod 4 - 1.5)
.AddNodes msoSegmentCurve, msoEditingAuto, x, y
Next
.ConvertToShape.Select
End With
With Selection.ShapeRange
.Width = l
.Height = .Height / 2 * p
.IncrementTop 2
.IncrementLeft (w - l) / 2
.IncrementRotation Atn(h / w) * 180 / 3.1415927
End With
.Select
End With
End Sub
236 :
235 :2011/03/21(月) 03:18:30.50
一カ所修正 下から7行目、破線の位置を決めてる部分だけど 画面上で見る場合はこの方がピッタリになる .IncrementTop 2.3 - p * 1.1 印刷時はまた違ってくるだろうけど、今すぐには確認できん
>>230 線の外に文字でも入力するの?
そうじゃなきゃセルを結合すれば簡単
>>237 どうやるの?
罫線だと波線は選べないよね
できあがった波線をマウスで左に移動しようとしても、A列の端まで持っていけないね 面白い現象だ
一つの音源を再生するのはできるんですが 一つの音源の音の高さを変えて再生することって可能ですか?
転職用のアピール材料として、アプリを構築した。そんで、提案書とサルでも分かるような仕様書も作った。 転職の際、同じことした御方みえますか?
beep音って同時に複数流せる?
マウスホイールでアクティブセルの値を上下することはできますか?
>>245 ホイールイベントをフックするぐらいしか思いつかん
247 :
デフォルトの名無しさん :2011/03/25(金) 12:52:21.32
空白のセルではなく、セル内の空白行、例えばA1に あいう (空白行) えおか という文字があった場合、その空白行を消して あいう えおか というように詰める事は可能でしょうか? 分かる方いましたら教えてください。お願いします。
>>247 サンプル書いた
Sub Sample()
Worksheets("Sheet1").Columns("A").Replace What:=Chr(10) & Chr(10), Replacement:=Chr(10)
End Sub
249 :
247 :2011/03/25(金) 20:24:54.73
>>248 お答えくださってありがとうございます。
再度質問よろしいでしょうか?
Chr(10)がラインフィード文字というのは分かりましたが
何故Chr(10) & Chr(10)が空白行の検索ということになるのか
そしてReplacement:=Chr(10)に置換することによりどうして空白行が無くなるのか
いまいちわかりません。
それと、Cells(1,1)というようにして記述したい場合どのようになりますか?
よろしくお願いします。
>>249 改行2個で空白行になるから、1個なら単なる改行になる。
A1のみならReplace関数でもいい。
With Cells(1, 1)
.Value = Replace(.Value, vbLf & vbLf, vbLf)
End With
A列を置換なら
Range("A:A").Replace vbLf & vbLf, vbLf
251 :
デフォルトの名無しさん :2011/03/26(土) 07:13:00.18
おたずねします。 グラフエリア上にツールバーからコンボボックスを作りました。 @[コントロールの書式設定]でリストの入力範囲を設定し、 A[マクロの登録]で、VBエディッタにコードを作成できたのですが、 コンボボックスでクリックされた値をAのサブプロシージャ-で取得する 方法がわかりません。ヒントでよいので、お願いします。
追伸: つまり、グラフエリア上に作成したコンボボックスのコードとして記述するための名前がわからないのですが、、、
シートセルをVariantで配列に入れた後、その配列をRange変数に入れる方法ってないですか? Application.WorksheetFunction.StDevとかに使うためにやりたいです
だからその普通がしりてーんだよボケカス
>>254 サンプル書いた
Sub Sample()
Dim WS As Variant
Dim R As Range
Set WS = ActiveSheet
Set R = WS.Cells
End Sub
258 :
254 :2011/03/26(土) 15:06:42.44
>>243 > 転職用のアピール材料として、アプリを構築した。そんで、提案書とサルでも分かるような仕様書も作った。
> 転職の際、同じことした御方みえますか?
あるよ
>>243 運悪くコードオタクとかがその会社にいたら、中身見られて汚いコードだから不合格とか言われるかもw
Selectだらけのど下手でもプロとしてやってる奴いたりするから会社次第とは思うが。
俺は恥ずかしくてそんな事出来ない。 新卒だったら考えるけど
>>261 お前のコードはそんなに恥ずかしいのか?
コードじゃなくて、そういう幼稚なアピールの仕方が恥ずかしいのでは?
ならどうやってアピールする?
それは自分で考えるべきだ
他人と同じ事やったんじゃアピール弱いもんな
デザイナーとかだと作品を持ってくるのは当たり前みたいだが。 プログラマの能力を見るにはコードを見るのが一番だけど、 持ってこさせないのは面接官がコードを読めないんだろうな。
268 :
デフォルトの名無しさん :2011/03/27(日) 14:35:32.50
面接するのは人事の人間であってプログラマが見るわけじゃない(一般的には)
>>267 そんなのは当たり前だが、プログラマがVBAってのがダメダメすぎw
つーかVBAじゃまともに能力計れないし
小学生のソフトボール投げが、大人になると砲丸や槍になるように
VBAで能力計れるのは、精々中学生1年生まで
少しは評価してやれよ VBAは便利だぞ
VBA自体は評価してるし、便利なのも認める しかしVBAでアピールしようとする奴は、評価に値しない
転職先がプログラマだとはどこにも書いてない 構築したアプリがVBAだとはどこにも書いてない まあ、スレ違いだからこれ以上はよそでやってくれ
> 転職先がプログラマだとはどこにも書いてない そこはどうだろうと関係ない部分だけど? > 構築したアプリがVBAだとはどこにも書いてない ここはVBAスレなんだから、VBA以外でアピールする話をVBAスレでしてるなら まともな判断能力が欠如してるってことで、それこそ就職どころじゃないw
274 :
デフォルトの名無しさん :2011/03/27(日) 20:07:30.07
エクセルマクロ初心者です。誰か教えてください。 以下のマクロがあったとします。 【例@】---------- Sub テスト1() test1-1行目 test1-2,3…n行目 End Sub Sub テスト2() test2-1行目 test2-2,3…n行目 End Sub Sub 一括処理() テスト1 テスト2 End Sub ---------- Sub 一括処理()を実行した場合、『test1-1行目、test1-2,3…n行目、test2-1行目、test2-2,3…n行目』という順番で実行されますよね? Sub 一括処理()で例Aのようなプログラム以外に『test1-2,3…n行目、test2-2,3…n行目』のみを実行させる方法はありますか?テスト1、2にIF文を付けたりして試してみたのですが自分の実力ではダメでした。 以下のようにプログラムすれば簡単なのですが… ・実際のマクロは行数がものすごく多い。 ・テスト1、テスト2、一括処理のそれぞれで実行させたい。 ・例Aのようにプログラムするとテスト1、テスト2で変更がかかったときにミスにつながる。 【例A】---------- Sub 一括処理() test1-2,3…n行目 test2-2,3…n行目 End Sub ---------- 良い方法を教えてください。お願いします。
>>274 引数(ひきすう)を使うといいよ
こんな感じで、何行目から始めるか指定する
Sub テスト1(x)
test1-x…n行目
End Sub
Sub テスト2(y)
test2-y…n行目
End Sub
Sub 一括処理()
StartLine = 1
テスト1(StartLine)
テスト2(StartLine)
End Sub
一括処理の中の最初の行を「StartLine = 2」にするだけで、処理の範囲を変えることができる
すいませんよくわかりません もうちょっと分かりやすくお願いします。 初心者なんで
「初心者」が免罪符になるって?
はぁ、もういいです
何かスレッド荒れてきたな。 態度でかい奴ばかり
上から目線で見下してる回答者も増えたよな
ほんとにそうですね。 例えば、自己PRとしてアプリ提出することが何故いけないの?相手に売り込むための、プレゼンの一環だと思うし。 例えば、初心者だからと前置きしていて不遜な態度をとっていないのにもかかわらず、上から目線とか余裕ないですよね。
いけないことだなんて誰も言ってないのに被害妄想が強すぎだな なんでそんなに余裕がないの?
283 :
デフォルトの名無しさん :2011/03/28(月) 06:45:07.89
面接官が率直に思うだろうこと 企画系の募集じゃない場合 (ここでプレゼンとか何様だよ) 面接官がプログラマーの場合 (うわVBかよ) 面接官がプログラマーじゃない場合 (これ採用の評価基準にしろと?じゃめんどいから不採用で) アプリ提出が前提でよっぽど自信作じゃない限り危険
否定するおまえは、ビジネスライクなまともなアプリ作ったことないだろ。あ、そもそも作る能力ないか。かわいそうに。
負け犬の遠吠え? VBAスレでビジネスライクなまともなアプリとか言ってもカッコワルイだけだし VBAスレなのにVBA以外での話だなんて言い訳しだしたらもっとカッコワルイw
VBAけなす奴は一体、何ののためにVBAという言語つかってるわけ?
Officeの標準マクロ言語だから使ってるだけで あえてVBAを選択して使ってるわけじゃないし 中にはVBAを簡易開発環境代わりにしてなんでもVBAでやる奴も居るけど 俺はOfficeアプリが必要な場合以外はVBAなんて使わないし
言語の優劣とかまだ言ってるやつがいるのか Windowsのプログラミングはライブラリで決まる 何から呼び出しても結果は一緒 あと、なんかもう開発環境をわざわざインストールするのがめんどい Officeは最初から入ってるし 最近のマシンは処理速度も十分 VBAを嫌ってるのは知識の古い老害だけ
C,C++,C#,javaとかそこそこ使えるようになるとVBAを見下して 俺はすごい、レベル高いって思いたくなっちゃうんだよな まあ、動物的本能というか感情の問題だな
生産性が一番高い言語はExcelVBA データを共有しないスタンドアロンアプリではExcelVBAが最強
>>283 プログラマ募集でソース付きで作品を提出させればいい判断材料になりそうだけどな
VBAしか使えない子がキレちゃったねぇ 滑稽極まりないw
> Officeは最初から入ってるし > Officeは最初から入ってるし > Officeは最初から入ってるし 何時からOS標準になったんだ?
ここまで全部俺の自演
まともに呼べないライブラリが多いのもVBAの弱み
APIリファレンス
なんだ、やっぱり解ってないのか
VBA勉強したいけど2003と2010で互換性低かったりとかだったら不安
301 :
デフォルトの名無しさん :2011/03/28(月) 19:56:33.06
:
自分だけ使うもの作るとき、クラス使おうか悩んで最終的に構造体に逃げる俺 モジュールすら公開しないのに、わざわざ使う気力が湧かないわ
クラスは難しいよな。VBA極めるくらいの気がなきゃ、下手に手を出さないのが得策かも
そういえばVBAにもクラスがあるな。
現場で使ってるのを見たことがあるけどその時は
クラスとか全然知らなかったから全く分からなかった。
JAVAとか勉強した後にこのサイト見るとそんなに難しくなさそうだ
http://codezine.jp/article/detail/499 VBAしかやったことがない人にはクラスは難しそうに見えるけど
JAVAを勉強すればそんなに難しくない事に気がつく。
306 :
デフォルトの名無しさん :2011/03/29(火) 01:24:01.89
VBA(とVB6)のクラスは独特すぎて他言語環境に慣れてる人には辛いかも
クラスはコントロール大量に作るぐらいしか役に立たない 構造体はapiの引数にしかたなく使う感じ どっちも配列使うのに制限があって使い勝手が悪い
クラス作ると見やすくなる 俺の場合はそれだけだな
俺は連想配列にぶち込むオブジェクトとしてクラス使うことが多いかな 構造体と似た、ほぼグローバル変数のみのクラスだが、 代入できる値の範囲を制限したり、値の代入に伴って行う簡単な処理を置いたり 特定の値が入った場合にRaiseEventでイベント起こしてやったり 307も言ってる仮想コントロール配列も、結局はコレだしね
!ninja
!ninja
エクセルで散布図グラフを作成した時に 近似曲線の追加からグラフに傾きと切片の式を追加できるとおもうんですが この式が表示されるテキストボックス(データラベル?)の位置を取得 したいと考えています。 その際、この式の位置やサイズを取得するときのコントロールオブジェクトを 教えてください。
使用ver 2007 A1セルに数字を入力し、B1セルに数に応じた背景色を反映させたいのですがどうすれば良いでしょうか 2003だと条件書式で3つまでは入力できたのですが、2007は条件追加ボタンが見当たらず・・・ 20001〜青 15001〜20000水色 10001〜15000緑 5001〜10000黄色 0〜5000赤
自己解決しますた
上記条件付書式のコピーについてもうひとつ質問です Z1に入力した数字次第(○○以上○○未満の場合)で、W1セル背景が5段階に変色するという書式をAND関数を使って設定しています 以降入力数字に対する変色は同条件で、Z2に入力したものをV1に反映、Z3に入力したものをU1に反映と、縦の入力データを横左方向に出力、といった書式を一括でコピーしたいのですが方法はあるでしょうか 現状W1をコピーすると、V1にもZ1からデータをひっぱってくる数式がコピーされてしまいます W1セルに対して Z1<5001 のとき背景赤色 AND(Z$1>=5001,Z$1<10001) のとき背景黄色といった感じで記入してます $の位置が悪いか不要ですかね
VBAで設定するなら、$がどうとかはあまり関係ない つーか、ここはExcelスレではなくVBAスレなんだが おまえはそれが解って来ているのか?
エクセル質問で検索するとここが出てきたんでそりゃ失礼!
Excel2007 ループで処理実行中の間、マウスカーソルを砂時計が回っている奴に変えたいのですが、 どうすればよろしいんでしょう?
>>318 マウスカーソルの変更はVBAではなくVBの分野。(
>>3 参照)
スレ違い。
>>318 Application.Cursor = xlWait '砂時計
'ループ処理
Application.Cursor = xlDefault '通常
>>319 本人納得して移動してるのに、他人が細かい事言うな
324 :
303 :2011/03/29(火) 21:30:38.26
>>307 >>309 のように、カスタムコントロール(ラッパー?)で
コントロール配列を実装するのがいちばん使いでがありそうな感じだね
構造体はWin32APIとかで必須だけど、VBScriptだと使えないから
泣く泣くクラスで実装してる人も多いんだろうか
わざわざクラス使ってるVBS見たことないですわ
325 :
309 :2011/03/29(火) 21:45:28.88
俺はVBSでもクラス使いまくりだ > 連想配列にぶち込むオブジェクトとしてクラス使う は、VBAでもVBSでも変わらないからな ぶち込む先がVBA.CollectionかScripting.Dictionaryかの違いで あとはVBAでは標準モジュール毎にPrivateメンバを持てるけど WSFでインクルードする場合は、ファイル毎にPrivateメンバを持てないので Privateメンバを持たせたい場合は必然的にクラス使うことになる
>>321 俺もそれだと思ったんだが、俺のExcel2010じゃ砂時計にならないんだよな。
丸いのがぐるぐる回ってる。
砂時計はどうやって出すんだろ?
>>325 VBSで入力補完が出来るエディタってある?
いくつかあるけどVBSはスレ違い。
プログラム未経験です。 仕事で必要なため、勉強したいが、 最初に読む書籍でオススメがあれば、 教えてください。 バージョンはExcel 2003です。
>>330 先ずはこの3冊がおすすめ。2007でもいいかも。
かんたんプログラミング Excel2003 VBA 基礎編
かんたんプログラミング Excel2003 VBA 応用編
かんたんプログラミング Excel2003 VBA コントロール・関数編
> 499 名前:デフォルトの名無しさん [sage] 投稿日:2009/03/30(月) 23:56:12 > できる大辞典 Excel VBA > がオススメ > > 大村あつしは知識はあるが根本的にバカなので > こいつの書いた本は素人にはオススメしない > バカな内容に引きずられないだけの基礎スキルを持っていて > 知識だけ上乗せしたい中級者以降なら構わないが かんたんプログラミング Excel2003 VBAシリーズは大村あつし
>>330 プログラム未経験なら
ExcelVBAより、CやJavaから始めたほうが、
学びやすい
ExcelVBAを1年間学ぶより、
Javaを11ヶ月学んで1ヶ月ExcelVBAを学ぶほうが
はるかにプログラマとしての実力がつくだろう
だからどうしたって
>>330 ハードウェア(PCアーキテクチャ)に多少なりとも造詣があるならC
それほどでも無ければJAVA
Windowsしか解らんのであればC#
>仕事で必要なため ExcelVBAが仕事で必要という事ではないのか?
ExcelVBAじゃなければならないケースなんてそんなないだろ
プログラムが目的ならそんなにはないだろうけど Excelを使うのがメインならExcelVBA以外でどうする気だね?
エクセルメインの会社なんて沢山あるだろ
Excel自体がActiveXアプリなので、WSH等からの操作が可能 つまり、JScriptはもちろんのこと、Perl、Ruby、Pythonなどでも VBAと同等とは言えないが、かなりの操作が可能だよ まあ俺は別言語が使いたいわけじゃないから、外部から弄る場合もVBSだが
俺もVBAから入ったからVBSだな
エクセルで既に動いてる奴を修正するパターンでも 別ので作り直すの?
作り直すのが目的じゃないんで、滅多にやらないが 既に開いてる奴を外部から操作することもあるよ まあExcelの操作できる言語はVBAのみじゃないってだけの話だし
C#からExcelを弄ると苦痛 引数省略できねぇえぇぇ
C#だって原則は省略できないだろ
346 :
デフォルトの名無しさん :2011/03/31(木) 11:29:59.92
計算を手動にしてるんですが、VBAで再計算を行わせるように出来ないですか? Excel2003です。お願いします
ヘルプ検索すればすぐ出てくるし 手動での再計算操作をマクロの記録にとっても解るし なんでこのレベルのことを自分で調べられないの?
VBAのコードを書いていると、「コンパイルエラー メモリが足りません。」とのエラーが出るようになりました。 (実行時のエラーではなく、記述している最中のエラーです。) ヘルプを見ると「メモリが不足しています。(Error 7)」というエラーのようです。 ヘルプに記載されている対処は行ってみたものの、改善されませんでした。 どのようにすればこの問題は解決できるのでしょうか? Excel2007です。よろしくお願いします。
ハードウェア環境を省略するような質問に答えてくれる親切な人がいるとは思えない
350 :
348 :2011/03/31(木) 20:31:16.72
>>349 すみません。ハードウェア環境は以下の通りです。
WinXPProSP3
CPU i7 2.80GHz
メモリ 2.96 GB
仮想メモリのページングファイル 2046 - 4092 MB
他の人のPCで起動しようとしても同じエラーが出ました。
コード書けよ。俺たちはエスパーじゃねーから
352 :
348 :2011/03/31(木) 21:18:50.73
>352 たぶん、どれかのシートの最下行(Excel2007なら数百万行だっけ)あたりになにかゴミデータでもあるんじゃないか?
>>345 Excelのオブジェクトは省略パラメータだらけだって事だよ
Excel.Workbook oWb =
mExcelApp.Workbooks.Open(
str_filename,
Type.Missing, Type.Missing, Type.Missing, Type.Missing,
Type.Missing, Type.Missing, Type.Missing, Type.Missing,
Type.Missing, Type.Missing, Type.Missing, Type.Missing,
Type.Missing, Type.Missing);
こんな感じになる
355 :
348 :2011/04/01(金) 09:42:16.41
>>353 返信が遅くなりました。
Ctrl+A->Ctrl+C->Ctrl+P の繰り返しでコピーしたので
ごみデータがあればそれも一緒にコピーされる気がしますが・・・。
ともあれ、問題は解決しました。
新規作成中のコードもうまく動くようになりました。
ご回答下さった皆様、ありがとうございました。
×Ctrl+P ◎Ctrl+V
ユーザー定義関数について教えてください。 個人用マクロブックにユーザー定義関数を書いているんですが 実際にそのマクロを使用するワークシート内で関数を実行しようとする場合 =個人用マクロブック!関数名 という風にユーザー定義関数の指定を個人用マクロブックの指定も含めて 行わなければname?となってしまうんですが、個人用マクロブックの指定を 省略することができるような設定方法などないでしょうか。
標準モジュールにPublic Functionで書いてる?
オートシェイプ内の文字列の色を変更したいんですけど、プロパティとかメソッドがよく判りません。 もう少し用途を具体的に言うと、図形の塗り潰し色を変更するマクロで、塗り潰し色に合わせて文字色も変更したいのです。 デフォルトの文字色は白のため、塗り潰し色を白にすると文字が読めなくて困っています。 .selection.shaperangeからいけるかと思ったのですが、該当するものが見当たらず…… OSはvista、エクセルのバージョンは2007です。
レスありがとうございます。 Publicをつけていなかったのでつけてみたんですがやはりマクロブックの 指定をしないとname?になってしまいます。 標準モジュールには記述しています。
2010でマクロの挙動が変わってしまいました。 Auto_OpenでExcelの起動と同時にマクロを走らせているのですが、 2007では起動と同時にワークシートも表示されていたのが 2010ではマクロが終了するまでシートが表示されません なんとかなりませんか?
>>360 アドインにすればいいと思うが。。
さうすれば他のPCでも使える。
現在複数のエクセルファイルで、同一のコードを使用するために、 各エクセルファイルそれぞれのに同一のコードをコピペしたり、 エクセルファイル自体をコピーしてコードをそのまま持ってきて使用しています。 現状で、そのファイルが10個以上となっていますが、 vbaのコードに仕様を変更したり修正したりすると、それらのファイルのすべてそれぞれで 同様にコードを書きなおさないとなりません。 全選択のコピペで済む話ですが、かっこ良い仕様とは言えませんね。 なので、DLLみたいな感じで、コード自体は一つのファイルとして、 各エクセルファイルでそれを参照するようにすれば、もとのコードファイルを書き換えるだけで済むような仕様にしたいのですが、 そういう場合はどのようにすればよいのでしょうか?
個人用マクロブック
分かりにくい長文になってしまいましたが、 要するに、別ファイルに記述されているvbaコードを使えるかどうかです。 ちなみに BeforeDoubleClick等のイベントプロシージャも使用しています。
だから個人用マクロブック もしかしたら個人用マクロブックでは出来ないとか勘違いしてるのかも知れないけど イベントも含めてちゃんと出来るから
>>366 自己解決ですが、参照設定でコードが書かれたxlsファイルを直接指定しておけばグッドそうです。
ありがとうございました><
>>366 個人用マクロブックだとそれらとは関係ないエクセルファイルを使用する時もいちいち読みこまれるのがカッコ悪いと思います。
あぁ、この子勘違いしてるんだね
かっこ悪いと思います! 人に聞くのは
選択した図形にくっついてるコネクタの情報ってどうやったらわかる? →■ 上の状況で■を選択してマクロを実行、いろいろした最後に、→を繋ぎ直す処理をしたい。 くっついてる最初の時点で名前を取っといて、最後にendconnect selectionすればいいと思うだけど。
373 :
質問 :2011/04/02(土) 15:19:09.76
"検索シート"でコンボボックスを作り、コンボボックスのボタンをクリックしたら 自動的に"カテゴリ"シートにある最新データを表示できるようにしたいのですが うまくいきません。 どうも◆の部分で"カテゴリ"シートに切り替わっていないようなんですが、 なぜ"カテゴリ"シートが選択されないのかわからず困っています。 どこがおかしいのでしょうか? Private Sub ComboBox1_DropButtonClick() Dim i As Integer Application.ScreenUpdating = False Worksheets("カテゴリ").Select If Range("A2").Value = "" Then '◆ i = 3 Else i = Range("A1").End(xlDown).Rows End If Worksheets("カテゴリ").Names.Add Name:="カテゴリ1", RefersTo:=Range("A2:A" & i) Worksheets("Sheet1").Select Application.ScreenUpdating = True End Sub
>>368 何か勘違いしていたでしょうか?
もしかして、個人用マクロブックの中のマクロで、開いたファイル中で呼び出すことがないマクロに関しては読み込まれないんですか?
>>373 "カテゴリ"シートに切り替えても
Rangeで取得されるのは、そのコードが書かれている親だよ
VBEのプロジェクトエクスプローラ見れば、どこに書いているか解る
なので
Worksheets("カテゴリ").Range("A2").Value '(With使っても良し)
とするか、どうしても切り替えたいなら
Worksheets("カテゴリ").Activate
ActiveSheet.Range("A2").Value
としな
>>374 もう出てこなくていいよ
君のレベルじゃ話にならないから
376 :
373 :2011/04/02(土) 15:47:12.88
>>375 できました おかげで先に進むことができます
ありがとうございました
クラスって今まで使ったことないけどあれってどういうときに使うの?
簡単に言うと、クラスモジュールで作成したプログラムによって、標準モジュールなどで、独自のメソッドやプロパティが使えます。
俺は昔、やりたいことがあって方法を調べてたら、クラスを使う手法に行き着いた
>>377 もそうやって必然性に迫られるまでは、クラスなんか使わなくていいよ
オフィス田中の田中亨が出してるSE出版のリファレンスに最近ハマッている。 リファレンスという側面以外に学習教材としての側面も大いに持ち合わせていてかなり良い!
381 :
デフォルトの名無しさん :2011/04/03(日) 00:24:47.36
今のとこ、クラスじゃなきゃできないってことは
VBA環境の右クリックに独自イベント処理を追加したとき、くらいかなぁ
こんなかんじ
Private WithEvents cmmndBrEvents1 As CommandBarEvents
Private Sub cmmndBrEvents1_Click(ByVal CommandBarControl As Object, handled As Boolean, CancelDefault As Boolean)
・・・
End Sub
ネタ元はこれね
Excelプロフェッショナルエンジニアテクニック
ttp://www.amazon.co.jp/dp/4904412028/
382 :
デフォルトの名無しさん :2011/04/03(日) 17:14:30.22
エクセルのVBAではないのですが たくさん作ったのですが、1つをチェックするとほかのチェックボックスの チェックが消えるようにして、チェックできるのが常に一つにしたいのですが、 どうしたらいいでしょうか?
>エクセルのVBAではないのですが この時点で既に板違いなんでどうでもいいんだが、何で作ったかも書かないという
そういうときは、チェックボックスではなく オプションボタン(ラジオボタン)を使うんだよ、坊や
385 :
デフォルトの名無しさん :2011/04/03(日) 18:13:59.91
>>383-384 ありがとうございます!!ちょっと試作してみます!!
みなさん、やさしいですね。ありがとうございます!!
386 :
デフォルトの名無しさん :2011/04/03(日) 18:20:40.62
387 :
デフォルトの名無しさん :2011/04/03(日) 22:15:50.29
A1 B1 C1に値が入っていて、 D1が =SUM(A1:C1)となっていた場合に、 F1にD1の値のみコピーをしたいんだけど、 A1 B1 C1に数値を入力するたびに、 F1にD1の値のみコピーってできる? エクセル2007 VBAのコードを教えて。 特に、「A1 B1 C1に数値を入力するたびに」のコードの解説もよろ。
>>387 ワークシートのChangeイベントで出来る
この説明で解らないなら、基礎を勉強して出直せ
ここは丸投げでコード書いて貰うスレではなく、要点だけ教えて貰えば、
あとは自分でコード書ける人がヒントを貰いに来るスレなので
390 :
387 :2011/04/03(日) 23:02:50.15
すまんくそ蒸しでw 本当に困っているvba初心者なんだ. サンプルコード教えてw
>>390 sub サンプルコード()
do
if msgbox("あなたは糞虫ですか?", vbyesno) = vbyes Then
msgbox "やはり糞虫だったんですねw"
exit do
end if
loop
end sub
392 :
387 :2011/04/03(日) 23:23:04.84
>>391 アフォかおまえ
おれはくそ蒸しであって糞虫ちゃうちゅうねんw
こいつじゃあ話にならん。
コードかける人かもーんw
C G Am Em F C Dm/F G コード書いたよ 大逆循環な
>>387 普通に数式で、F1セルに「=D1」とかじゃあダメなのか?
>>396 あーそういやそんなコード理論あったなぁ
つーか進行的に普通すぎて名前なんか出てこないぞw
>>387 ' ワークシートに変更があった場合
Private Sub Worksheet_Change(ByVal Target As Range)
' 変更された行が1行目なら
If Target.Cells.Row = 1 Then
' 変更された列が1列目〜3列目の間なら
If 1 <= Target.Cells.Column And Target.Cells.Column <= 3 Then
' 1行目の6列目の値に1行目の4列目の値を代入
Cells(1, 6).Value = Cells(1, 4).Value
End If
End If
End Sub
399 :
387 :2011/04/04(月) 02:00:59.90
>>398 ありがとうございます。
ここから、Copyメソッドや、PasteSpecialメソッドが続くと思うのですが、
よくわかりません。どうしてもエラーが出てしまいます。
>>399 横レスだけど、
>>398 は、標準モジュールじゃなくて
ワークシートモジュールに書くんだよ
CopyメソッドとかPastSpecialメソッドとか関係ないよ
忠告しとこうか、質問スレで無意味な回答するくらいならスルーするんだな するくらいなら スルー する んだな!
402 :
387 :2011/04/04(月) 02:55:56.78
>>400 ワークシートモジュールに書いてます^^;
>>A1 B1 C1に値が入っていて、
>>D1がA1+B1+C1場合に、
>>F1にD1の値のみコピー(形式を選択してコピー)をしたいんだけど、
>>A1 B1 C1に数値を入力するたびに、
>>F1にD1の値のみコピー(形式を選択してコピー)ってできるでしょうか?
' ワークシートに変更があった場合
Private Sub Worksheet_Change(ByVal Target As Range)
' 変更された行が1行目なら
If Target.Cells.Row = 1 Then
' 変更された列が1列目〜3列目の間なら
If 1 <= Target.Cells.Column And Target.Cells.Column <= 3 Then
Cells(1, 4).Value = Cells(1, 1).Value + Cells(1, 2).Value + Cells(1, 3).Value
Cells(1, 4).Value.Copy
Cells(1, 6).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
End If
End If
End Sub
どこが誤りなのでしょうか?
403 :
387 :2011/04/04(月) 03:05:15.99
×形式を選択してコピー ○形式を選択して貼り付け でした。すみません。
>>402 CopyやPasteSpecialは関係ない
>>398 のままでいい
>>387 でD1セルに「=SUM(A1:C1)」となっている
と書いてあるのを前提として
だんだんと壮大なことになってきてるなw 答えてる方も釣りかw
あー。わかった!
>>387 のエクセルの自動計算がオフになってるだけじゃないのか?
407 :
デフォルトの名無しさん :2011/04/04(月) 20:34:41.64
>>406 >エクセルの自動計算がオフ
何のこと?どこにチェック項目がある?
少しはググれ
>>402 Cells(1, 4).Value = Cells(1, 1).Value + Cells(1, 2).Value + Cells(1, 3).Value
が思いつくのに、
Cells(1, 6).Value = Cells(1, 4).Value
が思いつかないのは不思議だ
いっそ、プロシージャの中身、全部消して
上の2文だけにしたら?
まあ、どこが間違ってるって話だから × Cells(1, 4).Value.Copy ○ Cells(1, 4).Copy
411 :
387 :2011/04/04(月) 23:44:22.94
>>410 ありがとうございます。自己解決してましたがw
ところで、このプログラムを実行すると、
Cells(1, 4)がコピー元の選択状態になってうざいのですが、
PasteSpecialメソッドを実行した後、
この状態を解消するメソッドってあります?
選択解除とかじゃなくて、なんで素直にみんなが言ってるように Cells(1, 6).Value = Cells(1, 4).Value ってやらんのだね? そこまでコピペにこだわる特別な理由でもあるのか?
413 :
387 :2011/04/04(月) 23:59:20.91
>>412 実際、仕事で使っているエクセルには
>>398 さんのように、
Cells(1, 6).Value = Cells(1, 4).Valueの代入で、
プログラミングしております。皆様ありがとうございます。
コピペはもう必要ないのですが、
初め、CopyメソッドとPasteSpecialメソッドが必要と考えていたので、
この使い方もできれば習得したいと思いまして。。。
>>411 Application.CutCopyMode = False
415 :
387 :2011/04/05(火) 00:36:20.38
>>414 おお、ありがとうございます。
ヘルプで調べればよいのですが、
VBEのヘルプがなぜか
このページはご利用いただけません
お探しのページはご利用いただけません。以下のことを試してみてください。
ツールバーの [更新] をクリックする
ツールバーの [戻る] をクリックした後、目的のページへのリンクをもう一度クリックする
コンピュータに保存されたオフラインのコンテンツを表示する
となってしまい、調べられないのです。
ううう。なぜだ?
416 :
387 :2011/04/05(火) 00:43:38.46
>>415 そうとう知能の低いクソ虫だな
その画面から「オフラインのコンテンツ」で調べるんだよ
あと2chで書き込む前に一度ググれ
例えば「vba ヘルプ オフライン」とか入力して検索してみろ
お前の知能ではVBAは向いてないから以後は関わらないしろ
Inputboxでセル範囲を入力してそれをFor Nextで 一つずつ下げるのを繰り返したいのですがエラー(1004)に なります。 どこが間違っているかご指摘してもらえないでしょうか。 Dim i,d As Integer d = InputBox("抽出する日数を入力してください", "日数") If d = "" Then Exit Sub For i = 0 To 10 ☆ ActiveSheet.Range(Cells(2, 4), Cells(2, d)).Offset(i, 0).Select Next ☆のところでエラーになります。
>>418 ☆以前に
If d = "" Then Exit Sub
でエラーだろ
整数型と文字列の比較演算してるんだから
変数dに列番号の有効範囲値(2003以前なら1〜256、2007移行なら1〜16384)が
入っていれば☆自体はエラーにならないよ
Ifでエラーにならずに☆でエラーになるなら、おそらく実行時に変数dにAs Integerを付けてなかったんだろう
変数の型指定無し、つまりVariant型だと、InputBoxに数値の入力しても、それは数値ではなく数字文字列扱い
つまりCells(2, "10")みたいなことをしているのと同じなのでエラーになる
まあ簡単に言うと「d = ""」を「d = 0」にすれば良し
InputBoxでキャンセルした場合に返される値は""ではなくEmptyなので、これが数値型に代入されれば0になる
あと、その書き方だとiはInteger型にならないぞ
Dim i As Integer, d As Integer
またまた壮大な釣りが…
>>418 d = Val(InputBox("抽出する日数を入力してください", "日数"))
If d = 0 Then Exit Sub
シートのセルが結合されてない?
>>419 それだけだとInputBoxに数値以外の物を入力した時にエラーで止まる
VBAや昔のVBでは、 Dim i,d As Integer でIntegerになるのはdだけだぞ
424 :
418 :2011/04/05(火) 08:19:28.82
>>419 ご指摘ありがとうございます。
また、夜試してみます。
>>421 セルは結合してないです。
そんなやり方もあるんですね。勉強になります!
>>422 それは419の回答の問題ではなく、418に最初からある問題だから、419に言うのは筋違いかと。
そもそもその宣言だとdはval型だろ
その宣言ってどの宣言? iがval型なのはあるが、dがval型なのは見あたらないんだが
ああ、間違えたiか dがintだな 自動初期化だとdに0が入るから、if文はスルーされる セル(2,0)が参照されたエラーだな
恥ずかしい奴
If chk_日付.Value = True Then Else: txt_日付.Value = "" End If If chk_金額.Value = True Then Else: cmb_金額.Value = "" End If If chk_担当.Value = True Then Else: txt_担当.Value = "" End If あと5項目ほど続くのですが、もっとコンパクトな記述方法はないでしょうか? Arrayを使おうとおもったけど、うまくいきませんでした。
>>430 疑似コントロール配列を使う
or
Controlsコレクションを使う
>>429 ///
>>430 1.コントロール情報を配列に格納して回す
2.判定と処理が複数回あるなら別コードに書いて呼び出す
3.全部のコントロールを対象にして後で修正しないならfor〜each使う
Else: cmb_金額.Value = "" が Else: txt_金額.Value = "" の間違いでない限り、まとめるのは無理 あと、False〜ThenじゃなくてTrue〜Elseになってるのが気持ち悪い Elseのあと改行せずに : を書いてるのが気になる いちいち= Trueを書くのも無駄っぽい
> Else: cmb_金額.Value = "" > が > Else: txt_金額.Value = "" > の間違いでない限り、まとめるのは無理 無理じゃないよ VB6のコントロール配列だと、コントロール種は揃えなきゃならないけど VB6だろうとVBAだろうと、クラスとコレクションで作る疑似コントロール配列なら コントロール種が揃ってなくてもまとめることは可能
436 :
デフォルトの名無しさん :2011/04/05(火) 15:38:27.81
>>433 見やすさを考慮するとどういった
記述になるでしょうか?
435 遅れてるなあ超流行ってるよ知らないの?
納得した俺に、どこが恥ずかしい回答なのか教えてplz
>>438 どれの恥ずかしさを晒して欲しいの?
恥ずかしい回答、いっぱいあるのでw
さっきの3つをお願いします
441 :
デフォルトの名無しさん :2011/04/05(火) 19:13:40.86
A1に"L3"と入力されていて、L3に文字を入力したいです VBAでINDIRECT関数を使うにはどうしたらいいですか?
>>441 Range(Range("A1").Value).Value = "hage"
443 :
デフォルトの名無しさん :2011/04/05(火) 19:57:08.90
フォームのチェックボックスのオンオフで、 それぞれ対応するテキストボックスのTrue Falseを切り替えるには Private Sub chk_1_Click() txt_AAA.Enabled = Not chk_1.Value End Sub Private Sub chk_2_Click() txt_BBB.Enabled = Not chk_2.Value End Sub Private Sub chk_3_Click() txt_CCC.Enabled = Not chk_CCC.Value End Sub 以上のように、ひとつずつユーザーフォームのプロシージャに 記述するしかないのでしょうか?
いいえ
>>440 さっきの3つは何処が恥ずかしいか晒されてるだろ
447 :
デフォルトの名無しさん :2011/04/05(火) 21:35:00.21
〉〉446 どこにだろう
450 :
418 :2011/04/05(火) 22:35:10.96
皆さんに指摘されたことを試してみたけどやはり ActiveSheet.Range(Cells(2, 4), Cells(2, d)).Offset(i, 0).Select のところで実行時エラー1004になります。 ActiveSheet.Range(Cells(2, 4), Cells(2, 10)).Select でも試してみたのですがやはり1004エラーになりました。 同じマクロで For i = r To 10 ActiveSheet.Columns(i).ClearContents Next と不要な列の内容を削除するコードは正常に動いています。 どこがいけないのでしょうか??
>>449 今大流行の的外れで恥ずかしい回答の実践見せてやってんだよそんくらい判れよ
>>450 釣りかもしれんけどあえて エスパーしてみる
そのコードはシートモジュールに書いてない?
例えば
Sheet1のシートモジュールにコードを書いていて
Sheet2をActiveにした状態でそのコードを実行してるとか?
>>450 いまひとつ何がしたいか分からないけど、
私の環境ではInputBoxで「10」を入力した場合、
Range(D2:J2)が最初に選択されて
Range(D12:J12)まで一行ずつずれていく動作になっているよ
>>450 こんな感じになってる?
あと考えられるのは、少し前のExcelでInputBoxに257以上を指定してるとかだけど。
Private Sub xxx()
Dim i As Integer
Dim d As Integer
d = InputBox("抽出する日数を入力してください", "日数")
If d = 0 Then Exit Sub
For i = 0 To 10
ActiveSheet.Range(Cells(2, 4), Cells(2, d)).Offset(i, 0).Select
Next
End Sub
>>450 ActiveSheet.Range(Cells(2, 4), Cells(2, 10)).Select
が1004エラーになるというのは、
コード以外の問題じゃないのか?
イミディエイトウィンドウに書いても実行できないの?
>>452 その通りでした。
標準モジュールに記述し直したら動きました。
For i = r To 10
ActiveSheet.Columns(i).ClearContents
Next
↑の部分が正常に動いていたので見落としていました。
勉強不足を痛感します。
ありがとうございました。
>>453 、454、455
書き込む前にリロードしていませんでした。
標準モジュールに記述したら、無事動きました。
dでセル範囲を指定して、iで下方向に検索しようと思い
前段階として、セルの選択ができるか試したかったのです。
レス下さった皆さんありがとうございました。
458 :
452 :2011/04/05(火) 23:39:31.48
>>457 余計なお世話かもしれないけれど
Rangeオブジェクト(RangeとかCellsとかその他)を扱う時は
ケースバイケースだけど
シートを明示した方が今回のような凡ミスは防げると個人的には思う
(過去にも 同様なエラーで質問された方が いた気がする)
ActiveSheet.Range(ActiveSheet.Cells(2, 4), ActiveSheet.Cells(2, 10)).Select
とか
With ActiveSheet
.Range(.Cells(2, 4), .Cells(2, 10)).Select
End With
とかならシートモジュールでも問題なかったハズ
>>444 クラスモジュール使ったらできたよ
でも、3組程度の個数で、enabled の切り替え程度の単純な処理内容なら、
>>444 のコードのようにひとつずつ記述したほうがいいように思う
>>458 なるほど。ありがとうございます。
今後の参考にさせていただきます。
461 :
デフォルトの名無しさん :2011/04/06(水) 15:58:02.08
Incrementを使って図形をアニメーション移動させることが出来ますが、これって直線移動しか出来ないですか? 応用して曲線移動させることは可能ですか? Excel2003です。
可能です。(厳密には曲線移動ではないけど、視覚上は十分曲線移動に見える)
463 :
デフォルトの名無しさん :2011/04/06(水) 17:13:21.68
>>462 どうやるか教えてほしいんですが…
もしかして直線で細かくつなぐとか?
正解
465 :
デフォルトの名無しさん :2011/04/06(水) 20:13:00.65
なるほど、どうも
独学でやってるんで、一般的な意見が聞きたいです。 入力用ユーザーフォームの実際の処理は 標準モジュールに記述するものなんですか? それと、標準モジュールはいくつかつくって、 処理内容ごとにわけたりしますか¥? プロシージャが増えるほど視認性が悪くなってきたもので。
>>466 プログラミングの作法は宗教みたいなもんで統一されてないし、
VBAにはとくにガイドラインもなかったと思う
>>467 ピュアオーディオ宗教みたいな感じですか。
自分が見やすかったり、使いやすければ
とくに問題なし、いったところのようですね。
僕は
dim aaa , bbb , ccc as integer
や
aaa = 1 : ccc = 3
bbb = 2 ddd = 4
とかまとめたくなってしまいます。
vbaでよくやる間違いに dim aaa , bbb , ccc as integer ってやっちゃうのがある 上でも言われてるけど、それでintegerになるのcccだけだから
逆に、VB.NETだとその書き方で全部にIntegerが適用されるから ややこしいんだよな。
別にややこしく無いじゃん 今後はともかく現状ではExcelVBAにVB6準拠のとVB.NET準拠のがあるわけではなく 全てVB6準拠で統一されているんだから
xmlhttp で取得したhtmlを タグで解析するにはどうすればいい? 例えば10個目のtdタグ内容をinnertextで 抜きだすとか
.NET移行を視野に入れた作法なら、フォームモジュールに画面処理を書いて、 ビジネスロジック部分はクラスにして管理って感じかねぇ モジュールに入れるのは汎用関数ぐらいにして VBAでもそういう意識を持てば、独学でも業務で通用するセンスを磨けるよ
はやくVBAも.NETに統一してほしい .NET環境使わないのはもったいない
VBAは利用者(プログラマー)の数が他の言語より圧倒的に多くてレベルも様々だから 言語仕様を大幅に変えようとすると大混乱が起こるだろうな
ユーザーフォームに記述した情報をまとめてセルに入力したいのですが, 下のようにするとUserForm1.TextBox.Textの文字列がSheet2のセルに入ってしまいます。 For i = 3 To 34 Sheet2.Cells(MAXROW, i) = "UserForm1.TextBox" & i - 2 & ".Text" Next うまくテキストボックスの中の値をセルに入れる方法はありませんでしょうか?
480 :
デフォルトの名無しさん :2011/04/08(金) 17:02:29.82
A B C D E 0 0 44 55 66 A1が0の場合C3の値をA1に入れる 0 0 44 55 66 A1が1の場合D3の値をA1に入れる 0 1 44 55 66 A1が2の場合E3の値をA1に入れる 1 1 44 55 66 : 1 1 44 55 66 : 1 1 44 55 66 : 2 1 44 55 66 A1が100の場合 2 2 44 55 66 このようにして100まで分岐させたいのですが、どうすればいいでしょうか? Excel2000です。
>>480 Dim a As Integer
If IsNumeric(Cells(1, 1).Value) Then
a = CInt(Cells(1, 1).Value)
Else
a = -1
End If
Select Case a
Case 0 To 100
Cells(1, 1).Value = Cells(3, a + 3).Value
End Select
邪魔くさいんで解説はしない
正常に動いてないようならお前の説明が悪い
482 :
480 :2011/04/08(金) 19:15:02.31
ちゃんと動きました ありがとうございます
何故おしえたがりは考え方ではなく、コードを提示したがるのか
日本語文章で説明すると、日本語理解できないバカの場合に再質問責めで大変なことになるが コード出しておけば、コード読めないバカでもとりあえずコピペで動き、大人しく帰ってくれるから
>>483 楽だからだろ
考え方はお前が教えてやれよ
Excel VBAから、Accessを呼び出したあとお、クローズ処理の書き方を教えてください。 Sub Main() Dim Acc As Object 'New Access.Application On Error GoTo Err Set Acc = CreateObject("Access.Application") '''何らかの処理 '既存mdbがオープンされていたらクローズ If *****************Then '←★ここの条件が書けません。 Call Acc.CloseCurrentDatabase End If 'Accessアプリケーションのクローズ If TypeName(Acc) = "Application" Then Call Acc.Quit End If 'Accessオブジェクトの開放 If Not (Acc Is Nothing) Then Set Acc = Noting End If Final: Exit Sub Err: Debug.Print Err.Description: MagBox (Err.Description) Resume Final End Sub
アクセスオブジェクトをクリエイトして操作しているんだよ!
まずは
>>3 ★3,4読め
エクセルオブジェクトを操作するのがExcelVBAであって
アクセスのそれはスレ違い
逆にアクセスのVBAでエクセルオブジェクトを読んで操作する話なら
ここで質問して良し
outlookもダメなのかい?
うん
>>483 お前は俺か?w
俺も常々そう思ってるが、この程度ならコードだけでもしょうがねーなぁ。
IsNumericよりVarType使ったほうがいいと思うが。
VarTypeは数値に見える文字列で素人がはまる 右寄せにしてたら区別が付かない
「数値だったら」なら普通はVarTypeだな。 IsNumericは「数値に変換できるものなら」だから"1D1"とかでもTrueになる。
つーか教室での指導や部下の教育なら考え方や意味から教えるべきだが
ここはそれらとは違う、何の利害関係にもない赤の他人同士だってことを忘れてないか?
それ解っている上で
>>483 を『行動として示す(補足説明を行う)』なら単なるお人好しだが
口先でちょっかい出すだけだと、単なるバカってことにしかならないねw
VarTypeにもIsNumericにも落とし穴がある 不特定多数が使うことを想定して作るなら、どちらを使うにしても落とし穴への例外処理が必要 自分だけが使うなら、想定さてる値と落とし穴が被らない方を使えば良し どちらの場合でも、「普通は〜」なんて一概に言う奴は考えが浅い
適材適所、臨機応変ってことですね。
素人は想定外のミスを色々やってくれちゃうからなあ 数字を全角で入れたり「1500*1.05」みたいに計算式を入れたり スペースいっぱい入れて消したつもりになってたり(表示されない部分にデータが残ってる) ゼロとオーを間違えたり3桁ごとのコンマを手打ちで入れたり あらゆるケースを想定してたらコードをどんだけ書いても足りないぜ
481=483=484本人じゃねーの? わかってて書いてるっぽいし。 俺は説明するのに1行ごとにコメント書くやつ見ると頭どつきたくなるわ。 よいコードはコメントは最小限でもわかる。
あらゆるケースを想定できない奴には商用ソフトなんて作れないぜ
>>496 の考えの深さを見てみたいもんだぜw
普段は抜けだらけのコード書いてるのは想像できる。
>>500 それは言えてるが、こういう掲示板での回答じゃgdgd長いコードは書いちゃいかんよな。
>>501 ←こういうのなんて言うんだっけ
ほら、なんたら犬の遠吠えとかなんとか
うん、お前は誰にも負けんよ。 よっ!大統領w
強がっちゃって可愛いなぁ
あー、一人4役は疲れる
そういえば某所に「普通」に敏感な素人がいたなぁ。
509 :
デフォルトの名無しさん :2011/04/09(土) 12:52:45.15
>>498 そういうのはデータチェック用のモジュールを1個作っといて使い回せばいいんだよ
何かあったらどんどん追記してけばいい
怪しいデータや判定不能な物を発見したらメッセージ表示するだけの簡単なやつを
OS:XP Excel2003 A.xls B.csv があります。 Bの入力補助としてAを使いたいのですが、 AからBを開いて、 BのセルをダブルクリックするとAのフォームが開く、 という動作は可能でしょうか? 個人用マクロブックを使えば出来そうな気がしますが、 可能なら使わないで処理をしたいと考えています。
>>512 俺はできないと思う
csvファイルはイベントも使えないしマクロも保存できないと思うから。
B.csvがB.xlsならできるだろうが
AからBを開いてBにマクロを登録、みたいなことはできそうな
>512 やりたい事はこんな事? フォームを開かせる処理は作ってないけど B.csvのセルをダブルクリックした時のアドレスを表示するようにしてみた A.xlsの 標準モジュール Sub テスト() Dim CSV As Workbook Set CSV = Workbooks.Open(FileName:="C:\TEMP\B.csv") 'CSVを開く Set ThisWorkbook.CSVEv = CSV End Sub A.xlsの ThisWorkbookモジュール Public WithEvents CSVEv As Workbook Private Sub CSVEv_SheetBeforeDoubleClick(ByVal Sh As Object, _ ByVal Target As Excel.Range, _ Cancel As Boolean) 'イベント時の処理 MsgBox Target.Address End Sub
そういえば昔tsvで
>>515 みたいなことやったな
フォームよりはコンテキストメニュー拡張しての入力補助だったが
まあVB6でCSV・TSVエディタ自作してからは、わざわざExcel使うことも無くなったけど
お知恵をお貸し下さい。 Excel2007 VBA でファイルフォーマットを指定してワークブック保存しようとしているのですが、2007 形式(xml 形式)にできません。 97-2003 形式になってしまいます。 エクスプローラー> ファイルのプロパティで、「Excel 97-2003 ワークシート (.xls)」となっています。 ある方のブログにあった以下のソースでも試したのですが、97-2003 形式になってしまいます。 Private Const xlExcel8 As Integer = 56 Private Sub main() Dim fullFileName As String fullFileName = "E:\_Temp\test" If Application.Version < 12 Then Workbooks(1).SaveAs Filename:=fullFileName, FileFormat:=xlExcel9795 Else Workbooks(1).SaveAs Filename:=fullFileName, FileFormat:=xlExcel8 End If End Sub ブレイクポイントを設定したところ、Else の方を実行していました。 なお、Excel オプションでは、「Excel ブック (*.xlsx)」を選択しています。 (Excel オプション> 保存> ファイルの保存形式)
>>517 97-2003形式 FileFormat:=xlExcel8
2007以降 . FileFormat:=xlOpenXMLWorkbook
2007以降マクロ有効 FileFormat:=xlOpenXMLWorkbookMacroEnabled
ちなみにxlOpenXMLWorkbookMacroEnabledは56じゃなくて52だよ
>>517 く、釣り? or 釣りバカ?
そのブログにそのコードの使い道が書いてあったはずだ
や
ろ
う
>>518 こんなに早く回答して頂きまして、ありがとうございます!
97-2003形式、2007以降、2007以降マクロ有効、全てのファイルフォーマットで保存できることを確認しました。
また、56 ではなく、52 である事も教えて頂いて、ありがとうございます。
VBAで板取計算ができないかと考えています。 やりたいことは 1 母材の縦横サイズを入力 2 部材の縦横サイズと必要数を数種類入力 3 部材毎に縦横回転可否の条件入力 4 最適取り数とレイアウト図を表示 です。 3と4の間で、悩んでます。 ナップザック問題等でも 有名な、難解な問題ですが、 宜しくお願いします。
クラスを作る クラスに最小サイズのグリッドを規定して、母材サイズBool型の2次元配列を作る 配列をFalseで初期化する ループ噛まして配列にマッチングさせていく マッチング処理でFalseの数と生成パターンをメンバー変数に入れる 以下パターンの数だけループさせて、保持してるFalseがメンバー変数より少なかったら、 メンバー変数を更新する 最後に母材配列をプロパティで取り出して終わり じゃダメか?
「歩留まり ナップサック問題」でググルとまぁ、 Excelでもいろいろできるが難しそうだな
やりたいのはACCESSで、なんですけど、VBAスレが見つからないので、 スレチながら教えてくだしあ。 時間のかかる処理(そんなに重くないもの)をバックグラウンドで動作させるには、どうしたらよいでしょう? 例えばExcelで、フォームを表示して入力可能にしつつ、 その間にネットワークフォルダの特定のファイルパスを裏で収集して、 順次フォームのリストに追加するような感じです。
525 :
512 :2011/04/11(月) 20:27:46.75
>>515 >>515 さんのコードを基に、目的の物が作れそうです。
ありがとうございました。
その他、レスを頂いた皆さんもありがとうございました。
522です 今日も色々と探したんですけど やぱ難しいですね 最適化よりも 部材を順番に 目一杯割り付けていって 残材にも、 順番に目一杯割り付けていく感じなら どうにかなりますかね?
>>489 え、そうなの?
>>486 ExcelVba的な回答であれば、mdbオープン時にフラグセット
>>524 擬似バックグラウンドなら
メインモジュールで恒常ループを発生させる
時間なり処理に応じて処理を分岐して呼び出す
非同期処理なら外部アプリケーションなりバッチ処理なり
擬似マルチスレッドならモジュール分けて別個非同期で処理汁
VBAでマルチスレッドは原則できない
モジュール内でVBSコードをビルドして独立外部処理を作り上げた上で自分を制御させるとか裏技が必要じゃね
528 :
デフォルトの名無しさん :2011/04/13(水) 12:29:51.80
セルの指定に[ ]を使うことができる事を知って使おうと思ったのですが、 変数の内容でセルを指定したい場合、どのように使えばいいのでしょうか 例えばA列、変数hoge行目のセルをselectしたいとします。 Sub Macro1() Dim hoge hoge = 3 [a & hoge & ].Select End Sub だとダメでした。 結果が↓と同じになるようにしたいです。 Sub Macro1() [a3].Select End Sub よろしくお願いします。
[ ]は、変数使う必要が無い場合に限った簡略記述です 変数使いたい場合はRangeやCells使ってください
530 :
デフォルトの名無しさん :2011/04/13(水) 14:24:43.11
>>529 そうでしたか、残念です。ありがとうございました
531 :
524 :2011/04/13(水) 15:24:53.35
>>527 thxです。
うーん、VBA不便すぐる…orz
532 :
デフォルトの名無しさん :2011/04/13(水) 18:47:05.01
良い機会だから.NETに移行して、そっから制御しる
VBA.NETでないの?
dotnetでもそれなりのテクニックが必要じゃなかったっけ
535 :
デフォルトの名無しさん :2011/04/14(木) 19:29:32.08
vbaからoutlookのメールを作成するツールを作成中です。
メールの形式はリッチテキストです。
http://www.red.oit-net.jp/tatsuya/vb/Outlook.htm ここに書かれているような内容でメールを作っているのですが、
↓のように添付ファイルを文中に入れたいのですが、
Attachments.Addすると添付ファイルが本文の最後に挿入されてしまいます。
どうしたら文中に添付ファイルを挿入出来るでしょうか?
■メール本文
---------------------------------------------
hogehoge
【添付ファイル】
piyopiyo
---------------------------------------------
Addメソッドに添付ファイルの挿入位置を示す引数がある、はず。
537 :
526 :2011/04/15(金) 06:18:32.76
長方形詰め込み問題としても 有名な難解問題だけど 誰かヒントを下さい
ヒントはもう出てるし、そもそもスレ違い
オプションボタンの使い方で教えてください。 エクセルが起動している間、前回フォームで設定した値を保持しておきたいんですが (次にフォームを開いたときに前回の場所を覚えている。エクセルを終了した場合は初期値に帰る) やはりstaticな変数などを用意して前回の値を保存するなどの方法をとる必要がありますでしょうか。 楽をできる方法があるようでしたら教えてください。
staticな変数というか、モジュールレベル変数に値を保持しておく方法が 一番楽で一番一般的な方法だけど、それに何の問題があるの? 直接コントロールの初期プロパティを書き換える方法もあるけど 遙かに面倒な上に、この場合Excelの終了を跨いで設定が保持されちゃうので 起動か終了時に初期値に戻すコードまで必要になるし
設定データ用シート作ってそこ使えば
うんこのしかたをおしえてください
ぶりぶり
544 :
526 :2011/04/16(土) 20:40:46.70
545 :
デフォルトの名無しさん :2011/04/18(月) 07:50:50.47
マクロで5000個ぐらいのファイルを順番に読み取り専用で開いてデータを取得して閉じるという作業をしています。 これまで問題なく動いていたのですが、excel 2007に変えてから途中で止まるようになってしまいました。 ファイルを閉じてもメモリが解放されず、途中でメモリがいっぱい(2G積んでいます)になることが原因のようなのですが、解決策がわかるかたいらっしゃいますか?
546 :
545 :2011/04/18(月) 07:53:07.14
(続き) ファイルを閉じるたびに、 Set bk=nothing や Bk. Saved =true を入れてみても変わりませんでした。(bkは開いたファイルへの参照を示すオブジェクト変数です)
>>545 変えたのはExcelだけ?Windowsは変わってない?
データファイルはExcel形式?テキスト?
548 :
545 :2011/04/18(月) 12:47:25.79
>547 レスありがとうございます。 OS はかわらず、XP pro SP 3です。 正常に動いていた時のexcel は2003で、大量に開くファイルも97-2003形式で保存されたexcel ファイルです。 タスクマネージャーで監視しているとファイルを開くたびに、使用メモリが増えていっています。
>>548 2007でひたすらオープンとクローズ繰り返してみたけど
メモリ使用量に変化は見られない
オープンクローズのせいじゃなくて、プログラム上どっかに問題があると思うんだが....
ただ前にも同じような話あって、そんときはDoEvents入れたら動いたって
試しにやってみては?
それが再現するミニマムコードあればいいんだけどなぁ
XPはまさか64ビット版じゃないよな?
このスレの
>>86 から、2007で大量のファイルを開こうとするとマクロが止まるってのがあるね
それと同じ症状かな?
>>549 同じファイルを何度も開くんじゃなくて、別々のファイルを開かないと症状が出ない可能性もあるし、
開くだけでなくデータを読み込まないとメモリを消費しないのかもしれない
携帯より失礼します。 <br>
>>545 <br> とりあえず、Win32APIのSleep関数を入れるとCPU使用率が下がります。 <br> 1msecで良いです。 <br> お試しください。 <br>
554 :
545 :2011/04/19(火) 00:00:43.87
>>549 ,550
DoEventsを入れてみましたが変わりませんでした。
で、気になって手作業での開く閉じるを、一回ずつ開くファイルを変えて何度も繰り返してみたところ、なんと、やっぱりメモリ使用量が増えていました。
一つ一つのファイルは128KBほどですが、開く時に3MBほど使用量が増えて、閉じた時には1MB しか解放されていません。
これはもうexcel 2007の仕様ということなんでしょうか。
他に同じ現象が出る方いませんか?
>>554 どっかでWorkbookオブジェクトその他が暗黙的に生成されて開かれてるとか、
それがきちんとNothingにされてない(というかできない)んじゃないの?
>>554 Windowsの仕様として、空いたメモリがすぐには解放されないってのがある
普通は15秒ぐらいの時間差で解放されていく
ファイルを閉じたあと、しばらく見てるとどう?
>>554 すくなくともうちの環境では問題ない
手作業ってのは普通にエクセルファイルのダブルクリックか?
どうもエクセル以外に問題がある気がする
とりあえずディスプレイのドライバー最新にしてみるとか
ディスクトップ検索周り停止してみるとかしてみたら?
円盤の上の何を検索するんだろ
EXCEL2003 A1 = RSS|’N225’!現在値 A2 = ユーザー関数(パラメータ) ワークシート内のセルから ユーザー関数を呼び出して使っています。 楽天RSSでRSS受信が発生するたびに、A2の再計算がおこなわれてしまいます。 一つだけなら問題ありませんが、実際は数百箇所もあり、再計算に3秒ほどかかっています。 ツールメニューから再計算を手動にすると、A1のRSS受信も止まってしまいます。 RSS受信しながら、ユーザー関数の再計算を止める都合のいい方法はないでしょうか? お知恵を貸してください
データの大半は円盤に記録されてますがな
>>554 ADOでsqlなげるのはどう?オープンしなくてもデータもってこれなかったっけ?
562 :
デフォルトの名無しさん :2011/04/20(水) 19:18:17.55
データファイルを開かないと上手くSQLでデータが取ってこれない時があった>>ADO&Excelの組み合わせ
それにExcelデータファイルをひらいてADOを使うとメモリリークが発生する
ActiveX データ オブジェクト (ADO) を使用して、開いている Excel ワークシートを照会するときメモリ リークに発生します
ttp://support.microsoft.com/kb/319998/ja
563 :
1/2 :2011/04/21(木) 12:38:55.57
ユーザーフォームを変数(定数)に格納してからロードすると、二重にロードされているようです。 そのせいか、フォームをコードから整形する時に反映されません。 ユーザーフォームを変数に格納して制御する場合の、適切なコードがありますでしょうか。 Sub Form_Load_Test() ' ユーザーフォームUserFormTestをロードします。 Dim I_COUNT_ As Long Load UserFormTest For I_COUNT_ = 0 To UserForms.Count - 1 Debug.Print I_COUNT_ & "/" & UserForms(I_COUNT_).Name Next End Sub **実行結果** 0/UserFormTest
564 :
2/2 :2011/04/21(木) 12:39:20.58
---- Const Const_User_Form_Str_ as String = "UserFormTest" ---- Sub Form_Load_Test2() ' ユーザーフォームUserFormTestを定数C_U_F_Str_に格納し、ロードします。 Dim Ufm_str_ As Object Dim I_COUNT_ As Long Set Ufm_str_ = VBA.UserForms.Add(Const_User_Form_Str_) I_COUNT_ = 0 For I_COUNT_ = 0 To UserForms.Count - 1 Debug.Print I_COUNT_ & "/" & UserForms(I_COUNT_).Name Next Set Ufm_Str_ = Nothing End Sub **実行結果** 0/UserFormTest 1/UserFormTest
>>563-564 どちらも二重ロードはしてないよ
但し、
>>564 の方は、Unloadせずに2回実行すればロード数は2に、3回なら3になる
これは、
Load ユーザーフォーム
だと、既にロードされている場合は新たにロードせず、ロード数は0→1にはなるが1→2にはならないけど
UserForms.Add(ユーザーフォーム名)
だと、既にロードされていても新たにロードし、ロード数は0→1→2→3と実行する度に増えていくだけのこと
Form_Load_Test を実行するとロード数は1、再度
Form_Load_Test を実行してもロード数は1のまま、この後
Form_Load_Test2 を実行するとロード数は1+1=2、再度 ※
Form_Load_Test2 を実行するとロード数は2+1=3
おそらく
>>564 の結果は ※ の部分なんだろうな
ロード数0の状態から
Form_Load_Test2 を実行するならロード数は0+1=1
Form_Load_Test2 そのもので二重ロードされてるわけじゃないから、0→2にはならない
というわけで、不要な物をきちんとUnloadしてやれば
>>564 のコードで
ユーザーフォームを変数に格納出来てるし、二重ロードにもなってないので問題なし
ありがと、でもすまん勘違いしてた 変数読み込みでもアンロード漏れでもなく イニシャライズするときに別モジュールに制御を渡して、そこからフォームを参照してた フォームをロードする前に再度メモリに読み込みかけるから、結果二重になったみたい でも単純にフォームを開いた時、ロードされるのは一個だな vba.add()で開いた時には二重ロードしとる
567 :
1/2 :2011/04/21(木) 20:34:09.35
Excel2007 ワークシートのデータを固定長のテキストファイルで出力したいと考えています。 で、実行結果がこうなっていて、B列のデータのところが長さがバラバラな状態 になっているんで、この長さを揃えるにはどうしたらいいんでしょうか? Sub TST() Dim i As Integer Dim strRec As String Dim num As Integer num = FreeFile Open ThisWorkbook.Path & "\" & "test.txt" For Append As #num i = 1 Do Until Cells(i, 1) = "" If Cells(i, 1) = "" Then Exit Do End If strRec = Format(Cells(i, 1), "00000") & " " & _ (Cells(i, 2) & Space(50 - LenB(Cells(i, 2)))) Write #num, strRec i = i + 1 Loop Close #num End Sub A B 1 1 12だだ 2 2 ああああ 3 3 ぐぐ2 4 4 tst 5 5 hhhhhhh
568 :
2/2 :2011/04/21(木) 20:36:20.24
結果 "00001 12だだ " "00002 ああああ " "00003 ぐぐ2 " "00004 tst " "00005 hhhhhhh "
大本の原因がVBA特有の挙動だから良いんじゃね?
572 :
デフォルトの名無しさん :2011/04/21(木) 23:46:58.59
573 :
デフォルトの名無しさん :2011/04/22(金) 00:47:49.02
>>567 うまく行かなかったら、どこでうまく行かないのかを
探すようにしてください。
今回なら
strRecが思い通りの固定長の文字列になっているかどうか
574 :
てすと :2011/04/22(金) 19:01:14.26
"00001 12だだ "
575 :
てすと :2011/04/22(金) 19:03:21.59
一瞬、568が再現しないと思ってビビったが、思った通りで安心
576 :
デフォルトの名無しさん :2011/04/22(金) 19:29:53.97
埋め込みグラフをマクロで作成したいのですが上手くいきません 環境はエクセル2000です。 ActiveSheet.ChartObjects.Add(10, 20, 250, 120) chartObj.Chart.SetSourceData ActiveSheet.Range("B2:B6")
初心者に毛が生えた程度のカスでも分かるVBAを勉強出来るおすすめのサイトはありませんか? 過去スレ、現行スレ見ても全く理解できませんでした
俺が教えてやんよ
>>576 こうじゃない?
Dim chartObj As ChartObject
Set chartObj = ActiveSheet.ChartObjects.Add(10, 20, 250, 120)
chartObj.Chart.SetSourceData ActiveSheet.Range("B2:B6")
俺はだんだん毛が抜けてきた そろそろ初心者に戻るのか
581 :
デフォルトの名無しさん :2011/04/23(土) 15:30:00.87
対象はWindowsXP+エクセル2003です。
グループ化されたものも含め、Shapesのテキスト一覧取得マクロを作っています。
問題のエクセルはここからDLできます。
http://www1.axfc.net/uploader/Sc/ Sc_227075.xls
シート1 だと全て取得できますが、シート2だと一部のテキスト(FFF と FFF2)が
取得できません。
ちなみに、EEE と書いてあるシエイプを削除するとうまくいきます。
原因や解決方法がわかったら教えてください。
582 :
デフォルトの名無しさん :2011/04/23(土) 17:02:06.47
>>579 その方法でも出来ませんでした
元のデータがActiveSheetなのがいけないんでしょうか?
そこでマクロを記録して弄ってみたんですが
Dim G As Object ’ChartObjectでもだめ
For G = 1 To 100
Charts.Add
ActiveChart.ChartType = xlLineMarkers
ActiveChart.SetSourceData Source:=Sheets("G").Range("A1:A100")
ActiveChart.Location Where:=xlLocationAsObject, Name:="G"
Next G
やっぱり上手くいきませんorz
>>581 グループ化してるシェイプに対してループが回ってないようだから、
グループ化されてるシェイプを判定したら再帰処理するように書き換えたら
あとは処理しきったらExit ForなりGotoなりでループ抜けりゃいいよ
584 :
デフォルトの名無しさん :2011/04/24(日) 09:48:33.13
585 :
584 :2011/04/24(日) 09:51:57.80
ちなみにHTMLbodyを使うかと思いいろいろ試しましたが、 ↓これだとhtmlで書いた書式が失われ、 HTMLBody = "" BodyFormat = olFormatRichText ↓これだとリッチテキストではなくHTML形式に勝手に変更されてしまい駄目でした。 BodyFormat = olFormatRichText HTMLBody = ""
586 :
デフォルトの名無しさん :2011/04/25(月) 17:55:28.31
EXCEL 2000 (E) +XP SP3 : 下記の@で '1004' Method of 'Range' of '_worksheet' failed となります。 mSht.Range(""" & rStrAr(i) & """).Copy Destination:=tmpSht.Cells(1, 1) でもだめでした。:お助けを。 ----- Public Const AA As String = "A416:G602" Public Const BB As String = "A604:M811" Public Const CC As String = "A813:G821" Option Base 1
587 :
デフォルトの名無しさん :2011/04/25(月) 18:00:06.67
WinXP,Office2003です。 IsMissing(v)が真となるVariantの即値または組み込み定数はありますか? この値を返す関数を作るのは簡単ですが、残念ながら関数の返値を用いて 定数を定義することはできないみたいですね。
588 :
586つづき :2011/04/25(月) 18:19:31.22
Sub F() Dim rAr(3) As String, nAr(3) As String rAr(1) = AA: rAr(2) = BB: rAr(3) = CC: nAr(1) = "A": nAr(2) = "B": nAr(3) = "C" Set mSht = ActiveCell.Parent: mT = mSht.Name For i = 1 To 3 Set tSht = Sheets.Add tSht.Name = mT + nAr(i) Set tR = mSht.Range(rAr(i)) '---@ tR.Copy Destination:=tSht.Cells(1, 1) Next i :End Sub
通常モジュールに書いてワークシート選択してから実行すればいいんじゃね
>>586 XP+Excel2003(もちろん日本語版)で試したけど正常に動いた
シート名に日本語使ってる?
591 :
586 :2011/04/25(月) 19:22:06.05
>>590 シート名英字でした
動きますか。。。(E)はだめです。
なにか言い換え、迂回策はないでしょうか?
592 :
デフォルトの名無しさん :2011/04/25(月) 22:01:12.90
質問です。 excel2003で作成したvbaプログラムをWin7×excel2010の互換モードで動作させてますが、 元シートから新シートへ書式コピー後、新シートの一部の行の高さや行番号の表示がおかしいです。 具体的には一部の行が 「行高さを409ピクセルまで広げたら縦真ん中に行番号と値がある」状態です。つまり動作直後の表示では行番号と値がまるきし見えないのです。(表示は意図した行高さのため) 互換モードを解除すると問題なく動作します。 また、複数のブックに見られたので同じ条件で発生するのかと思いきやそれぞれ微妙に違う条件で発生し、 上記条件を取っ払ってみたんですが発生します。新シートへコピー後、一度でも保存したり行番号が見えなくなっている行を手動で「高さを自動調整」すると高さが正常に戻ります。 コピー直後のセルのROWHEGHTは意図した通りで正常です これは互換モードの不具合なのでしょうか。 自分はvba初心者なんですが、互換モードにはよくあることなんでしょうか
>>593 ありがとうございます!助かります〜でもこのサイトのコードにはひっかかりませんでした。
「元シートをセレクトして範囲をコピー後、新シートに貼り付け」している数行で起こっていることです。
コードは出せませんがマクロで出力されるようなコードです。(もちろん一部分のことです)
効率が悪いと思い一行に書き直しても現象は変わらずでした。
私的には行を表示させるための自動計算が互換モードのある条件の時にすっぱ抜けているようにしか見えません。(が、発生条件に照らし合わせるとコピー範囲の大きさやデータサイズの関係がある?行高さの計算関数内で値が落ちてる?気もします)
とりあえず暫定対処方法は見つけたのですが、
悔しいですね…
互換モードは止めたほうがいいほどToo BUGGYなんでしょうか?
俺、5年前には、VBAなんて5年後誰もやってないだろうなと思ってたが、まだまだ廃れる勢いじゃないなと思った。 勉強し直します。
エクセルがあるかぎりvbaは変わらなそうだね
>>595-596 COBOLみたいな感じで長く細く続くんですかね。
顧客にはエクセルで済ませたら安そうだからみたいな人が多いように感じました。うちの庶務でもいじれるみたいな。
>>597 敷居が低いのがひとつの特徴だからね。
マの人にとっては大変な言語だよね。予算と期限的な意味で。
庶務レベルでもいじれるのと製品レベルで仕上げるのはまったく違うのにね。。。
時々庶務ですげえセンスのある人が居て 関数等を駆使して「こんなことVBA使わないでできるの!?」 みたいなのも見かけるがね。 クエリとマクロで組み上げた巨大なmdbをシステム化してくれとか
それメンテナンスが大変そうだなあ
優秀な人が一人でがんばるのはいいけど、退社したあとにみんな困るパターン 本当に優秀なマはあとでメンテしやすいようにモジュール化をきちんとやって コメントもしっかり入れて、ドキュメントやヘルプまで残すもんだ 使う言語がどうとか処理効率とかミリ秒の違いばっかり気にしてるうちはまだヒヨッコ
速度は確かに最優先課題じゃねーな。 ようは美しいかどうかだ。 汚いのものは総じて遅いから問題なだけ。
その美しいとか汚いとかが、独りよがりだったりするから問題なわけw
処理効率を考えるのはコンパイラの役割だが VBAの時点で処理効率考えるのは無意味
jsk(汚い=可読性が悪い)だよな。 プロでもそこらへんにゴロゴロしてる。
美しいコード書く人に聞きたいんだがw 一般的に汚いってのは、インデントグgchgch、Select多用、行番号使いすぎ その他どんなのがあるの?
>>606 行番号使いすぎってなんだ?
俺が入れるとしたらコメント多杉だな。
俺の意思でVBAを選んだわけじゃない 与えられた条件で仕事をこなすのがプロ
「読みやすい」と「美しい」は別 読みやすく書くには一定の法則を守り、それが首尾一貫しているかどうかで、訓練すれば誰でも出来ること インデントがどうのってのはこっちの話 美しく書くには才能やセンスが必要
コメントってコードだったんだ・・・・・!? コメントを変えると挙動はどう変わるんだろう・・・・・w
コメントは言語によって意味があるか無いかが変わるが VBAのコメントには意味が無いというのが定説
「動けばいい」書きっぱなしのプログラムばっか書いてる素人にとっては、コメントはどうでもいいんだろうね プログラムの性能ってのは計算速度だけじゃなくて、仕様変更や拡張が柔軟にできるかどうかってのも重要な要素 それにはコメントは必要不可欠 つまりコメントの書かれてないコードはプロにとっては「性能が悪い」物になる
コメントの仕様・ルールを厳密に整備していない VBAは、ダメ言語
ダメ言語を上手く使うのがウデの見せ所 ダメ言語をダメだダメだと糾弾するだけで上手く使えない奴は 良い言語使わせたところで、どうせ並以下のことしか出来やしない件w
コメントの仕様が厳密じゃない言語の方が多いだろ こっちは選べないんだよ それともなんだ?いちいちコンパイラを自腹を切って買うのか? 業務用だと値段も高いから大変世界だぞ
コメントは後の保守性とエラーコーディングと再利用に貢献する 狭義のプログラムとしては価値がないが、広義のプロジェクトを延命させリフレッシュさせるための有用なコード 書く人間がどこを意識するかで意味が異なるから一概に何が正しいとかはないが、他人に引き継ぐならコメントなり説明なりコーディングルールなりはあるといいな
処理効率を考えるなら言語じゃなくアルゴリズムを考えるものだと思っていたが、最近は「アルゴリズムって何?」って程度の人でもなんとかなること多いよなぁ。 不一致クエリーなんてアルゴリズム知らなくても使えるし。
ダメなのは
>>613 自身だろ
ちゃんとクラスモジュール使ってきちんと書けば、.NETに近いシンプルな記述が出来る
インターフェース継承ができるから、大概のことは実現できる
センスが欠如してるのを、言語のせいにするやつってのは例外なくカスだ
と言っても可読性で一番不味いのは構造化例外が使えないところか デリゲート使えないからイベントも作れないし そこは見て見ぬふりだ
美しいプログラム、わかりやすいプログラムに共通するのが モジュールわけや定数名、オブジェクト名が直感的に理解できるつくりだと思っています。 本当に直感的に理解できるプログラムはコメントはいらない、コメントがいらないようなコードを書きなさいとばっちゃに言われました
だな。 コメントを全否定はしないが、すべてにコメントつけるやつはなんだかなぁと思う。 i = i + 1にまでコメントついてるの見たときはあきれたよ。
> 直感的に理解できる
は殆ど本人の独りよがりで、他人には直感的に理解できない件w
つーか、
>>620-621 なんで別人のフリしてるの?
また妄想がひどいのがいるねぇ。 いつものことだが。
行コメントがいる場合ってそれほどないですよね。 コードを直感的に書ける人=センスのある人なのかなと。 コードの統一感だって結局は直感的に理解しやすくなるからってことでしょうし。
業務で使う話をしてるのに、直感とか定量化できないものを根拠にされても アホの世迷い言にしか聞こえないわ 本人だけ理解しているオナニーを改めて、ちゃんと世間並みのコーディング 規約を調べて、自ら定めたそれに従えって
>>622 スルーするとこだけど、なんでそんなに直感的って言葉に否定的なのかは知りたい。
君が馬鹿だと直感したんじゃねえの?
>>625 大きなプロジェクトは大抵コーディングもクラス設計にもきちんとした規約を作るし、もちろん従うよ。
そのせいもあって業務側で直感的なクラス設計が出来なくなるパターンもあるけど…
VBAで大きなプロジェクト(笑)になるぐらいなら、C#なり別の言語にした方が良いかと思われます
>>629 いや、他言語をやってたのでそれはよくわかってる。
逆にVBAは全然私は詳しくないんだが、VBAには無理ってことなの?
それならまあ…いやそれでも関数くらいなら関数宣言時のコメントあれば行コメントいらんべさ
会社でコーディング規約を大事にするのは結構だが、Q&Aの掲示板では全部コメント書いたら見づらくてしょうがない。
最近C言語やアルゴリズムの本などいっぱい出してる人とんと見かけなくなったな。 VBAに関してはちょっとあれだったが、C言語とかではお世話になった。 VBAのできからして別人かも知れないけど。
最近はそもそも新しいソフトウェアの導入が難しい会社ってのは多い CSHARPで作ったら規約違反だから使えないとかね その点VBAは「これエクセルですから」って言えるし、社員自身の拡張メンテ自由度が高い まあ簡易なプロジェクトメインだが
小さくてもVBAでプロジェクトはないだろう せいぜい「事務仕事がちょっと楽になる」程度にしとかないと、あとが大変だぞ コンパイラの利用を認めさせるか、素人で非効率なことやってないでプロに外注
プロに外注なのに、EXCELでVBAでって指定のあるプロジェクトは ごく稀というほどでもなく存在するぞ
637 :
デフォルトの名無しさん :2011/04/28(木) 15:23:40.06
union じゃなくて、十字にクロスするRangeをとりだす メソッドが思い出せない。 intersection?
Application.Intersectかな?
つーかVBEには自動補完あるんだから
>>637 まで解ってれば
自力で簡単に正解に行き着きそうなもんだが
自動メンバ表示切ってたりして。
>>633 本を出してる人のコード見たら全然別人だったわ。
ちょっとあれなのは本出してる人とは別の人ね。
よかったよ。
641 :
デフォルトの名無しさん :2011/04/29(金) 19:03:11.36
入力フォームを作成しているのですが 個数や単価、合計を入力するところを 表にしたいのですが、 フレームなんかを使って擬似的にするしかないですか? フォームのデザインって難しいですね。
使ったことがないけど その他のコントロールから Microsoft Office Spreadsheet コントロールを使うとか
>>641 ExcelのフォームにOLEでExcel埋め込めないんだっけ?
以前VB6.0でなら試したことあるけど。
646 :
デフォルトの名無しさん :2011/04/30(土) 06:38:39.86
あれはWeb用だったような・・・ 関数とか使えたっけ?
647 :
642 :2011/04/30(土) 07:01:49.21
Web用って何を指して言ってるのか分からないから答え様が無い
セルに入力してサブフォームに貼り付けてやれば楽だと思ったり
650 :
デフォルトの名無しさん :2011/04/30(土) 11:06:01.70
2007で拡張子.xlsのVBAを使って他のブック(.xls)のパスワードを解除する命令が無視されて、画面上でパスワードの入力を求められる(2回も)ようになりました。 [更新プログラム MS11-021 KB2464583」をアンインストールすると処理できるようになりました。更新プログラムのバグ?VBAの仕様変更?情報をお持ちの方がいらっしゃいましたら、教えていただけないでしょうか?
コメント『'』じゃないやつ多様してて解りにくいコードがあったの思い出した。あれワザとなのかな?
Remのこと?
「'」と書くと必要バイト数が増えるじゃないか! というのが昔のBasicだとあったけど絶対関係無いよなw
他人と違うとこ見せたいだけだよ どっちにしてもコメントは多すぎると可読性は悪くなる 俺はコメントの多いソースは消してから読むから別に困らないが
> 俺はコメントの多いソースは消してから読むから別に困らないが バカっぽいw つーかプログラミングにおける可読性の評価基準は、コメント以外って定義だから コメントの量によって可読性が左右されることは無いんだよね そもそも「コメントが多いと可読性が〜」なんてのは「モニタが小さいと可読性が〜」ってのと 同レベルの話
変更が重なってコメントと処理が 食い違ってるってのでもない限り気にならん。 コメント多いと嫌なのは処理の変更後コメント修正 忘れるやつが多いからなんじゃないかな。
>>656 条件がいっぱいあってごちゃごちゃした判定式とか分岐とか、
コメントがあれば丹念にコード読む必要なくなるじゃん
コメントねぇ・・・。意外に簡単な様で難しい議題だね。 PGを作る時点で可読性を高めるか処理速度を優先するかにも関わって来るから一概に 言えないんだよねぇ。例えば、Long型の変数BとCが同じならBoolean型変数のAにTrueを、同じで無ければAにFalseを 設定する様なPGを作るとするじゃない?で、それが結構重い処理で何回も行うループの中に必要だったと。 例えば、 Dim A As Boolean Dim B As Long Dim C As Long の後、 A = False If B=C Then A = True End IF か、 A = B = C みたいな2つの方法を思いついちゃって、流石にA = B = C は分かり辛いから、A = (B = C)にしましたと。 まず、どっちの方法を選びますかと言う問題と、コメントはどうしますかと言う問題があるんだよね。 多分人によって回答は違うと思うけど、センスの問題になって来ると思う。
660 :
デフォルトの名無しさん :2011/05/01(日) 18:38:09.61
userformのテキストボックスから、改行含むデータを一行ずつ取得する方法がわかりません いろいろ調べてプロパティやlinesなど手を出してみたのですが・・・ どなたかご教授願えないでしょうか?
>>660 テキストボックスから纏めて取って来たデータをVBCrlfでパースすりゃいいんじゃないの?
言ってる意味違う?
662 :
デフォルトの名無しさん :2011/05/01(日) 18:49:09.07
>>661 返信ありがとうございます
本当に無知で申し訳ありません、VBCrlfでパースの意味を詳しく教えていただけないでしょうか?
面倒だからコードでね。 今手元に環境無いし、あんまりフォーム使ってないから違うかもしんないけど許してね。 Dim sTextValue() As String 'フォームのテキストボックス格納変数 Dim I as Long '欲しい行のデータのインデックス I = 0 sTextValue = Split(Me.Text1,VbCrlf) Call MsgBox(sTextValue(I) Iは欲しい行数を入れてやって、 Me.Text1の値をVbCrlf(キャリッジリターンとラインフィード)で パース(ぶった切ってやって) 配列変数のsTextValueに突っ込んでやって、 あとは配列から何番目の行のデータを取ってくるかって、 こんな意味で書いたんだけど、違っているかな?
あぁ、 Call MsgBox(sTextValue(I) のケツの括弧が無い・・・ ごめん、Call MsgBox(sTextValue(I))ね。
因みにMe.Text1が読み込むテキストボックスコントロールのつもりで 書いたんだけどCellと違うから、Me.Text1.Textとか Me.Text1.Valueとかやらんとエラーで落ちるかもしんないね。 明後日Office2010買う予定だから それまで待っててくれればもっとキチンと答えられると思うけど・・・
msgboxをcallで呼ぶだと? 無くもないがなぜにだ
気分。 MsgBoxに限らず、戻り値の無い関数やメソッドはそれを呼び出している事を 明示的に表す為にそう記述する癖が付いている。
組み込みでもcall呼ぶのか…… アリだな
ん?組み込みでも? これがまだVBAの話だから組み込みだからとか、自作関数だからとか、 考え的に分けているのかもしれないけど、いずれVB.Netとかをやる様になったら同じ名前を付けてその引数の数や型で見分けて 違うメソッドを実行する場合もあるからね。 組み込みだからとか違うからとか言う区分けはここでの説明には不適切だと思うよ。
.NETならオーバーロードがあるんだから意味なくね? 自作関数や自前クラスとかならまぁ意義はあるけど
>>670 そのオーバーロードの事言ってるんだけど
俺は自作の刻だけcallしてたが、その使い方は確かにアリだな 参考にしまう 自作関数の戻り値を変数に入れる時call使えないから一貫性がなくてもやもやしてたんだ
むかしのVBで、callをつけないとエラーになる時期があった 今はいらない。互換性のために残されてるだけ
674 :
デフォルトの名無しさん :2011/05/02(月) 17:49:52.02
アクティブなセルを画面中央にスクロールさせるにはどうしたらよいでしょうか? マウスでクルクルや、スクロールバーをウニウニさせるのが面倒なので マクロにしてキーボードショートカットにしたいです。
>>674 アクティブなセルが端の場合はどうする?
676 :
674 :2011/05/02(月) 21:19:32.13
>>675 そっか、A1とか左上の方のセルにいる場合は無視ですね。
画面に表示されている範囲を取得する方法がわからないのです。
EXCELのワークシート上に配置したコマンドボタンのウインドウハンドルを 取得する方法がありましたら教えてください。 ※別ファイルのEXCELマクロからボタンをSENDMESSAGEで押下したいためです。
>>676 ActiveWindow.ScrollRow = 5
ActiveWindow.ScrollColumn = 5
これでE5が左上に来る
5の数字のところを変数に変えてうまく指定してSelectionChangeと組み合わせる
>>679 こうか?
r = ActiveCell.Row
c = ActiveCell.Column
rf = 1
cf =1
or = 10
oc = 5
if r - or > 0 Then rf = r - or
if c -oc > 0 Then cf = c - oc
ActiveWindow.ScrollRow = rf
ActiveWindow.ScrollColumn = cf
681 :
デフォルトの名無しさん :2011/05/02(月) 22:44:08.76
動かねーぞ
動かねーぞ
動かねーぞ
685 :
デフォルトの名無しさん :2011/05/02(月) 23:39:33.28
動かねーぞ
質問なんだが。たとえば任意で列(A列とC列)を全選択して、 指定した条件に一致したセルにだけ処理を施すというのはできるんだろうか? A列を全選択→指定条件に一致するセルがあったらそのセルの背景色を変える、 というのはできたけど、A列と離れてるC列に同じ処理を同時に施すことは できなかったので。
>>686 条件付けがVBAで拾える範囲なら出来る
セルになんらかのデータがあるとか、法則性があるとか。
セルあるデータに規則性があるなら、VBAでなくて条件付書式使うべきかな
>>686 Union(Columns("A"), Columns("C").select
>>688 訂正
Union(Columns("A"), Columns("C")).Select
>>686 色塗りゃいいってんなら、任意の列に条件付き書式設定しとけばわざわざVBAで
設定する必要もないべさ
ああ、
>>687 が既にそう言ってるのね。
数式で賄え無いならユーザー関数作って補えばいいべさ。
今度はこっちから質問ですわ。 Boolean型のTrueとFalseをInteger型やLong型に置き換えるとそれぞれ-1と0になるよね。 あれって全てのビットを立たせてある状態と全てのビットを立たせてないと言う状態を表す為に あんな数値になってるって事で認識合ってる?
>>687-689 、
>>691-692 レスありがとう。背景色つけるってのは例みたいなもんだから、
個人的には計算式ぶちこんだりセル結合したりと、もう少し手を加えたいと思ってるんだ。
だから条件付け書式は使えないかもしれない。
VBAかじり始めたばかりなのでunionは使ったことなかった。明日試してみることにするよ。
ありがとう優しい人達。
>>693 それでOK。
昔のBASICでの真偽値の表し方を継承しているとも言えるけど、
結局はそういう目的だったろうし。
>>678 センドメッセージを使うと言う事はAPIを使って他のEXCELファイルのボタン押下処理を実行したいって事?
残念ながらボタンのウィンドウハンドルの捕まえ方は知りません。
代用の方法としてApplication.Runで他ブックのボタン押下時の処理を呼び出してみてはいかが?
>>695 あざーす。これでちょっとモヤってたのがスッキリしました。
>>693 TrueとFalseがVBA内の定数じゃないの?
>>698 そう。だけど中身ひっくり返してみると実はって所の質問だったんですわ。
>>696 返信ありがとうございます。
マクロにパスワードがかかった別EXCELのボタンを押下しようとしています。
>>696 OLEObjectsを使用してボタンをアクティブ後、SendKeysでボタン押下はできたのですが、
何度か試してみるとタイミングにより押下できていない場合がありました。
SendKeysでの押下だと確実性がないため、ウインドウハンドルを取得してSendMessageで押下しようとしています。
パブリックにしたいってこと?
> OLEObjectsを使用してボタンをアクティブ後
まで出来ていて、なんで
>>700 のような発言が出るかねぇ?
マクロの表示にパスワードが掛かってようと、ボタンオブジェクトの取得まで出来ているなら
コントロールツールのボタンなら.Nameを調べて「ブック名!シート名.Name_Click」
フォームツールのボタンなら.OnAction調べて「ブック名!OnAction」
これをApplication.Runすれば良いだけじゃん
(Excel 2003)質問です。 自ブックの終了処理イベントで、 自ブックが使用しているExcelアプリケーション内に、 他のExcelファイルを複数開いた場合の対処を行いたい。 以下コードで困っている事は、終了時確認メッセージが2回出てしまい、 複数開いているファイルに対しても閉じる(Yes/No/Cancel)挙動をみせる。 任意以外のメッセージが出ないようにして、閉じるようにできますか? Option Explicit Private Sub Workbook_BeforeClose(Cancel As Boolean) If MsgBox("終了しますか?", vbYesNo + vbQuestion + vbDefaultButton2) = vbNo Then Cancel = True '終了させないようフラグを立てる。 Exit Sub End If '自ブック以外(2件以上)ブックが存在する場合 If 1 < Me.Parent.Workbooks.Count Then 'Excelアプリケーション自体は終了せず '自ブックだけ保存せずクローズする。 Call Me.Close(SaveChanges:=False) '自ブックのみ存在時 Else 'Excelアプリケーション自体を終了する。 Call Excel.Application.Quit End If End Sub
>>704 > 複数開いているファイルに対しても閉じる(Yes/No/Cancel)挙動をみせる。
この認識がまず間違い
自ブックに対する閉じる処理を2回やってるから、確認メッセージも2回出るだけで
> 複数開いているファイルに対して
閉じる挙動が出ているわけじゃない
2回というのは、まずは手動でのClose(閉じる)処理、そして2回目はコードでのMe.Close
Closeを任意で2回やってるんだから、BeforeCloseイベントも2回呼ばれて、
BeforeCloseイベントに書かれた確認メッセージも2回出る、つまり
君自身が任意で行った(書いた)Close処理の回数だけ確認メッセージが出るという当然の結果
Closeを1回にすれば、当然確認メッセージも1回しか出ないし、2回目のClose(Me.Close)の前に
フラグ立てて、BeforeCloseイベントの最初にフラグ立ってたらExit Subする処理を入れるとかすれば
2回目のCloseでは確認メッセージが出る前にイベントを抜けるから、2回目の確認メッセージは出ない
Excel2002、winXPSP3 CPU:Athlon64 3500、メモリ:1G 15000行×35列のシート8枚について、それぞれ同一処理を行うマクロを作りました。 しかし、6枚目あたりから処理時間が長くなり、8枚目でリソース不足のメッセージが出ます。 現状でファイルサイズは101MBです。 こういう場合、シート数、データ数を減らす以外でどのようなことをすれば、 リソース不足が発生しなくなるのでしょうか。
>>706 その処理をプロシージャに書いて8回呼び出す
708 :
デフォルトの名無しさん :2011/05/03(火) 14:31:11.59
>>694 Rangeでもできる
Range("A:A,C:C,E:E,3:3,O5").Select
Unionが有効なのは変数を使って動的に範囲を指定したいときに楽にできる
>>706 どんな処理を行ってるかによりけり。
今分かってる状況だけで言うとメモリを増設したらとしか言えない。
710 :
デフォルトの名無しさん :2011/05/03(火) 20:59:35.92
ISNUMERICとisnumberって結果は同じ?
別物 isnumeric(゙4E2゙) isnumber(゙4E2゙) では結果が異なる isnumericは文字列で渡されたデータでも数値変換してから判定する
>>703 返信ありがとうございます。
実行後の結果を保存する都合上、オブジェクトを開いてからApplication.Runするサンプルを組んでみました。
ワークブック、ワークシート側共に「マクロが見つからないというエラーが発生してしまいます。」
呼び出し方が悪いなどありましたら、ご指摘願えませんでしょうか。
Dim xx As Excel.Workbook
Dim sh As Excel.Worksheet
Set xx = Workbooks.Open(Application.ThisWorkbook.Path & "\a.xls")
Set sh = xx.Sheets("S1")
xx.Application.Run "S1.cmdExecuteA_Click" ←見つからないというエラー
sh.Application.Run "cmdExecuteA_Click" ←見つからないというエラー
>>714 Application.Run xx.Name & "!S1.cmdExecuteA_Click"
Application.Run xx.Name & "!" & sh.Name & ".cmdExecuteA_Click"
Applicationオブジェクトをボタンの置かれているブックやシートのオブジェクトから呼ぶ場合でも
ちゃんとブック名から指定しないとダメだぞ
つーか
>>703 にも「ブック名!」を付けろって書いてあるのに、なんで勝手に外すんだ?
Runのヘルプにも、一番最初に
> このメソッドの引数では、名前を使用できません。引数には、位置のパスで必ず指定してください。
って書いてあるのに・・・
>>715 返信ありがとうございました。
ブック名付きでエラー出たので、外して検証していたソースを載せてしまいました。
以下で解決しました。ありがとうございます。
「ブック名!シート名.Name_Click」
↓
「ブック名!シートオブジェクト名.Name_Click」
質問。選択した列の一部のセルの番地だけを取得して メッセージとして表示するのはどうしたらできるかな。 たとえばC列を全選択していたとして、メッセージボックスには 「C1:C12」とだけ表示したいんだが。そういうのって無理かな。
一部ってどういう規則なの? 選択した列の1〜12行目ってこと? ちゃんと日本語で、エスパーじゃない人にも伝わるように書いてよ
>>718 そう。まさにそれ。>選択した列の1〜12行目
717の3行目から読んでもらえたら分かりやすいかも
しれない。
あと攻撃的な文章やめて。傷つくから。
>>719 Dim c as String
c = Split(Activecell.Address,"$")(1)
Msgbox c & "1:" & c & ":12"
このような理由から、 C#では クラス内部から見るとメソッドのように振る舞い、 クラス利用側から見るとメンバー変数のように振舞う プロパティという機能を ご用意しました。
うっひょー
OFFICE2010買ってきたー!!
>>719 取り敢えず複数行、列が全選択されたもので無くても対応したやつ。
複数シートや複数ブックに対応した奴は自分で考えてね。
Option Explicit
Sub SelectRngConv()
Dim oRng As Range '変換した範囲を設定するRangeオブジェクト
Dim sFromRangeAdd() As String '範囲を格納する配列変数
Dim sToRangeAdd As String '変換後範囲アドレスを格納する変数
Dim I As Long 'ループ用
Dim lRTop As Long '指定する行位置(上)
Dim lRBtm As Long '指定する行位置(下)
lRTop = 1
lRBtm = 12
'範囲毎にアドレスを配列に格納する。
sFromRangeAdd = Split(ActiveWindow.RangeSelection.Address, ",")
>>273 の続き
'範囲毎にアドレスを変換し、結合してsToRangeAddに設定。
For I = 0 To UBound(sFromRangeAdd)
With Range(sFromRangeAdd(I))
Set oRng = Range(Cells(lRTop, .Column), Cells(lRBtm, .Column + .Columns.Count - 1))
sToRangeAdd = sToRangeAdd & """" & oRng.Address & """" & ","
End With
Next
'最後のカンマを削除する。
sToRangeAdd = Left(sToRangeAdd, Len(sToRangeAdd) - 1)
'相対参照にしたいならこのコメントを戻してね
'sToRangeAdd = Replace(sToRangeAdd, "$", "")
'アドレスをメッセージボックスで出力。
Call MsgBox(sToRangeAdd)
End Sub
複数行に対応したって書いちゃったけど、複数列の間違いだわさ。 ごめんね。
>>719 こういうやりかたも
MsgBox Intersect(Selection.EntireColumn, Range("1:12")).Address
>>719 1行限定
MsgBox Selection.Cells(1).Resize(12).Address(0, 0)
複数行対応
MsgBox Application.Intersect(Selection, Range("1:12")).Address(0, 0)
あと、傷つきたくなかったら、ちゃんとやりたいことを説明できるようになろうな。
「選択した列の1〜12行目」と書いてくれれば解るが、
>>717 では
「選択した列の1行目〜値が入ってる一番下のセルまで」という希望である可能性も捨てきれない曖昧な説明だ。
(つまり、12というのが固定なのか可変なのかが、
>>717 の段階では確定していない)
>>726 こんな命令あったのか。知らんかったorz
>>722 どこの誤爆かはしらんけど、VBAでもゲッタ、セッタは使えるぞ。
うむ、確かにちょっと間抜けだったと自分でも思うが面と向かって言われるとちょっとキツイな。 まだまだ精進が足りないな。
EXCEL2003 のユーザーフォームで 特定の文字が?になってしまいます。 DBへ保存したいので、?になってしまって困っています。 うまく出力できる方法はありますでしょうか? <?になる文字.> 小? -> 小? 本? -> 本? Private Sub TextBox1_Change() Dim mytxt As String TextBox1.Value = TextBox1.Value ’ここでは変化ない mytxt = TextBox1.Value TextBox1.Value = mytxt ’これも変化ない TextBox1 = StrConv(TextBox1, vbWide) '?になってしまう Exit Sub
733 :
732 :2011/05/04(水) 23:09:28.48
記入した文字も?になってしまっている。。。 聞きようがないな。。
使っているフォントを変えろ
736 :
732 :2011/05/04(水) 23:27:09.62
>734 フォントはMSゴシックでした。 <追加で調査> 人名で文字は、小松なんだけど、松が違ってる。 木 へんに 八 と 口 が縦に並んでる文字 IME再変換したら、 しょう と読めるらしい。 んで、UNICODEと書いてありました。。。
>>736 unicodeだとエラーが出るなら
unicodeからシステム既定のコードに変えてから実行
>>736 ひょっとして環境依存文字とか言うオチだったりして
> 737 > 738 > 739 > 740 とりあえず、> 739 さんの教えてくれたサイトの ユーザ関数入れたら表示されました。 ありがとうございました。
742 :
sage :2011/05/05(木) 12:16:37.83
そんな機能があったことすら知らんかった おしえたがりのみなさん、よろしくね!
cgiで書いてるのって、Webクエリだと取れないの多くね?
俺はどうせVBA使うなら、MSXML2.XMLHTTPとかで処理しちゃうけど
その話はExcelの話ではなくHTTPの話で、スレ違いになっちゃうんだよな
>>3 ★3,4
VBAの文字列って、文字のまま大小比較するとUNICODEベースで比較されちゃうんだよな Ascで文字コードを取得するとShift-JISになのに だから If "亜" < "上" Then If Asc("亜") < Asc("上") Then の結果が正反対になる
この状況で、VBAプログラマーへの転職成功の見込みなど、自由な意見を聞きたい。 手厳しい意見は、もちろんもけっこう。
誰か以下について意見願う! 自分は、転職希望者である。 そこでだ!もし、VBAプログラマーの求人があったら応募したいと思う。もっとも、VBAプログラマーの求人自体はかなり少ないが。 とりあえず、自分のスペックはこんな感じだ。 31歳四大卒で、VBAプログラミングで高度な販売管理アプリケーションなどが作れる。 しかし、これまでプログラミングの仕事をしたことはなく、もちろんIT企業経験もない。 いわゆる実務経験なしだ。 この状況で、VBAプログラマーへの転職成功の見込みなど、自由な意見を聞きたい。 手厳しい意見は、もちろんけっこう。 よろしくお願い致す!
俺の環境だと頭のイカレた福島○穂が職場にしつこくイタ電してくるので何の問題もない
そもそもVBAプログラマって専門で求人があるの? 独立ならまあわからんでもない いろいろ書いたが整理めんどいんで他の人にきいてくれ
>>747 IT業界の経験がないのに高度な販売管理アプリケーションが作れるのか。
そもそも、何をもってして高度と言っているのかが分からない。仕様書とか自分で作れるの?
今からIT業界でやりたいならオブジェクト指向型言語や関数型言語の方が先々困らなくて
済むと思うけど、まず何でVBAを選択しようと思ったのか聞きたい。
>>747 ちなみに俺は同様にIT関連の業務の経験無しで27歳からソフト開発の職についたよ。
それまでの経験は、独学でのWebアプリとしてのPerlのみ。
自作掲示板から始まってテキスト型データベース、HTTPやSMTPもPerlから叩けて、
JavaScriptを介した自動処理やら、Perlに関してはかなり使いこなせてたと思う。
で、入った先で最初にやったのがPHPでの開発。Perlを充分に使いこなせていたからか、PHPはすんなりと利用できた。
FileLockやwebアプリに有りがちな処理ロックの知識も充分だったし。
そしてPostgreSQLを利用してのデータベースを構築した。もちろんSQLは初めて使用したが。
それで覚えがいいということで、VBは未経験だったがVB開発の応援メンバーとして配置され、
ここでも即VBを使いこなせるようになってそのまましばらくはVBでの開発をしていた。
でもWindowsアプリを造るにつれ、VBを覚えるとかCを覚えるとかというのは日本語を読み書きできる、程度の基本事項であり、
特にデータベース系はwinアプリとしてはシステムに深く係らないので誰でもできる簡単なコードなのだと思ったよ。
その後VCでDirectXを扱うジョブに入ったらいきなりわけわかんなくなったw
夢を壊して悪いけど
>>747 IT産業以外のところで便利屋さんになった方が幸せな気がする
あるいは自分で会社作って、頑張るという手もある
需要は確かにあるけど、むしろ必要なのは営業力かもね
折角現実逃避してんのに蒸し返すなバカ
今日もテレビ番組にいろいろ書いたが
758 :
デフォルトの名無しさん :2011/05/07(土) 15:26:59.18
自作のユーザーフォームに入力、実行、閉じる。という操作をしていますが、ユーザーフォームを閉じても変数に値を保持し続けさせるということは可能でしょうか? よろしくお願いします。
可能
760 :
デフォルトの名無しさん :2011/05/07(土) 15:43:24.48
閉じずに隠せばいいんじゃね?
俺の環境だと子供がいない
762 :
758 :2011/05/07(土) 17:10:52.62
答えていただきありがとうございます。隠すのは考えたのですが、ここの方ならもっとスタイリッシュな方法があるかと思いまして。何かヒントあれば教えてください。
>>762 標準モジュールの変数に保持しておく方法と、
変数保持用のクラスを作ってそっちに保持しておく方法の2つを
いまパッと思いついたけど、どっちも似たようなもんだべさ。
どっちでもゲッタとセッタ作っとくと綺麗に見えるべさ。
標準モジュールを使う方法だと、たとえばUserForm1とUserForm2と言う二つのフォームを作ったとして、 UserForm1にはCommandButton1と言うボタン、UserForm2にはTextBox1と言うテキストボックスと、 CommandButton1と言うボタンを設置しましたと。ついでにModule1という標準モジュールを作っておいて ここで、UserForm1には Option Explicit Private Sub CommandButton1_Click() Call UserForm2.Show End Sub UserForm2には Option Explicit Private Sub UserForm_Initialize() Me.TextBox1 = Module1.GetTextVal End Sub Private Sub CommandButton1_Click() Call Module1.SetTextVal(Me.TextBox1) Call Unload(Me) End Sub と記述してやると。 続く
>>764 の続き
Module1には
Option Explicit
Dim M_sTextVal As String
Public Function GetTextVal() As String
GetTextVal = M_sTextVal
End Function
Public Sub SetTextVal(IN_sTextVal)
M_sTextVal = IN_sTextVal
End Sub
と記述しといてUserForm1から実行してCommandButton1を押下してUserForm2に遷移したあと、
TextBox1になんか書いて、UserForm2のCommandButton1を押下して閉じても、
UserForm1のCommandButton1を押下して再度開くと、UserForm2のTextBox1に
閉じる前の内容が設定されているでしょ?これが標準モジュールを使ったやり方ね。
おっと、Public Sub SetTextVal(IN_sTextVal)の所は引数がString型と言う事を 明示的に書いといた方がいいね。 Public Sub SetTextVal(IN_sTextVal As String)ね
質問させてください。 Set で変数にブックを指定したいのですが、エラーが出ます。 1つは Dim 転記元 As Workbook, 転記先 As Workbook OpenFileName = Application.GetOpenFilename("Microsoft Excelブック,*.SLK") If OpenFileName <> "False" Then Set 転記先 = Workbooks.Open(OpenFileName) Else MsgBox "キャンセルされました", 16 Exit Sub End If として転記元に指定し、 2つ目は If Dir("C:\Documents and Settings\EW45449\デスクトップ\SGC 進捗\メッキSGCリスト" & Format(Date, "yymmdd") & ".xls ") = "" Then MsgBox "本日のメッキSGCリストがありません" & vbCrLf & "SGCリストの作成を実行してください", 68, "エラー" Exit Sub Else Workbooks.Open Filename:="C:\Documents and Settings\EW45449\デスクトップ\SGC 進捗\メッキSGCリスト" & Format(Date, "yymmdd") & ".xls " Set 転記元 = ActiveWorkbook End If としたのですが、 転記先.Worksheets("テスト").Active 転記元.worlsheets("リスト").Active 実行時エラー’438’: となります、どのように修正したらよろしいでしょうか?
>>767 先と元のブックごっちゃになってね?
どっちかのブックに「テスト」「リスト」の名前があるシートが無いんでしょ
>>767 まず、転記元.worlsheetsじゃでないべさ。
転記先.Worksheets("テスト").Activate
転記元.Worksheets("リスト").Activate
でやってみ。
それとActivateは何かしたら切り替わるから
あまり使わない方がいいと思うよ。
>>768 さん
シート名は確認しました。
>>769 さん
やってみましたが、
転記先.Worksheets("テスト").Active
でエラーとなります。
転記元を指定するいい方法はありますか??
>>770 おっちょこちょいさん。
「転記先.Worksheets("テスト").Active」じゃなくて
「転記先.Worksheets("テスト").Activate」だわさ。
Activeの部分をもう一度Activateに変えてやってみ?
それでダメならまた考えるわさ。
>>771 失礼しました!
ご指摘の通りActivateにしたら上手く動きました。
ありがとうございました!
773 :
772 :2011/05/07(土) 20:39:45.62
続けて質問させてください。 転記元のオートフィルタの結果を転記先にコピーしたいのですが、上手くいきません。 転記先.Worksheets("テスト").Activate For j = Cells(Rows.Count, 1).End(xlUp).Row To 2 Step -1 Cells(Rows.Count, 3).Value = myvalue Rows(j).Resize(2).Insert 転記元.Worksheets("リスト").Activate Selection.AutoFilter Field:=16, Criteria1:="=" & myvalue 転記元.Worksheets("リスト").Range("W2:AD4").Copy Destination:=転記先.Worksheets("テスト").Cells(Rows.Count, d) 転記先.Worksheets("テスト").Activate Next としているのですが、 Rows(j).Resize(2).Insert で2行ずつ挿入はできているのですが、オートフィルタの結果がコピーされません、 どこをどのように修正したらよろしいでしょうか?
>>773 まだろくすっぽコード見たわけじゃないんだけど、
転記元.Worksheets("リスト").Range("W2:AD4").Copy Destination:=転記先.Worksheets("テスト").Cells(Rows.Count, d) の、
一番最後のCells(Rows.Count, d)の列に指定しているdってこのソースでは何を設定しているか
見えないんだけど、何を設定しているの?
>>774 dはあらかじめInputboxで指定しています。
>>776 色々ある。正直いって何がやりたいのかが良く見えない。
まず、myvalueはどこで設定しているのかな?いや、どこかで設定していたとして、
Cells(Rows.Count, 3).Value = myvalueを行った後に行挿入を行おうとすると、
最終行に書き込んだそのデータはどうするのと怒られる筈。
後、Selection.AutoFilter Field:=16, Criteria1:="=" & myvalueの
Selectionは何を選択しているのか。まずここで項目名を指しているセルの範囲を
設定しなくてはならないのでは?
それとループの中でまたオートフィルタの絞り込みを行っているけど、1回の絞り込みでいいのか、
再度絞り込みたいのか。再度絞り込みたいなら一度絞り込みを解除してから
行わないと怒られるんじゃない?
本来これらのエラーが出ると思うんだけど、実際に出てないとすればオートフィルタ―自体の
範囲がちゃんと設定されていない可能性もあるね。
取り敢えずその辺から見直して見るといいんじゃないかな?
おおぅ、自分にレスしてどーする。
>>776 は
>>775 へのレスね。
ちょっと疲れたべさ。暫く自分の方のAndroidの勉強するわ。
まぁ要するに良く見えない。
>>776 ,778
転記元のデータをオートフィルターで抽出して、転記先に張り付けていきたいのです。
いろいろ修正して
For j = Cells(Rows.Count, myCol).End(xlUp).Row To 2 Step -1
myvalue = Cells(j, 3)
Rows(j).Resize(2).Insert
r = j - 1
転記元.Worksheets("リスト").Activate
ActiveSheet.Range("A1").Select
Selection.AutoFilter Field:=16, Criteria1:="=" & myvalue
転記元.Worksheets("リスト").Range("W2:AD4").Copy Destination:= 転記先.Worksheets("テスト").Cells(r, d) -@
転記先.Worksheets("テスト").Activate
Next
となり、あと少しで完成しそうなのですが、
ただ、@の部分で可視セルを選択しないといけないのですが、
可視セルのある指定範囲の選択(3列目から6列目等)は
どうすればできるのでしょうか??
分かりにくい文章、見にくいコードで申し訳ありません。
本当に意地汚くて嫌いだ、自分。体も精神も恥ずかしい。
>>779 よく分からないけど
転記元.Worksheets("リスト").Range("W2:AD4").Copy Destination:= 転記先.Worksheets("テスト").Cells(r, d)の、
Range("W2:AD4")の部分をどうやって動的にコードで表現しようかなって事いってるのかな?
そうだとしたら、たとえば3列目から6列目の選択範囲をコピーしたいなら、
Range(Cells(2, 3), Cells(Cells(Rows.Count, 6).End(xlUp).Row, X))
(※Xはオートフィルタ―で絞り込みの対象としてる列の横位置)
とかに変えてあげればいいんじゃないかな。
おっと違うな。 Range(Cells(2, 3), Cells(Cells(Rows.Count, X).End(xlUp).Row, 6)) (※Xはオートフィルタ―で絞り込みの対象としてる列の横位置)か。 なんか疲れてるみたいだわ。
783 :
779 :2011/05/08(日) 01:01:11.56
>>782 ありがとうございます。
なんとかなりそうです。
助かりました!
>>783 お役に立ててなによりだけど
もし自分の勉強の為じゃなくて仕事として作ってるなら、
転記先のシートに行を挿入する必要は本当にあるのか、
変数dはループの中で特にいじってないから貼られる先は常にいっしょじゃないのか、
なによりシートをアクティブにしてセル操作を行っているだけで、
どのブックのどのシートのどのセルを操作すると言う書き方をしてないから
操作的に非常に不安定じゃないかとか
まぁ色々あるからその辺を良く考えて作り直した方がいいと思う。
どうせ長いコードじゃないし。
>>784 仕事で使用するために試行錯誤しながら作っています。
変数dと行の挿入はこの前にデータの整理や不要行・列の削除を
行っているため必要となっています。
ご指摘のようにシートやセルの操作は改善の余地が大ありと
思っています。
また分からないことがあれば質問させていただくので
機会があればご教示の程よろしくお願いします。
>>773 あまり読んでないけど、
オートフィルタの結果のコピーは、
範囲.SpecialCells(xlCellTypeVisible).Copy
かな
でもVBAでオートフィルタ使うのは良くないと思う。
だから質問自体がナンセンス。
私なら転記元のデータを走査してヒットしたら、ひとつずつ転記先にコピー
していくか、collectionか何かに溜めてからまとめてコピーするかだな。
念のため、コピーと言ってもCopyメソッドを使うわけではないよ。
if ヒットしたら then
転記先.Cells(ヒットした分).Value=転記元.Cells(走査した分).Value
end if
787 :
758 :2011/05/08(日) 17:06:37.90
何度もすみません。 フォームを閉じた後も変数を保持しておく方法がまだ解決していません。 webをいろいろ見てみたのですが宣言セクションで宣言した変数はブックを閉じるまで値を保持し続ける と書いてありやってみましたが上手くいきません。 763さんが言っている「標準モジュールの変数に保持しておく方法」 というのも調べてみましたがよくわかりませんでした。 本当に申し訳ありませんが、このようなやり方が記載されているweb もしくは、コードを教えて頂けると助かります。 馬鹿な質問で申し訳ありません
>>787 一番簡単なのはワークシートのセルに保存しておくかな
標準モジュールの宣言セクションでPublic で宣言した変数を
フォームで使うようにしたらどうなの
>>787 要するに変数のスコープという基本的な知識が抜けているんだよ
他にもプログラミングの基本的な知識が抜けすぎ
このまま先へ進めても分からないことだらけになってしまう
VBAでプログラミングの勉強をするのは困難すぎる
素直にCやJavaなどメジャーな言語の入門書を読めば必ず書いてある
どうでもいいけどVBAの良著って悉く絶版だよね VBAに限った話じゃないかも知れないけど
>>790 そう思ってクラスモジュールを作ってやる方法を書かなかったんだけどなぁ。
プライベートとグローバルの宣言の違いさえ理解しててくれてればなぁ。
クラスとかまじわかんね。 前に進められたVBのエラーコーディングはとても参考になった。
C#のクラスは大体分かるが、VBAのはよく分からない不思議 MSも早く.NETに移行すればいいのに
EXCELのVBAやVB6.0は構造化言語とオブジェクト指向型言語の狭間にいる言語だから仕方ないと言えば仕方ない。 オブジェクト指向型言語から入った人から見れば、このスレで書いてるコードとか見た時、 あー、破綻してるなコレと思う事が多々あるだろうし、 低級言語から入った人とかが見れば、 ぐはぁ、メモリが、処理コストがぁ〜と思う事も多いと思う。 でもま、時代の流れから見てもオブジェクト指向を取り入れて損はないと思うべさ。
とにかく
>>787 の人にはまだちょっと
どんなクラスを作って、どこでインスタンスを生成して
どんな使い方をするのかを考えて組むのは
>>970 の人が言ってる通り多分まだ無理。
一度
>>764-765 に書いてある様に実際に打ち込んで走らせて流れを追ってほしいな。
それでも理解できなければカプセル化の概念が崩れるけど
>>788 の人が言ってるみたいに、
標準モジュールにPublicで宣言した変数に保持するのが手っ取り早いかな。
質問させて下さい for文中で、変数をnとしてセルを操作しています。 その変数を用いてあるセルに関数を入力して、その関数中の指定したいセルをnを用いて変化させたいのでうまくできません。 うまく伝えられないので、現状としてやりたいことは、 あるセル(ここではA1)に数字を入れて、その数だけfor文を繰り返させています。 A1セルに10と仮に入れて、その隣Bセルに、for文を用いて、Eセルを参照するVLOOKUP関数をA1に入れた数字の行数分繰り返させたいのです。 理想としては for n =1 to n Range("B"&n)="=VLOOKUP("E"&n,sheet2!A1:B100,2,FALSE)" (参照先のsheet2などは特に問題ありません) next のようにして、nが増えるにつれてVLOOKUPの部分を書き込んでいって欲しいのですが、直してもうまくいきません。(当然上記じゃ動かない) 参照HPなどで結構ですので、よろしければ教えて下さい。
>>797 はい
n = Cells(1, 1)
For n = 1 To n
Cells(n, 2).Formula = "=VLOOKUP(E" & n & ",sheet2!A1:B100,2,FALSE)"
Next
799 :
758 :2011/05/08(日) 21:10:27.32
皆さん親切に教えていただきありがとうございます。とりあえず788さんの方法でできました。764さん折角書いていただいたのに見逃してごめんなさい。これを見て勉強させていただきます。
800 :
デフォルトの名無しさん :2011/05/08(日) 21:30:29.26
Webクエリの機能で、VBAによって指定したURL(ワークシート上のセルから取得)を開くことは出来ませんか?
たとえばA1に"
http:yahoo.co.jp "と書いてあって、VBAでそのページを開く方法です。
Excel2003です、よろしくお願いします。
>>800 わざわざVBA使わんでも、ハイパーリンクじゃ駄目なの?
802 :
デフォルトの名無しさん :2011/05/08(日) 21:52:04.38
>>801 目的からして処理が速くないと意味無いのでハイパーリンクじゃ駄目です
804 :
デフォルトの名無しさん :2011/05/08(日) 21:54:43.51
>>803 Webクエリなのでブラウザは関係ないと思いますが
ワークシートに展開する テキストに流し込んでHTML作成 フォームのに描画する webbrowserコントロールでブラウザ作る 梳きなのどうぞ
>>799 なんか突貫工事っぽいけど、とりあえずは完成したのかな。
完成する前にとやかく言うのもアレだと思って言わなかったんだけど、
>>786 の人の意見はごもっともだからね。初期の設計そのものに問題があるよ。
例えば私だったら後々抽出条件が複雑になる様な改修が入る事を想定して、
転記元のシートにSQL投げてRecordsetに値を取得して、それを転記先のシートに
展開する様な方法を視野に入れたと思う。
まぁ、実際そのツールの事を知ってる訳じゃないから何とも言えないけどね。
頑張ってね。
>>804 マクロ記録でwebクエリ挿入したのを見るといいよ
808 :
797 :2011/05/08(日) 22:26:51.53
>>798 できました!
ありがとうございます。とても助かりました。
>>800 こんなんでどう?適当だけど。
Option Explicit
Sub ChangeWebQueryRefer()
With ActiveSheet.QueryTables(1)
.Connection = "URL;" & Cells(1, 1)
.Refresh
End With
End Sub
ああごめん、
>>809 は既になんかWebクエリが設定されていた後でA1に変更したい
URLを設定した場合ね。
811 :
デフォルトの名無しさん :2011/05/08(日) 23:19:23.35
812 :
797 :2011/05/08(日) 23:21:47.69
たびたびごめんなさい・・・
>>798 で、関数中のEを変数nにしたがって移動させるにはどうしたらいいのでしょうか?
n=3のとき関数中のEをGにしたいのですができますでしょうか?
よろしくお願いします。
>>812 よくわからんがifで条件分岐させるのじゃダメなの?
>>812 はい
n = Cells(1, 1)
For o = 1 To n
p = "E"
If o = 3 Then
p = "G"
End If
Cells(o, 2).Formula = "=VLOOKUP(" & p & o & ",sheet2!A1:B100,2,FALSE)"
Next
816 :
797 :2011/05/08(日) 23:40:54.19
>>814 ありがとうございます。しかし私の書き方が悪かったようで、nがいかなる数字の場合でもそれを加えた数だけ列を移動させたいのですが無理でしょうか?
なんで1が先にWakeUpすんだ・・・ 放物線の話しじゃないの。
818 :
797 :2011/05/08(日) 23:50:48.36
>>815 OFFSETでできました!
ありがとうございました。
>>816 はい
n = Cells(1, 1)
For o = 1 To n
p = Cells(1, o).Address
p = Replace(Left(p, InStrRev(p, "$") - 1), "$", vbNullString)
Cells(o, 2).Formula = "=VLOOKUP(" & p & o & ",sheet2!A1:B100,2,FALSE)"
Next
RO浄水器をつければいいだけやろ
822 :
デフォルトの名無しさん :2011/05/09(月) 15:02:27.04
テキストボックスが60個あって 入力する度に文字をチェックするプロシージャを作ってるんですけど、 PrivateSub TextBox1_Change (略 PrivateSub TextBox2_Change (略 ・ ・ ・ と60個も並べたくなく、 一発で済む方法ないですか?
TextBox(0) コントロール配列ってVBAじゃ使えなかったっけ?
VBAでコントロール配列は使えない .Textプロパティに代入とかならControlsでも出来るけど イベント取りたいとなるとコレクションとクラス使った疑似コントロール配列だな
>>822 この手の質問定期的にきてうざいな
クラスモジュールを使えばできるから
自分で調べてみろ
826 :
822 :2011/05/09(月) 21:57:30.59
>>823-825 サンクス、「擬似コントロール配列」で検索してみたら出てきた。
ホントはChangeじゃなくAfterUpdateだからそんなに難しくなさそう。
頑張ってみるよ!
朝鮮人に関わると こうなる見本w
828 :
デフォルトの名無しさん :2011/05/10(火) 13:58:47.10
失礼します。vista/2007(2003互換mode) ボタンコントロールクリック、以下の処理内で実行時エラー32809が発生します。 Dim data As Dai Dim sheet As ISheetFormat While Removal.HasNext Set data = Removal.NextDai If data.IsP Then Set sheet = Sheet2 ☆ ElseIf data.IsBunri Then Set sheet = Sheet11 ☆ Else Set sheet = Sheet10 ☆ End If sheet.SetValue data, dt sheet.CopyBefore ActiveWorkbook.Sheets("Sheet1") Wend ---------------------------------- 以下の手順を踏むと実行時エラーが発生します。 @ブックを起動 Aなにもせずとりあえずブックを上書き保存→excel終了 Bブックを起動 C上の処理を実行 ちなみに@の後にCを行うと正常に動作します(ここ大事)。 また、一度エラーが発生すると上記処理内に限らず ☆マークのシートを参照しようとするとエラーが発生します。 ☆マークのワークシートはそれぞれISheetFormatをimplementsしていますが、 一度エラーが発生するとimplementsしようがしまいがとにかく参照しようとすると32809…。 原因につながるヒントを頂けると助かります。
829 :
デフォルトの名無しさん :2011/05/10(火) 14:03:17.25
シート全体をvalueに換えるうまい方法をおしえてくれ。 cells.copy cells(1,1).pastespecial paste:=xlpastevalue 以外
>>829 釣りだな。ほらよ。
Range(Cells(1,1),Cells(Rows.Count,Columns.Count)) = Range(Cells(1,1),Cells(Rows.Count,Columns.Count))
間違えた。ケツに.Valueでもくっ付けとけ。
> Range(Cells(1,1),Cells(Rows.Count,Columns.Count)) なんでわざわざこんな書き方してるの?釣り?
お前ならどう書くっていいたいんだ?
>>832 は逃げたか。
釣り用のヘボいコードだと言う事までは分かったらしいが、
この程度のコードのどこがヘボいかまでは指摘できる脳みそを持ち合わせていなかったようだな。
またアフォが暴れてるなw Range(Cells(1,1),Cells(Rows.Count,Columns.Count))ってCellsと同じだわな
質問です。 実は今マリオみたいなゲームを作ろうとしていますが、セルをドットの様に使って 横スクロールをした時、すぐに右端へたどり着いてしまいます。 擬似的に左右で永久にスクロール出来る様に見せかけたいのですが、どんな方法が有りますか? 又、その方法を使った時、最少のセルの横ピクセル数は何ピクセルくらいになりますか? 環境はWinXPのEXCEL2003です。
>>836 右端に来たら下の方の行とか別のワークシートに移動させる
>>839 なるほど、そうすると最低のセル横幅は256セルで2画面分になる様に設定すればいい訳ですね。
何となく目処が立ちました。ありがとうございます。
>>830 =
>>833 =
>>834 は、マジで
>>835 に気付いてなかったようだなw
この程度終わる話に「指摘できる脳みそ」なんて発想は出てこないから
Cells以外の何かを発想してたんだろうね。恥ずかしすぎるw
VBAゲーム博物館にエクセルマリオがあるぜ
やはり
>>829 は釣りだったな。
そして
>>829 ,
>>832 ,
>>835 ,
>>841 は全て同一人物。
>>829 で質問を投げといて、しょぼい答えが返って来るのを待って、返って来たらぶっ叩く。
それを楽しみにこのスレに来ている訳だ。
今回は煽りをくれてやって初めて反応したが、
やっぱりこいつがいつもスレが荒れる原因を作ってる奴だったんだな。
どうでもいい荒らすな
>>836 マシンスペックによって動作速度が違うゲームが出来上がりそうだなw
>>845 その辺はAPIを使ってwaitかけて統一するつもり。
余りにマシンスペックが低いのは見捨てる方向で。
>>843 残念、その中に俺が一つ入ってるので全て同一人物ってのはハズレ
他3つが同一人物でも、少なくとも2人だ
俺の予想では質問者は別で、残り2つが同一人物で、計3人だな
>>1 からここまで全て俺の自演なんだ
>>484 は気付いてないかも知れないが、君は俺の自演から生まれた人格なんだよ
さあ俺の元へ還れ
俺は一つ書いてるんだが、まったくつまらん
計算や抽出検索、転記などの機能ごとにモジュール分割したいのですが UserFormの CommandButton1_Click() のようなものはユーザーフォームに直接記述して、 実行するものをcallするといった感じでしょうか? それともUserFormには一切記述しないのでしょうか? いまいち質問が分かりにくいかもしれませんが、よろしくお願いします。
イベントは標準モジュールには丸ごと移動することは出来ないのでCallすることになるけど クラスモジュールにならイベントごと移動することも可能 どちらを使うかは852も言うとおり「好きにしろ」で
changeイベントの中でイベントの起因に なったセルが、 ペーストされたのか、手入力されたのか、 分かる方法ない?
>854 Target の個数が複数だとペースト1択だけど、1個だと・・・どうでしょうねえ
>>855 ありがとう。
解決の方向性は見えました。
857 :
デフォルトの名無しさん :2011/05/12(木) 13:09:51.16
行を一個飛ばしで選択する方法を教えてください 1、3、5、7、9、 といった感じです
CTRLを押しながら選択する
まず素数判定プログラムを作ります セルにセットします 素数を一つ飛ばしで一致させるプログラムを作ります 配列にランダムソートで格納します APIから時刻を取得し、データが枝と一致したら、シートから正規表現で該当セルを抜き出します 抜き出したセル番地を配列にセットします IDEをインポートして、自コードを行を一つ飛ばしで選択出来るよう書き換えます 保存せずに終了させます
ワークシートに配置したシェープから親オブジェクト(ワークシートオブジェクト)を取得しているプログラムがあるのですが、 別のパソコンでデバッグした場合、「Shapes」が取得される場合があります。 同じプログラムソースコードから取得した型の結果が違うのですが、 原因が掴めないです。 Debug.Print Typename(ActiveSheet.Shapes(0).Parent) 当パソコン→Worksheetが返されます。(正常結果) 別パソコン→Shapesが返されます。(異常結果) 何が違うのか教えていただけませんか。すみません。
862 :
861 :2011/05/13(金) 23:16:31.18
すいません。 両端末とも、 OS: Windows XP オフィス:Excel 2007 です。
>>862 当ててあるサービスパックが違うんじゃないの?
864 :
861 :2011/05/14(土) 00:13:20.35
>>863 ありがとうございます。
なるほど。
元々、シートのシェープの親を取ってくる事になるので、
はじめから、ワークシートオブジェクトのみを取得してきたほうが安定しますね。
大変助かりました。
865 :
デフォルトの名無しさん :2011/05/14(土) 01:26:51.28
Excel2003から2007に移行したのですが、 Auto_Openを動作させずにマクロを開きたい時に、Excel2007ではShiftキーを押したまま Excelを起動した時でもAuto_Open処理が動いてしまいます。 また、マクロ設定を無効にしている場合はマクロの編集ボタンが無効になっており プログラム編集ができません。 Auto_Openを動作させずにマクロを編集する方法をご教授願います。
2007でも出来たと思うが
Win XP + Office 2007で試してみた たしかにShift押しながら起動でもAutoOpenは起動するね 回避方法は知らん
>>865 直接フォルダからEXCELを開くんじゃ無くて、一度EXCELのアプリケーションを立ち上げてから
「ファイルタブ」の「開く」で開きたいブックを選択して、シフト押しながら「開く」ボタン押下で出来るわさ。多分。
ついでに質問させて頂くわさ。 テーブルジャンプを行いたいです。 具体的には2つの動的な配列変数を用意して、一つの配列に処理順、もう一つの配列に 実行する関数のアドレスを設定して その配列に設定された順序に関数を実行する処理を作りたいのです。 方法としては、スタックポインタが指しているアドレスの 関数戻りアドレス情報を次の呼び出し関数の呼び出しアドレス情報に書き換えてEnd Functionなり End subなりを実行して行うか、または なんらかしらのAPIでコールバックして行う方法を考えているんですけど、 取り敢えず配列に処理順序と関数の開始アドレスを設定する所までは上手くいったものの、 その後のいい方法がなかなか無いんです。 かといって適当に繰り返し処理や分岐でただの関数呼び出しを行ったんでは 処理コストが掛かり過ぎるのと、管理し辛いといった面から避けたい訳です。 特に今作っているのがゲームだから、処理コストは出来るだけ掛からない様にしたいのです。 何かいい方法はありませんか?
>>870 別にAPIを使う方法じゃ無くても実現出来れば方法にこだわらないわさ。
何ですれ違いになるのかな?
>>872 まず★2を読んで欲しい。
それと、全体から見てVB6のUIでは遅すぎて考えた通りのゲームを作れ無いので、
EXCELのシートを使ってゲームを作成している。
その辺の処理速度を考慮しての話だからすれ違いでは無いよね。
だから処理コスト、処理速度を考慮していくと、Excelは描写手段として使うだけで その前の処理は全てExcel関係ない処理になるんだってば それにVBAと比べれば、処理も描写もVB6の方が速いぞ 間違った方法取ってなければな
まぁ余りダダを捏ねていてもスレが荒れそうなので引っ込むわさ。 でもいい方法が有ったら教えて欲しいなぁ。
まあ、知ったか教えたがりは2chには多いから スレ違いでも教えて貰える可能性は0ではないからな
877 :
デフォルトの名無しさん :2011/05/14(土) 10:40:19.28
関数呼んだら、番号によってSelect-Caseした後、ジャンプすれば ジャンプテーブルになるんじゃないかな。
>>877 ありがとう。
その方法は一番最初に考えたんだけどやっぱり条件分岐なもんで
キャラクターの属性と動作ごとに処理分けを行うと相当数になるから
出来れば条件分岐ではなく、インデックスを与えてそれを実行する様な方法を取りたかったんですわ。
でも最悪、その方法を使う事にさせて頂きますわ。
本当にありがとうございます。
ただ、この話題はすれ違いらしいのでこの辺で。
最悪の方法ならスレ違いじゃないなw
880 :
865 :2011/05/14(土) 12:14:03.44
エクセルならシートに配列書き出してワークシートソートすれば早かろう これならスレ違いにもならぬ
えっ?
ワークシートソートの方が速いって 余程ヘボいソートアルゴリズム使ってるんですねw
>>883 がワークシートのソートやクイックソートより超っ速いコードを公開してくれるそうなので楽しみに待ちましょう
嫌味のつもりで言ってるのだろうけど、その辺に転がってる物を 「公開してくれるそうなので楽しみに待ちましょう」とか、バカっぽすぎて吹いた。
そのうち気付くだろう その言葉は自分にこそ相応しかったと
このスレで語尾に草生やす奴は総じて口だけのヘタレだよね
草1つの場合はそうでもなかったな。 草複数生やす奴は総じて口だけのヘタレだったけど。
単芝死ね
悔しかったんだね
悔しいです(`皿´)
単芝が糞かどうかは
>>883 がコード晒せるかどうかにかかっているのか。
責任重大だな。
>>894 なるほど、クイックソートより超っ速いのがその辺に転がっているとか言ってる時点で
察しろよ、言わせんな恥ずかしいって事か。やっぱり語尾に草生やす奴は総じて駄目か。
896 :
デフォルトの名無しさん :2011/05/14(土) 18:08:30.38
関数を指定したセルに文字を設定しつつ、 着色もしたいのですが、下記のユーザ定義関数では #VALUE!になってしまいます。 Public Function hoge() ActiveCell.Interior.colorIndex = 3 hoge = "aaa" End Function どのようにすれば実現できますか? Windows7、Excel2010です
>>896 ユーザー定義関数内で着色しようとしてるからじゃない?
条件付き書式で代用すれば?
>>897 どういった意味でしょうか?
>>898 実際には複雑な条件チェックをして
その結果によって着色するかしないか
を決めたいので条件付き書式では難しいんです。
>>895 なんか曲解してるな
言い負かされて悔しいからわざとねじ曲げて解釈して憎まれ口叩いてるのか?
ワークシートソート(並べ替え機能)との比較が いつのまにかクイックソートとの比較になってる 悔しさのあまり顔真っ赤にして必死になってると、 こうやって話が明後日の方向に飛んでいってしまうのかな?
もうやめて! あたしのためにこれ以上争わないで!
>>903 プッ
今頃何言ってるのかな。逃げに入っちゃったかな?
>>884 の発言の後で
>>885 でその辺に転がっているって言ってるよな。
ほら、その辺に転がっているならとっとと挙げてみれば?
人の言ってる事オウム返しにしか言えない奴にはちょっと厳しい?
セルに自作関数を使って制御したいんだろうけど
あらら、勘違いを突かれて壊れちゃった? 本当に逃げてるなら、逃げてると言われるのは痛いところだろうが 逃げに入ったとか、ちょっと厳しいとか言われたところで 根本を勘違いしてる奴の言葉じゃ滑稽なだけで煽りにもなってないもんな
>>907 あーあ、完全に逃げたな。
結局根本とか何とかウダウダ言ってその辺に
転がっているって自分で言ってたコードも晒せないんだもんな。
やっぱり草生やす奴は総じて糞と言うことが確定したな。
今どういう話なのか三行で
ワークシートソート(並べ替え機能)より速いソートがあるとしか言ってないんだから ワークシートソート(並べ替え機能)より速いソートを晒せば納得するのか?
>>896 ひょっとして文字を設定するという部分は
hoge = "aaa"
の部分?
>>909 ワークシートソート(並べ替え機能)より速いソートがあると言ったら
>>883 クイックソートより超っ速いコードを公開してくれる
>>884 といきなり一言も出してないクイックソートにすげ替えたバカが粘着中
>>910 ハァ?
それじゃ
>>884 に対する
>>885 の発言の解になってないだろ。
ちゃんと自分でクイックソートより速い奴がその辺に転がっているって
言ってるんだからそれを晒せばいいだけじゃないか。何か問題でもあるのか?
君たち!頭悪そうだからやめておきなさい(^^;
worksheet chengeを使ってターゲットを自動で変更すりゃいいかなと思ったけど これうまくいかねえな
917 :
896 :2011/05/14(土) 19:29:19.59
>>912 そうです。
セルに =hoge() と入れたら、そのセルに"aaa"と設定した上で着色したいんです。
>>917 Public Function hoge(str As String)
ActiveCell.Interior.colorIndex = 3
ActiveCell=str
End Function
そもそもVBAエディタに書いたコードをワークシートから呼べるの?
>>914 自分の発言には責任持つけど、バカの曲解にまでは責任持てませんぜ
俺が書いたのは
「ワークシートソート(並べ替え機能)より速いソートがある」
と、それに対して公開しろ的なレスがあったので
「(自分があると書いたワークシートソートより速いソートは)その辺に転がってる」
だけだ
「クイックソートより超っ速いコードがあると言ってるなんて曲解してるバカがいるが
それについてもその辺に転がってるぜ」
なんてことは書いた覚えは無い
>>917 ワークシートにこれを書けば
Const ConstTargetStr = "=hoge()"
Private Sub Worksheet_Change(ByVal Target As Range)
'シート上のどっかが書き換わったらConstTargetStrを探し出す
'探し出したセルに"aaa"を代入して色を変更するプログラム
End Sub
>>918 なんだ、僅差でクイックソートよりワークシートのソートメソッド使った方が速いのか。
これは
>>921 はどう言い訳するんだろうな。
じゃあ「ワークシートソート(並べ替え機能)より速いソートがある」のを晒してくれればいいや。
ちょっと楽しみ。
俺から見ればどっちも 「ワークシートソートなんてクソ」 って言ってるように見えたが
>>923 うわーこんな事できるの知らなかったわ><
928 :
896 :2011/05/14(土) 19:43:58.95
>>919 やってみましたが、#VALUE!になってしまいます。
>>920 呼べます。
それをユーザ定義関数と呼ぶらしいです。たぶん。
>>922 これでも要件を満たせますが、
実際にやりたい処理はもっと複雑なので、
シート上の変更のたびに呼び出されてしまうのは、
避けたいです。
>>928 こちらの Win2000, Excel2000 では
以下のコードでおkだった
Public Function hoge()
ActiveCell.Interior.ColorIndex = 7
hoge = "aaa"
End Function
932 :
896 :2011/05/14(土) 20:05:01.64
>>931 色も変わりました?
WinXP、Excel2003もあるので、それで試してみました。
#VALUE!にはならないですが、色がかわりませんでした。
そのhogeはちゃんと標準モジュールに書いてる?
935 :
896 :2011/05/14(土) 20:10:22.32
>>933 そうですか。
excel2003から仕様が変わったということですかね。
>>934 はい。書いています。
XP,Excel2000だと色はかわらんな
>>935 何回かやってたら色が変わらなくなった。
VBエディタの実行ボタンを押すと変わるんだけど・・・
938 :
896 :2011/05/14(土) 20:15:49.05
>>937 あ、そういうことですか。
VBAエディタから実行させるとExcel2003でも、2010でも正常に動きます。
ワークシートから=hoge()ではどのバージョンでもダメみたいですね。。。
今北産業だが、なんかアフォがファビョってるなw なんかソートでおかしな比較論を展開してるやつなんなの? まず配列ありきなら配列をワークシートに書き出してソートするより、配列上でソートする方が速いわなぁ。 なぜなら配列のワークシートへの書き出しはコストがゼロじゃないからな。
とにかくワークシートのソートとクイックソート云々を言いだしたやつはアフォということで 糸冬了
そもそも配列のソートじゃなくて、
>>869 に対するExcelを使用した方法の提示なんだけども
>>938 関数は(あれば)引数を受け取って値を返すだけの機能
書式の変更等はできない仕様
Subのほうに書くしかない
943 :
896 :2011/05/14(土) 23:03:54.96
>>942 functionから書式変更するsubを別途呼んでもダメだったので、
そういう仕様なのかと疑っていましたが、やっぱり仕様だったんですね。
諦めてボタン等から起動して、チェックと書式変更する処理を流すようにでもしてみます。
レスくれた方々、ありがとうございました。
>>943 もう見てないかな?
これはたしかユーザー定義型の制約で仕方ない事だったと思ったべさ。
>>922 の人のが殆ど自分の考えと一緒だったけどちょっと違うのが、
変更された特定値をサーチするんじゃなくて、値の書き込み元の範囲を
最初に特定してしまって、その範囲外ならすぐに処理を抜けてしまえば
シート上の変更のたびに呼び出されても負担が少ないわさ。
たとえばシートのセル範囲にRng_TgtFromと言う名前を切って、これを
計算が反映される入力元の範囲とした場合、次の様にVBEのシートに書くべさ。
>>944 の続き
Private Sub Worksheet_Change(ByVal Target As Range)
Dim oRngTgtFrom As Range
Dim oRngTgtTo As Range
Dim oRngMono As Range
Set oRngTgtFrom = Range("Rng_TgtFrom")
If oRngTgtFrom.Row > Target.Row + Target.Rows.Count - 1 Or _
oRngTgtFrom.Row + oRngTgtFrom.Rows.Count - 1 < Target.Row Or _
oRngTgtFrom.Column > Target.Column + Target.Columns.Count - 1 Or _
oRngTgtFrom.Column + oRngTgtFrom.Columns.Count - 1 < Target.Column Then
Exit Sub
End If
Set oRngTgtTo = Range(Cells(Target.Row + Target.Rows.Count - 1, _
Target.Column + Target.Columns.Count - 1), _
Cells(oRngTgtFrom.Row, _
oRngTgtFrom.Column))
>>945 の続き
For Each oRngMono In oRngTgtTo
If oRngMono <> "" Then
oRngMono.Offset(0, 2).Value = "AAA"
oRngMono.Offset(0, 2).Interior.ColorIndex = 7
Else
oRngMono.Offset(0, 2).Value = ""
oRngMono.Offset(0, 2).Interior.ColorIndex = 0
End If
Next
End Sub
>>945 の続き
まず入力したセルが指定範囲内かチェックしてるわさ。
次に入力したセルが範囲内だった場合、指定範囲と入力された範囲の
被った部分を処理対象にするわさ。
で、処理対象範囲の中のセルを一個づつガラガラまわして値と色を設定してるわさ。
値の"AAA"と結果出力位置は適当に後で直して欲しいわさ。
インデントが取れたからかなり見辛くなったから
コピッてはっつけてインデント補正してから見てほしいわさ。
ぐはぁ、
>>944 でユーザー定義型とか言っちゃってるよ。
ユーザー定義関数の間違いね。ユーザー定義型って言ったら構造体のことになっちゃうわさ。
ユーザ定義関数の引数にRangeをとって、その関数を使うときに 色を変えるセルを引数に指定すれば良いんじゃねえかと思うんだが
えっ?
952 :
896 :2011/05/15(日) 11:54:30.92
>>947 改良案ありがとうございます。
たしかに範囲指定内でのみ処理が流れるようにすれば負荷を抑えられますね。
書いてもらったコードですが、名前付きセル内のセルの
値と書式を設定した場合は、設定時に再びworksheet_changeイベントが
発生しループするようだったので、私のほうでも方針は同じで、やり方を少し変えてみました。
Private Sub Worksheet_Change(ByVal Target As Range)
' "Rng_TgtFrom"セル内のみを処理対象とする
If Not Application.Intersect(Target, Range("Rng_TgtFrom")) Is Nothing Then
' "Rng_TgtFrom"セル内を書き換えたとき
' 再びWorksheet_Changeイベントが
' 発生しないようにイベント無効化
Application.EnableEvents = False
' 書式と値設定
Target.Interior.ColorIndex = 3
Target.Value = "aaa"
'イベント有効化
Application.EnableEvents = True
End If
End Sub
これなら私がやりたかったことにだいぶ近づきました。
ありがとうございます。
>>952 ちょっと待って、
今更だけどもうちょい考える余地がある事に気付いたべさ。
>>952 今更だけど条件付き書式を使ってやる方法も思いついたわさ。
複雑な条件で着色しなければいけないって話だったから、これもユーザー定義関数に
してしまって、出来るなら処理元を一緒にしてしまえば楽になるかな。こんな感じ。
Public Function hoge1(IN_str As String) As String
Dim bBool As Boolean
Call hoge3(IN_str, bBool)
hoge1 = IN_str
End Function
Public Function hoge2(IN_str As String) As Boolean
Dim bBool As Boolean
Call hoge3(IN_str, bBool)
hoge2 = bBool
End Function
Private Function hoge3(IN_str As String, IN_bool As Boolean)
IN_bool = False
If IN_str <> "" Then
IN_str = "aaa"
IN_bool = True
End If
End Function
シートのセルの数式からhoge1を呼び出す様にして、
同じセルの条件付き書式から数式でhoge2を呼び出す様に設定しとけば、
最初の1セルの設定は面倒だけど後はコピペで展開すれば
わざわざイベントの事を気にしないでも済むわさ。
まぁ、後は好みで使い分けるわさ。
955 :
896 :2011/05/15(日) 13:06:05.15
>>954 おお、条件付き書式にユーザ定義関数指定すれば確かにいけますね。
もしかし
>>898 の方はそういう意味で言ってくれていたのかも・・・^^;
これのほうが考え方としてはシンプルかもしれませんね。
この方法も検討してみます。どうもです。
956 :
949 :2011/05/15(日) 19:04:06.15
>>951 すまん。やってみたらできなかった
ユーザ定義関数でRangeさわると、どうもその段階で循環参照するっぽい
ということで代替案を考えた
まずクラスモジュール(updateclass)つくる
Public WithEvents App As Application
Public RangeToUpdate As Range
Public ColorToUpdate As Variant
Private Sub App_AfterCalculate()
If Not RangeToUpdate Is Nothing Then
RangeToUpdate.Interior.ColorIndex = ColorToUpdate
Set RangeToUpdate = Nothing
End If
End Sub
Private Sub Class_Initialize()
Set App = Application
End Sub
やってることはApplicationのAfterCalculateで色を設定する
設定する範囲をRangeToUpdateで
設定する色をColorToUpdateで指定する
つづく
957 :
949 :2011/05/15(日) 19:04:27.17
んで標準モジュール Dim upd As New updateclass Public Function hoge(color) Set upd.RangeToUpdate = Application.ThisCell upd.ColorToUpdate = color hoge = "aaa" End Function 必要なのはupdateclassのインスタンス作ること ユーザ関数呼んだセルはApplication.ThisCellでとれるみたいなので 引数にRangeとる必要はなさそう hogeの引数に色指定できるようにしてるから ワークシートで=hoge(7)とか指定する
というかそこまで苦労してプログラム作るのって なんかVBAの本来の目的から外れてる気がしないでもない 本当に必要な要件なのか、その辺から見直しオススメw
>>957 >ユーザ関数呼んだセルはApplication.ThisCellでとれるみたいなので
>引数にRangeとる必要はなさそう
その方法だと再計算後のイベントで拾って来て1セルしか処理していないから
一度計算式を入れたセルを、違う色に着色して複数セル選択してコピペしても
一つのセルしか色が変わらないんじゃないか?
つか関数でやるとセルをクリアしたとき塗りつぶし残ったままじゃん あと条件をチェックする前に塗りつぶしをクリアしないと
>>958 これが正論であるがゆえ、Word VBAは隆盛をみないんだよなw
Access VBAはともかく
>>959 複数セルコピペは試したけどちゃんと動いてる
ユーザ関数はセル単位で呼ばれてるはずだけど、そのたびに再計算してる模様
再計算方法を手動にしたらどうなるかって今ふと気になったがそこは知らん
>>963 Aftercalculateがどう言うイベントか知っていればそんな返事は返って来ないと思うんだが。
一度ヘルプで確認してからトレースでも確認しろ。
背景色ごと複数セルを選択してコピペして以前塗られた背景色が残っているだけじゃないのか?
これが業務なら、指摘されても気付かないでそのまま通して本番環境で発覚したりする訳だ。
それに要件的には差程難しい要件ではないと思うが。
自分でトリッキーに作って難易度を上げておいて要件のせいにするのはどうかと思うぞ。
>>964 >背景色ごと複数セルを選択してコピペして以前塗られた背景色が残っているだけ
これはその通りのようだ
で、何を要件のせいにしてるってんだ?
素直に作るとしてお前ならどう作るんだ?
いまだに「がなにか?」とかいう書き方するやつがいた
別にいいだろ
いまだに「がなにか?」とかいう書き方を普通にしますがなにか?
970 :
デフォルトの名無しさん :2011/05/16(月) 21:41:20.69
なんかきもい
971 :
デフォルトの名無しさん :2011/05/16(月) 22:42:01.64
きもすぎる
いまだに「きもい」とかいう書き方するやつがいた
はずい
しょすい
いまだに「いまだに」っていういまだにがいまだに
そうだに
なんだに
にーにー、にににーにー!
979 :
デフォルトの名無しさん :2011/05/18(水) 01:18:37.22
VBAでExcelの記載をHTMLに置き換える自動生成するプログラムを作っているのですが for文で処理ごとにcountを追加してそれが7になったら改行(=<tr>タグで囲む)と言う事をしたいのですが for文〜 'カウントが7の場合 If count = 7 Then txt = txt & "<tr>" End If txt = txt & "<td>" & Cells(i, 1) & "</td>" & count = count + 1 'カウントが7の場合 If count = 7 Then txt = txt & "</tr>" & vbNewLine count = 0 End If next 〜 If count = 7を2回書いて非常に不細工な記載になっているのですが もっと簡単な方法ってあるのでしょうか?
それをそのまま使うと If Count = 7 Then txt = txt & "<tr>" & "<td>" & Cells(i, 1) & "</td>" & "</tr>" & vbNewLine Count = 0 else txt = txt & "<td>" & Cells(i, 1) & "</td>" count = count + 1 End if
>>979 それおかしくない?TDがTRの外に出ちゃうよ?
こうだと思うんだけど
txt = txt & "<td>" & Cells(i, 1) & "</td>"
count = count + 1
If count = 7 Then
txt = "<tr>" & txt & "</tr>" & vbNewLine
count = 0
End If
おしえたがり大ハッスル
そして教えられないゴミが大嫉妬w
おれの場合はあらかじめ、 txt = "<table><tr>" 'としておいて For文〜 txt = txt & "<td>" & Cells(i, 1) & "</td>" If Count = 7 Then txt = txt & "</tr>" & vbNewLine & "<tr>" Count = 0 End if Next txt = txt & "</tr></table>" だな。
Do 【 until/while condition】←条件式? 【statements】←A ? 【exit do】 ←B ? 【statements】 loop 参考書に載ってるモデル図ですがAとBの個所が何を表わしてるのか わかりません(´・ω・。)教えてくださいです
do オプション なんか処理 loop これで条件達成するまでなんか処理を続ける 条件が不達だといわゆる無限ループ do オプション なんか処理1 ループ抜ける なんか処理2 loop これで無限ループからも抜けられる
もっと分かりやすい説明が必要だったか……
解りやすい解りにくい以前に間が抜けすぎだ その記述は無限ループを回避する為の手法じゃないしな ということは「バカ?」ではなく「マヌケ?」と言うべきだったかな?
何が言いたいのかは理解した が、どうでもいい 次スレまだー?
これは苦しいw
レスも読めないのに揚げ足とりして勝手に自爆するような方に中途半端に煽られても別に……
反応するってことは自覚はあったようだ
>>993 草生やすクズを一々相手にしてたら自分が嫌な気分になるから止めといた方がいいよ。
自分にレs(ry
ここまでお兄ちゃんの自演なの 新スレ欲しいなっ
やったね!
1000ならみんなが幸せに
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。