Excel VBA 質問スレ Part18
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
2011/02/21(月) 07:24:26.3501 http://pc11.2ch.net/test/read.cgi/tech/1054356121/
02 http://pc11.2ch.net/test/read.cgi/tech/1168308855/
03 http://pc11.2ch.net/test/read.cgi/tech/1180192018/
04 http://pc11.2ch.net/test/read.cgi/tech/1189814602/
05 http://pc11.2ch.net/test/read.cgi/tech/1197448064/
06 http://pc11.2ch.net/test/read.cgi/tech/1205231499/
07 http://pc11.2ch.net/test/read.cgi/tech/1212587819/
08 http://pc11.2ch.net/test/read.cgi/tech/1219673793/
09 http://pc11.2ch.net/test/read.cgi/tech/1228372971/
10 http://pc12.2ch.net/test/read.cgi/tech/1235332603/
11 http://pc12.2ch.net/test/read.cgi/tech/1241885130/
12 http://pc12.2ch.net/test/read.cgi/tech/1247566074/
13 http://pc12.2ch.net/test/read.cgi/tech/1254281104/
14 http://pc12.2ch.net/test/read.cgi/tech/1262748898/
15 http://pc12.2ch.net/test/read.cgi/tech/1271261239/
16 http://hibari.2ch.net/test/read.cgi/tech/1280045912/
関連スレ
Excel総合相談所 95
http://hibari.2ch.net/test/read.cgi/bsoft/1293162589/
Word総合相談所
http://pc11.2ch.net/test/read.cgi/bsoft/1263719084/
【質問不可】Excel総合相談所スレの雑談・議論スレ2
http://pc11.2ch.net/test/read.cgi/bsoft/1151651536/
0002デフォルトの名無しさん
2011/02/21(月) 07:27:09.77前スレ:
Excel VBA 質問スレ Part17
http://hibari.2ch.net/test/read.cgi/tech/1289182437/
0003デフォルトの名無しさん
2011/02/21(月) 10:58:31.77Excelの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)
0004デフォルトの名無しさん
2011/02/21(月) 20:01:09.42一つはユーザーフォームを多重で起動することは可能でしょうか?
userform1.show
userform2.show
二つ続けても消さないと次が出てきません。
二つ目はユーザーフォームの番号を変数で表示することは可能でしょうか?
UserForm(i).Show こんな感じに、でもこれだとエラーでてしまいます。
0005デフォルトの名無しさん
2011/02/22(火) 10:35:10.58まず最初の質問は
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オブジェクトを表示しました")
0006デフォルトの名無しさん
2011/02/22(火) 10:40:12.181)Range("A1:C50").value = ""
2)Range("A1:C50").ClearContents
上記1,2、どちらでもOKか?
0007デフォルトの名無しさん
2011/02/22(火) 17:13:53.07できました。
丁寧にありがとうございました。
0008デフォルトの名無しさん
2011/02/23(水) 07:14:27.98jsk駄目だろ?
例えば後ろにデータがないときMsgBox Range("A1000").End(xlUp).Addressってやってみなよ。
0010デフォルトの名無しさん
2011/02/23(水) 17:45:59.06このページの下の方の例文(足し算を行い、合計と平均を返すクラスの運用 その2)で
SATOU、SUZUKI、TAKAHASHI等の変数が20個も200個もある場合
整理されて、後で改造もしやすくするにはどうすればいいですか
Dim humans As Variant
humans = Array(, "SATOU", "SUZUKI", "TAKAHASHI", ・・・・・・・・
とかしてループして各メソッドを呼ぶんですかね
0011デフォルトの名無しさん
2011/02/23(水) 18:21:24.52俺だったら配列で引き渡すわ
それが個人的には1番楽だし改修も引数だけでいいしね
あと、Variantは関係ない
0012デフォルトの名無しさん
2011/02/23(水) 20:53:31.461024列×768行の数値が書かれたCSVファイルをラインモードで読み込み、平均した後、
256列768行にして数値を入力するような命令を実行しています。
この数値の中で、ある値以下の平均を取っていき、その変動が最小になる値を求めたいです。
(10以下平均-9以下平均)、(11以下平均-10以下平均),,,,(30以下平均-29以下平均)
Averageifがないので、SUMIF()/COUNTIF()のように計算させ、Do loop等で
順番に計算させようとしたところフリーズしてまともに計算できません。
そこであらかじめシートの方に、A列にSUMIF/COUNTIFを入力し、
B列にA3-A2のように入力し、B列が最小になる行のA列の値を取得しようと思います。
どのようにしたらよいでしょうか。またほかに何かよい方法はないでしょうか。
0013デフォルトの名無しさん
2011/02/23(水) 21:18:54.63パフォーマンスを求めるならExcel/VBAじゃなくて.NETなり
数学計算できるソフトほうがいいんじゃないかな?
あと、どうしたらいい?じゃなくて思ったことをじゃなくてVBAやってみたら?
ロジックを考えてくれっていうのはナシの方向で。
0014デフォルトの名無しさん
2011/02/23(水) 21:19:10.66if文で最小値比較して、それをfor文で回すだけじゃね?
0015デフォルトの名無しさん
2011/02/23(水) 22:21:03.12あまり美しいとはいえないですが、
A列にSUMIF/COUNTIF
B列にA3-A2,,,,
適当なセルにSUMPRODUCT((B10:B30=MIN(B10:B30))*ROW(B10:B30))で行番号取得、
Cells()でA列のこの行番号の値を入れて取得でできました。
SUMIF/COUNTIFもマクロ上だと重いですが、セル上だとさくっといくみたいです。
0016デフォルトの名無しさん
2011/02/24(木) 00:38:00.27たかだか70万件のデータでフリーズするとは、あきらかにプログラムがタコだな
アルゴリズムをよく考え直した方がいい
まあ、とりあえずExcel2010買ってこい
小細工しなくても1024列のデータがそのまま読み込めるから
プログラムが少し楽になる
0017デフォルトの名無しさん
2011/02/24(木) 01:11:43.68ど素人ゆえプログラムもかなりのへたれですが、
パソコンもへたれです。pen4世代のCeleron1.8Gのノート。
会社パソコンなもので、ハード、ソフトともにアップデート不可です。
0018デフォルトの名無しさん
2011/02/24(木) 04:04:46.60何をやりたいのか、よく判らないが
『フリーズしてまともに計算できない』コードにはバグがある可能性が
高い気がする
昔、同じくらいのマシンで数十分かかる処理をさせた事もあるが
この場合、無限ループに陥っている可能性を疑う
それと毎回セルに書いていたりする?
その場合、
Application.ScreenUpdating = False
とかは使っている?
0019デフォルトの名無しさん
2011/02/24(木) 05:53:39.000020デフォルトの名無しさん
2011/02/24(木) 06:31:38.57たぶん、プログラムをちゃんと作ればそんなに時間はかからないと思うんだけど、
その説明だけでは不明な部分がいくつかあるから具体的なプログラムが示せないんだよなあ
まず「ラインモード」ってなんだ?
たぶん、文章で説明するのはかなり難しいだろうから、現物を見た方が早い
そのデータとExcelのファイルは公開できる?
0021デフォルトの名無しさん
2011/02/24(木) 07:54:34.68使うのが基本。
0022デフォルトの名無しさん
2011/02/24(木) 07:57:01.13これで100万件ぐらいでフリーズしない。
0023デフォルトの名無しさん
2011/02/24(木) 08:01:40.30>>17の状況じゃ無理だろう
まあ、このスペックでもこのデータ量なら動くと思うけどね
0024デフォルトの名無しさん
2011/02/24(木) 13:18:30.49他言語でも同じ。
まず計算ロジックの見直しだな。
SUMIF()/COUNTIF()なんてのは論外だよ。
>>16の言うとおり。
0025デフォルトの名無しさん
2011/02/24(木) 13:28:12.58ソートすりゃどうにでもなりそうだな。
0026デフォルトの名無しさん
2011/02/24(木) 14:46:15.770027デフォルトの名無しさん
2011/02/24(木) 15:27:19.57http://pc11.2ch.net/test/read.cgi/pcnews/1246498806/
検索してたらこんな切ないスレがあったんだけど、今からExcelマクロ勉強するのって無駄?
まあ、ちょっと頑張って正規表現と両方憶えれば万能なんだけれども・・・
0028デフォルトの名無しさん
2011/02/24(木) 17:07:59.98Excelのバージョンアップしたら色々問題が出て
VBA使うPCのExcelを前のバージョンにしたと聞いた
0029デフォルトの名無しさん
2011/02/24(木) 18:28:27.62このスレを見てればわかるとおり、VBAのエキスパートになる必要はないけど
Excelを使うならVBAは知ってた方が捗る
0030デフォルトの名無しさん
2011/02/24(木) 18:37:52.750031デフォルトの名無しさん
2011/02/24(木) 19:41:43.64ここで質問すれば解決って意味でしょ
0032デフォルトの名無しさん
2011/02/24(木) 20:37:23.79作ったのですがうまくいきません;;どこが間違っているか教
えて下さい。宜しくお願いします。
Sub test()
For CellGyo = 7 To 19 Step 1
Range("B" & CellGyo & ":" & "K" & CellGyo).Select
Selection.Interior.ColorIndex = 34
Next CellGyo
End Sub
0033デフォルトの名無しさん
2011/02/24(木) 20:54:42.82step 1ってことは、色を塗って、次はその下の行を塗る
1行ずつってことは、色をぬった行の2行下の行を塗るわけだ
0034デフォルトの名無しさん
2011/02/25(金) 12:12:12.41ありがとうございます!理由まで書いて頂いて本当に助かりました!!
0035デフォルトの名無しさん
2011/02/25(金) 12:17:28.14Sub a()
With Range("B7:K19")
.FormatConditions.Add Type:=xlExpression, Formula1:="=MOD(ROW(),2)=1"
.FormatConditions(1).Interior.ColorIndex = 34
End With
End Sub
0036デフォルトの名無しさん
2011/02/25(金) 15:18:34.170037デフォルトの名無しさん
2011/02/25(金) 19:54:03.97Sub 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
0038デフォルトの名無しさん
2011/02/26(土) 00:27:10.81今日は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
0039デフォルトの名無しさん
2011/02/26(土) 00:28:53.04Range("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
0040デフォルトの名無しさん
2011/02/26(土) 00:29:43.70Sheets("月別売り上げ報告書").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
0041デフォルトの名無しさん
2011/02/26(土) 01:28:16.83デバッグのやり方は経験を必要とするが、コードを書いたら
まず、メニューの『デバッグ』から『VBAProjectのコンパイル』を選ぶ
これにより、あなたのコードで、すぐ判るのは
Dim Gyoshu As String
で定義しているが
Selection.Value = Gyoushu
と書いているところがあり、これの定義がされていない
(つまり変数名が間違い)
なお、『ツール』メニューの『オプション』を選び、『編集』タグで
『変数の宣言を強制する』にチェックをつける事が前提
0042デフォルトの名無しさん
2011/02/26(土) 01:32:56.49エラーが出たなら最低限どんなエラーが出たかぐらい書け。あと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
やりたいのはこういうことじゃないのか
004342
2011/02/26(土) 01:43:43.61うは、普通に見落としてたわ
ちなみに、『変数の宣言を強制する』は後からチェック入れてもダメだからな
あれは最初からコードの頭にOption Explicit入れてといてくれるだけだから
俺の感では今回はおそらくそのエラーではないと思うが
004441
2011/02/26(土) 07:33:55.33実は、同感
何度か回答してきたけど、デバッグの基本的なやり方とか
書いておかないと、きりがない気がしてきたのでw
コンパイルとブレークポイントを覚えるだけで質問以前に
解決する事例も少なくないように思う
0045デフォルトの名無しさん
2011/02/26(土) 10:00:57.92シート名のハードコードも個人的に気持ち悪いので定数にしました。
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
ただ、質問主さんが説明不足なので分かりませんが、
もしかしてこのシート、別々のブックだったりしませんかね?
同じブックの中でこんな転記したってあまり意味が無い作業のような・・・
本来は、全体の売り上げデータが入ったブックから担当ごとのブックに転記、
という作業なんじゃないかなぁという気がします。
(それにしては担当者の選択処理が無いけど)
0046デフォルトの名無しさん
2011/02/26(土) 12:32:13.66複数ある時は変数にまとめたいところ
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を並べてるのは、セル番号が不自然に飛んでるから、
あとで参照先を増やしたり減らしたり改造が必要になる可能性がありそうだから
修正箇所をわかりやすくするのが目的
004738
2011/02/26(土) 12:55:34.54ように書きます。エクセルは2007です。そして2つのシートは同じブックの
ものです。
これは実際仕事で使うものではなく通信教育の課題です。もっと勉強して
から課題に取り組めば良いのですが提出期限明後日なので・・・。
みなさんありがとうございました!!
0048デフォルトの名無しさん
2011/02/26(土) 14:43:42.65Cでいうwaitkeyです
Do
If GetAsyncKeyState Then Exit Do
Loop
したいのはこういう感じです
0049デフォルトの名無しさん
2011/02/26(土) 15:01:05.26ここに書くより検索した方が早い気がする
vba GetAsyncKeyState で検索
キーボードからの入力を判定する
ttp://www.happy2-island.com/excelsmile/smile04/capter00301.shtml
0050デフォルトの名無しさん
2011/02/26(土) 15:19:28.38引数を指定せずに何でもいいのです
0051デフォルトの名無しさん
2011/02/26(土) 17:45:12.39>>49を参考に出来ると思うのだが?
GetAsyncKeyState は、256 とおりの仮想キーコードのいずれかを指定することで
そのキーが押されたかどうか調べるわけだから、マウスボタン等の不要なキー以外の
いずれかが押されれば、Loopを抜ければいいんじゃないの?
まあ、Escキーを押されたらというのは工夫がいるかもだけど
0052デフォルトの名無しさん
2011/02/26(土) 19:12:23.20UserFormのKeyDownイベントで拾うという方法も考慮してもよいかもね
0053デフォルトの名無しさん
2011/02/26(土) 23:22:42.060054デフォルトの名無しさん
2011/02/27(日) 12:38:40.55Dim 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はモジュールレベル変数とした方が良いか、ローカル変数とした方が良いかアドバイス下さい
0055デフォルトの名無しさん
2011/02/27(日) 12:40:19.82全く変更されない
↓
c=ThisWorkbook.Worksheets("Sheet1").Range("A1:V17616")以降全く変更されない
0056デフォルトの名無しさん
2011/02/27(日) 12:41:53.940057デフォルトの名無しさん
2011/02/27(日) 12:48:31.23変数等のスコープは可能な限り狭いほうがいい。
0058デフォルトの名無しさん
2011/02/27(日) 12:56:40.38パラメータとして渡した方が良いんですか
ありがとうございました
0059デフォルトの名無しさん
2011/02/27(日) 13:03:14.09それ、何故か?ということについて、
詳しく開設されている本とかサイト知りません?
0060デフォルトの名無しさん
2011/02/27(日) 13:13:43.94一ヵ月後に修正とかしようとすると簡単に死ねる。
>>54 の例だと、cに設定した内容が他で参照される可能性とか
考えなくてはならなくなる。
ローカル変数なら、そもそもあり得ないから頭を使わなくて済む。
0061デフォルトの名無しさん
2011/02/27(日) 13:18:38.19>>57じゃないけど
友人がシステム保守の仕事をやっているわけだが
パブリック変数を安易に使うな!と怒っていたなw
パラメータで渡しておけばデバッグは相当楽になる
(大抵はその関数だけ見ておけばよい)
自分は一人で組んでいる場合は、パブリックに逃げる癖があるけどw
0062デフォルトの名無しさん
2011/02/27(日) 14:52:46.52個人的には、
メソッドを後でコピペで再利用しようと思っても出来ない。
変数の状態が追跡しにくい。
その中でもフラグ系は特にひどいな。
0063デフォルトの名無しさん
2011/02/27(日) 15:44:55.87なるほど。ありがとうございました。
今、高速化する方向で書いている最中なので気になりました。
0064デフォルトの名無しさん
2011/02/27(日) 16:20:28.94可読性や安全性、バグの出にくさと処理速度は反比例するからねー
コア部分をうまくモジュール分けしてブラックボックス化するぐらいしか対応策はないと思う
0065デフォルトの名無しさん
2011/02/27(日) 16:28:14.74まずは本当にそこがネックになっているか確認したほうがいいと思うよ。
0066デフォルトの名無しさん
2011/02/27(日) 16:32:31.54違う。ループ内とかのブロック変数の話。
0067デフォルトの名無しさん
2011/02/27(日) 16:40:19.75どこからそんな話が出てくるんだ?
そもそも >>58 で、「パラメータとして渡した方が良いん
ですか」と言ってるし。
0068デフォルトの名無しさん
2011/02/27(日) 16:47:40.93すみません。>>57から乗りました。
ブロック変数じゃなくてブロック内定義変数について
気になってました。
0069デフォルトの名無しさん
2011/02/27(日) 17:33:48.88これ以上何か聞きたいなら、>>52 のようにソースとともに書き
込んだほうがいいよ。
0070デフォルトの名無しさん
2011/02/28(月) 09:46:25.98const付けられないから変数になっちゃうけど。
0071デフォルトの名無しさん
2011/03/01(火) 10:29:40.84例えばセルB2からセルB299までに1年分の日付がランダムで入力されてるとします。
で、セルK2からセルK299に金額がランダムで入力されています。
マクロを使って月別の売上を出すにはどのようにしたらよろしいですか?
説明が下手で申し訳ないです
0072デフォルトの名無しさん
2011/03/01(火) 10:56:03.69あえてなおVBAならWorksheetfunction.DSum
0073デフォルトの名無しさん
2011/03/01(火) 11:04:52.81VBAでしないといけないのです。。。
とりあえずWorksheetfunction.DSum
でやってみます
0074デフォルトの名無しさん
2011/03/01(火) 11:54:19.801月の集計 ○○円
2月の集計 ○○円
・・・
と続くのですが月別にするのがわかりません。。。
またアウトラインを使わないといけないのですが
1、総計
2、月別
3、全体の表示
としないといけないのですがわかりません。
どなたかおしえてください
0075デフォルトの名無しさん
2011/03/01(火) 12:48:31.73アウトラインって集計か?
集計とか統合はウンコだから覚えなくてよい。
ピボットテーブルを覚えりゃよい。
月でグループ化すれば簡単だ。
ピボットテーブル使えない人は日付でソートして同じ月の間だけ加算していくマクロになるが,、ピボット覚えた方が楽。
0076デフォルトの名無しさん
2011/03/01(火) 12:55:41.90月をインデックスとした配列に順番に足すだけ
0077デフォルトの名無しさん
2011/03/01(火) 13:07:26.231年分の月に関しては確かにそうだな。
一般的なピボットの内部ロジックを書いた。
0078デフォルトの名無しさん
2011/03/01(火) 13:11:52.150079デフォルトの名無しさん
2011/03/01(火) 13:12:42.210080デフォルトの名無しさん
2011/03/01(火) 15:32:01.88それってVBAでやれって問題なのか?
VBAでやるのにアウトライン使えとか普通ないだろ
エクセルの機能とかの実習ならむしろVBAつかっちゃいかんのじゃないか
0081デフォルトの名無しさん
2011/03/01(火) 20:32:10.83VBAで「ピボット操作して集計シートにコピペ」までやれば
「マクロを使って月別の売上を出」したことにならないかな。
同じ結果を出すなら、自作コードでやるより
エクセルの機能を使ったほうが明らかに動作速いし。
0082デフォルトの名無しさん
2011/03/01(火) 21:23:33.63とても気分はいいけどな
0083デフォルトの名無しさん
2011/03/02(水) 01:22:15.86月別なら自作の方が速いだろ?
0084デフォルトの名無しさん
2011/03/02(水) 13:38:32.17セルA1に文字と数字が入った
ABC123DEFというような文字列があります。
この中の数字のみ(文字も数字も桁数は一定ではありません)
置換したいのですが、例えば0から200の間であれば置換
というようにReplaceを使った場合指定する方法はあるのでしょうか?
お願いいたします。
0085デフォルトの名無しさん
2011/03/02(水) 14:12:05.65ない
数字と文字を分けて数字の大きさを判断して置き換える、というプログラムを自分で作る必要がある
0086デフォルトの名無しさん
2011/03/02(水) 18:43:35.02Win7 64bit、Excel2007、CPU Corei7 980X、メモリ12GB の環境です
まず一地点分のファイル(新規ワークブック)を作成して、
次に
一日分のデータ(一つ30MBぐらいのcsvファイル)を開いて、
その中の一列(約43万行)を新規ブックにコピー
クローズして次のcsvファイルを同様に処理、
一か月分で新規ブックを保存、
新たな新規ブックを作成
というのを30回ほど繰り返すマクロがあるのですが、
(つまり30地点、30日で計900回オープン、クローズを繰り返す)
このマクロが処理の途中でよく止まりました。
(エクセルは起動しているがマクロは終了している
エラーメッセージも特に無し)
タスクマネージャで見てもCPU使用率もメモリ使用量も20%弱なので
PCスペックの問題ではなさそうなのですが、
エクセル上のリソース不足を疑いました。
そこでWebで調べたら
DoEventsという命令を実行させれば良いらしいと分かったので、
実際に試したら確かに止まらなくなりました。
ただ、なぜ効果があるのかが分からないのでちょっとモヤモヤしてます。
どなたか、DoEventsにどのような効果があるのか教えてください。
0087デフォルトの名無しさん
2011/03/02(水) 18:59:19.45DoEventsで定期的にExcelにタスクを回すことで処理が継続できるようになったとか
勘ですまん
0088デフォルトの名無しさん
2011/03/02(水) 21:26:05.84正規表現で数字を取得してCintした数値を条件分岐すれば良い
008986
2011/03/02(水) 22:16:20.31どうもありがとうございます。
無限ループですか。
確かにForNextで地点ごとのループと、一月分のループをネストして
その中でひたすらオープン・コピー・クローズを繰り返してましたから
無限ループに近かったかもです。
処理を完走させるには10時間以上回しっぱなしで、
その間エクセルでは他の作業が一切出来ませんでした。
私はファイルオープンしたときに確保したメモリを
ファイルクローズ時にきちんと解放できていないのではないかと疑っていましたが、
理由はなんにせよ、
エクセルには止まるなら止まるで何らかのアナウンスをしてほしいところですね。
マクロ停止の理由はともかく、
それを何らのエラーメッセージも出さずにただ止まるだけというのは
アプリケーションの挙動としてどうかと思いますね。
0090デフォルトの名無しさん
2011/03/02(水) 23:26:44.73セル内の最後の空白から前と後ろで分けたい場合
どのように記述すればよいでしょうか?
0091デフォルトの名無しさん
2011/03/02(水) 23:43:33.04InStrRevで場所を特定して分割すればいいんじゃないか?
Splitで返された配列の最後の一つ以外を繋ぎ直す手も無くはないけど。
0092デフォルトの名無しさん
2011/03/03(木) 00:08:10.26何となくですが、
Application.ScreenUpdating = False
が記述されていない気がします。
何回もオープン・コピー・クローズしたため、
描画の方に問題が生じた可能性は無いでしょうか?
0093デフォルトの名無しさん
2011/03/03(木) 00:09:29.80>マクロ停止の理由はともかく、
>それを何らのエラーメッセージも出さずにただ止まるだけというのは
>アプリケーションの挙動としてどうかと思いますね。
いや理由は大事なんだが
VBAのエラーなのに何のメッセージもなく停止するのは確かにどうかと思う
が、あまりそういう状況は見たことがない
VABが無限ループしたからと言って、勝手に停止する機能も聞いたことがない
(スタック不足等のエラーで止まることはあるけど)
それらがDoEventsで解消される理由もわからない
あれは制御をいったんOSに戻すだけのものだが
(まあ、DoEventsについては不思議な副作用を起こすことはまれによくあるが)
実際にはエラーでとまってるのに、エラーハンドリングが適切じゃないので
だまって停止したように見えるだけじゃないかと思うんだが、差し支えなければ
実際のコードを晒してみてはくれないか
0094デフォルトの名無しさん
2011/03/03(木) 00:17:18.88Application.Calculation = xlManual
も入れた方がいいな
今どきの64bitマシンで、ファイルをたった900個開く程度で落ちるなんて考えられん
計算してみると1ファイルあたり40秒もかかってることになるわけで
全体で10時間というのも、ちょっと遅すぎる気がする
いっぺんコード晒してみ?
009590
2011/03/03(木) 00:38:13.04お陰さまで無事成功しました。
ありがとうございます。
ただ、こんなことで躓いていてはまだまだだなーと・・・
0096デフォルトの名無しさん
2011/03/03(木) 00:45:42.87ところでOffice 2007って32bitアプリじゃないの?
32bitプロセスってメモリ空間2GBしか使えないんじゃなかったかな。12GBの20%弱ってそれに合ってるよね。
メモリの問題ではないかもしれんが、もしかしたらDoEventsでガベージコレクトできるようになって、メモリが解放されたから動く、とか。
009786
2011/03/03(木) 00:47:46.46どうもすみません、コードを出したくても会社の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ファイルが存在しないとか、
保存するブックと同名のファイルがすでに存在する、などがありますので、
そういったエラーは起きないようにマクロ実行前にファイルの確認はしています。
(というかそういうミスではエラーメッセージがちゃんと出ます。)
・・・ちょっと自分でも分かりにくい説明なので、
明日にでもコードをきちんと確認して再度書き込みさせていただきます。
009886
2011/03/03(木) 00:52:25.74すみません、>>93を読んでからリロードせずに書いてたので
気づきませんでした。
アドバイスどうもありがとうございます。
0100デフォルトの名無しさん
2011/03/03(木) 00:56:32.61たしか設定で使うスレッド数を決められた様な気がするから、増やせばもっと早くなるかもね
0101デフォルトの名無しさん
2011/03/03(木) 02:03:48.350102デフォルトの名無しさん
2011/03/03(木) 06:58:58.41保証はできないけれど
For j=1 to 30 ’日を表すループ(実際の日数は31とか28とかの事もあります)
i地点、j日 のCSVファイルをひらく
新規ブックの J列にCSVのデータをコピー
CSVクローズ
Next j
の、CSVクローズの直後か直前に、新規ブックを保存 した方が良い気がする
昔、ワードのVBAで新規ファイルを大量にいじる処理をした時、
同様のエラーが出て、随時保存で解決した
ワードとエクセルは違うかもだけ、大量の変更履歴を内部的に
保持できなくなったのが原因の模様だった
0103デフォルトの名無しさん
2011/03/03(木) 07:12:56.83それと
『エラー処理は入れてませんが』
とあるけど、転ばぬ先の杖で入れた方が良いと思う
ホント、世の中、びっくりするようなことが起きるもんだってw
0104デフォルトの名無しさん
2011/03/03(木) 07:29:56.33五月雨式で、申し訳ないがもう一つ
それだけ長い処理だと、自動バックアップが影響しているのかも?
(結果的に>>102、あるいは自動バックアップをオフにするべきか?)
010586
2011/03/03(木) 07:38:10.09おおっ!
みなさん有難うございます。
出勤前でばたばたしてますのでひとまずお礼のみで失礼します。
良かったらまた今晩よろしくお願いします。
0106デフォルトの名無しさん
2011/03/03(木) 15:11:28.92forとifで比較しながら探すのって馬鹿なんでしょうか・・・
0107デフォルトの名無しさん
2011/03/03(木) 17:55:24.960108デフォルトの名無しさん
2011/03/03(木) 18:04:11.98個人的信条ですが、プログラムは正しく動くなら問題なしです^^
ただ、より簡単な方法もあります
ご参考まで
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
0109108
2011/03/03(木) 18:14:32.29>>108の例ですと、部分一致の場合も見つかったと言いますので注意してください
完全一致のものを探すならば
Set FindCell = Range("A1:A1000").CurrentRegion.Find(What:="xyz", lookat:=xlWhole)
と、lookat:=xlWholeを指定の必要があります
0110108
2011/03/03(木) 18:26:52.55CurrentRegionは、不要ですね
Set FindCell = Range("A1:A1000").Find(What:="xyz", lookat:=xlWhole)
このサンプルは、『vba range 検索』で検索して見つけた
Office TANAKA - Excel VBA講座:セルの操作[セルの検索]
ttp://officetanaka.net/excel/vba/cell/cell11.htm
を参考に(というか、ほぼまる写し)しています
0111デフォルトの名無しさん
2011/03/03(木) 20:37:06.02Sub 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シートの存在は確認しています
回避方法を教えてください
0112デフォルトの名無しさん
2011/03/03(木) 21:07:27.25諸事情あって、VBAからWin32 APIを直接使っています。
DIBを使って画像処理をしているのですが、ワークスペース上の画像を
直接LoadImage(API)するような荒業ってありますでしょうか。
今は、SaveAsを使いxlhtml形式でまるごと保存>そのうち画像ファイルをLoadImageでメモリ上にロード
>保存しているファイルを削除・・・・という方法でやっていますが、どうにも泥臭くて・・・。
0113デフォルトの名無しさん
2011/03/03(木) 21:37:58.59Workbooksの使い方が間違っているとおもう
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 とかね
0114デフォルトの名無しさん
2011/03/03(木) 22:58:30.23ユーザー設定でマスを指定したいです。
可能ならばやり方をお教えください。
windows7 SP1でExcel2007です。
0115デフォルトの名無しさん
2011/03/04(金) 00:59:02.91011686
2011/03/04(金) 01:20:52.85必要ない部分は省きましたが大体こんなコードです。
モジュールの頭に
Option Explicit
Option Base 1
が書いてありまして、
Application.ScreenUpdating = False
Application.Calculation = xlManual
も実行済みです。
また、下記変数は親プロシージャから引数として渡してます。
Dim Mnth As Long '月
Dim Yr As Long '年
011786
2011/03/04(金) 01:22:26.42Const 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
011886
2011/03/04(金) 01:23:18.98Private 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があれば)問題なく動作してますので
ループ中でのブック保存などは入れてません。
現状でもファイルのオープンとクローズ(セーブ含む)に一番処理時間がかかって
いるので、ループ中に保存処理を入れると処理速度が極端に遅くなりそうです。
エラー処理については、
何をチェックすべきかも良く分かっていません。
先にも書いたとおり
ループ中でオープンするファイルは確実に存在しているので、
他にチェックすべきものが思いあたらないです。
011986
2011/03/04(金) 01:36:28.13正しくはこうです
With ActiveWorkbook
.Sheets(1).Columns(4).EntireColumn Copy Destination:= MyNwBk.Sheets(1).Cells(2,j+1)
.Close
End With
0120デフォルトの名無しさん
2011/03/04(金) 03:18:05.71Workbooks.Addでは追加したブックがアクティブになるとの記載があるが
Workbooks.Openにはその保障はなさそうだ(EXCEL2007のヘルプによる)
なので With ActiveWorkbook.Sheets(1)のなか辺りでエラーが出てる可能性はある
その位置でDoEventsいれて正常に動作するなら、連続でオープンクローズすると
思ったブックがアクティブになってないのが改善してるのかもしれん
OS側の処理が追いついてなかったのがDoEventsで改善されてる可能性が無いわけでもないが
いちど
Workbook.open ...
With ActiveWorkbook...
を
With Workbook.open ...
にして、DoEventsなしで動くかみてみたら?
ちなみに、行全部コピーして、行全部じゃないRangeに張りつけって、正常に動くのか?
0121デフォルトの名無しさん
2011/03/04(金) 03:49:34.09セルのコピペの動作は手動でやるのと同じだよ
選択範囲のサイズが違った場合は一部が切り取られたり、同じ物の繰り返しになったりする
全データコピーなら、あまりいい方法じゃないね
012286
2011/03/04(金) 03:58:15.55ありがとうございます。
実は明日から3日間休みなので、次にPCさわれるのが月曜日でして月曜日に確認したいと思います。
>ちなみに、行全部コピーして、行全部じゃないRangeに張りつけって、正常に動くのか?
すみません、
これに関しては実はこの辺うろ覚えで書いたんで間違いかもしれないです。
会社のPCではUSBメモリその他のメディアが使用禁止なので、
VBE開いて該当部分を手書きでメモにしまして、
さらに家のPCにはエクセルが入ってないので
手書きのメモを元にメモ帳で書いたのをレスとして貼り付けました。
ですので若干おかしなこと書いてる可能性があります。
改めて確認しなおして月曜日以降に報告させていただきます。
勝手ながら今日はこれにて失礼します。
0123デフォルトの名無しさん
2011/03/04(金) 07:19:11.15遅くなってすいません。ありがとうございました。
0124デフォルトの名無しさん
2011/03/04(金) 12:07:45.23DoEventsを入れて動くのであれば、完成としてもよいかもしれない
そもそも、最初の質問が『DoEventsにどのような効果があるのか』なので
それについて考えてみた
DoEventsは、制御を一時的にOSに渡すための命令で使う例としては
数時間かかるような処理を、ボタンのクリックで中止させるような場合に
使われる
この場合、メイン処理のLoop中で、ある変数がTrueならば処理を抜ける、
さらにボタンを押すとその変数にTrueをセットするという書き方ができるが
DoEventsを使わないと、『ボタンをクリックした』というイベントが
メイン処理が終了するまでExcelに伝わらない
上の例では、人間が起こしたイベントが処理されないというものだが、
OSやExcel自身が起こしたイベントも処理できないと推測できる
質問者の例でいえば、Excelのでかいデータをスワップさせようとして
上手くいっていないのかもと推測した
0125デフォルトの名無しさん
2011/03/04(金) 14:02:01.69いやだから、手動でやると、コピー領域と貼り付け領域の形が違うため...
ってエラーになるんだが?
0126デフォルトの名無しさん
2011/03/04(金) 14:55:06.80If 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と同じだと思ってたのですが
0127デフォルトの名無しさん
2011/03/04(金) 14:57:30.68自分は hoge = True はC言語の return 1; と同じだと思ってたのですが
0128デフォルトの名無しさん
2011/03/04(金) 14:58:32.59Private 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
0129デフォルトの名無しさん
2011/03/04(金) 15:05:28.90いやでしょうが
hoge = True '------(a)
Exit Function
と書いてください
0130デフォルトの名無しさん
2011/03/04(金) 15:08:06.20そうやるんですか!ありがとうございました!
0131デフォルトの名無しさん
2011/03/04(金) 17:14:43.880132デフォルトの名無しさん
2011/03/04(金) 17:25:16.96False
Booleanのデフォルトの値はFalseだから
0133デフォルトの名無しさん
2011/03/04(金) 17:36:24.970134デフォルトの名無しさん
2011/03/04(金) 19:36:52.82普通はそうする罠
Private Function hoge(c As Long) As Boolean
hoge = c > 0
End Function
これなら>>131みたいな疑問は湧かないし、>>132みたいな知識がなくてもわかる
0135デフォルトの名無しさん
2011/03/04(金) 19:37:38.27聞く前に自分で試してくれないかねえ
0136デフォルトの名無しさん
2011/03/04(金) 19:38:21.10End Function
>>133
出来なきゃ困るだろw
0138135
2011/03/04(金) 19:41:19.70134でなくて135でした
0139デフォルトの名無しさん
2011/03/04(金) 20:49:05.69任意の位置、大きさに表示することは可能ですか?
0140デフォルトの名無しさん
2011/03/05(土) 00:01:17.85on error resume next
val = WorkSheetFunction.match
blnIsFind = iif(err.number=0, true,false)
on error goto 0
みたいな使い方にしないと駄目?
0141デフォルトの名無しさん
2011/03/05(土) 16:36:46.74これって (hoge=c)>0 って解釈されないのかな?
=は比較演算子としてより優先して代入演算子として解釈される?
0142デフォルトの名無しさん
2011/03/05(土) 17:20:16.44以上
0143デフォルトの名無しさん
2011/03/05(土) 17:48:50.84>これって (hoge=c)>0 って解釈されないのかな?
されない。
VBA は、C と違って、文を書くところに式は書けないなら hoge = c > 0 の
"=" は、代入演算子にしか解釈されない。
0144デフォルトの名無しさん
2011/03/05(土) 21:55:27.65試した
(Let)a=b=cだとb=cの比較結果をaに代入
if a=b=c then...だとa=bの比較結果とcを比較
代入文だと最初の=は代入演算子なのね
で、比較式として使うと比較演算子として解釈される
比較も代入も同じ記号だけど、文脈で完全に区別されるのね
0145デフォルトの名無しさん
2011/03/05(土) 22:37:51.89将来的にEXCELもそんな感じにならないものでしょうか?
0146デフォルトの名無しさん
2011/03/06(日) 09:33:14.070147デフォルトの名無しさん
2011/03/06(日) 21:06:06.11・BASE 1を使わない
・Variantを使わない
・クラスモジュールを使う
・コレクションとかディクショナリ、FSOを使う
0148デフォルトの名無しさん
2011/03/06(日) 22:07:55.91むしろ配列のインデックス0を使わない(作らない)方が分り易い。
Excelが絡む時は、VB.NETでも下限値1の配列を作ることがあるな。
>クラスモジュールを使う
使う事で大分判り易くなる時くらいか。
VBAの実装は中途半端過ぎて、よっぽどでないと使う気が起こらない。
0149デフォルトの名無しさん
2011/03/06(日) 22:58:21.000150デフォルトの名無しさん
2011/03/07(月) 01:43:06.31VB.Net移行なんてするの?
VSTOでも使う気?
0151デフォルトの名無しさん
2011/03/07(月) 01:52:56.980152デフォルトの名無しさん
2011/03/07(月) 01:53:52.74Excel捨てるの?
0153デフォルトの名無しさん
2011/03/07(月) 08:06:23.39FSOで取得すりゃ全てString
0154デフォルトの名無しさん
2011/03/07(月) 08:32:44.58変な制限が多すぎる
0155デフォルトの名無しさん
2011/03/07(月) 09:52:03.72vbaで削除をしようとしても削除出来ないスタイルがあります。
削除出来ないスタイルは、スタイル名がハングル文字のみだったり、文字化けしているスタイルなのですが、削除する方法はありますか?
0156デフォルトの名無しさん
2011/03/07(月) 11:02:56.93If ファイル名 = "特定の文字列*" Then
で引っかからないんですが何故でしょうか
特定の文字列* の所はファイル名そのものにすれば引っかかりますがそれでは意味ないし
どなたかお願いします
0157デフォルトの名無しさん
2011/03/07(月) 11:17:25.64If 文字列 Like "*ABC*" Then
以下のサイトより参照
ワイルドカードを使った文字列の比較
ttp://www.geocities.jp/masa7251/tips/vba/vba00002.html
0158デフォルトの名無しさん
2011/03/07(月) 11:25:01.25早いレスでとても助かりました
LIKEとかすっかり忘れてました。本当にありがとうございます。
0159デフォルトの名無しさん
2011/03/07(月) 11:50:13.02名前で指定できない場合はインデックス番号で指定
0160デフォルトの名無しさん
2011/03/07(月) 12:14:19.79インデックスを指定して削除をしてみたのですが、
上手くいかないようです。
for each でも削除出来ないようです。
>>>155
>名前で指定できない場合はインデックス番号で指定
0161デフォルトの名無しさん
2011/03/07(月) 13:15:24.41VBAじゃ無くてVB6以前から移行するのはよくあるよ
0162デフォルトの名無しさん
2011/03/07(月) 16:16:48.65VBEで
セルA1を指定する
つもりで次のように入力し実行すると
Sub test()
Cells("1,2").Select
End Sub
なぜかセルL1が指定されてしまいます
0163デフォルトの名無しさん
2011/03/07(月) 17:13:15.10Cells(1, 1).Select
または
Range("A1").Select
0164デフォルトの名無しさん
2011/03/07(月) 19:13:03.53数字を色々変えてみるが理由が分からん。
0165デフォルトの名無しさん
2011/03/07(月) 19:19:57.51Excel2003でCells("2,5,7").Selectなら多分A2だな。
0166162
2011/03/07(月) 21:13:26.55ありがとうございます
解決しました
>>162は一部数字が間違っています ("1,2")→("1,1")
>>165
試してみたら確かにA2になりました
端っこまでいって二列目に来たということですか?
もうひとつ質問です
今は無料のホームページを参考にしていますが
VBAを効率よく学習するにはやはり参考書を買ったり
教室に行ったりする方が良いのでしょうか?
0167デフォルトの名無しさん
2011/03/07(月) 21:21:23.99本を自宅で読むのなら、ホームページを見るのと変わらない
電車の中とか、空いている時間を活用するならそれでもいい
勉強する上で、一番大事なのは質問できる相手がいること
そういう意味では教室へ行くのがいいかもしれない
0168デフォルトの名無しさん
2011/03/07(月) 21:35:09.18そう端っこまでいって2行目に来たってことだ。
Range("B1:D2")(5).SelectならC2が選択される。
VBAの勉強なら教室行っても無駄だと思うなぁ。
とにかく何か作ってみることだな。
動けばよいって程度なら3か月もすれそれらしきものは作れる。
0169デフォルトの名無しさん
2011/03/07(月) 21:49:48.65Sheet1の一覧表から必要な項目だけを抜き出し
Sheet2のような形式の表に必要な項目を入れ込みたいと思います。
その時に
・納期が変わったら改ページ
の条件を付けたいと思いますが
VBAを使いSheet1から必要な項目だけをSheet2の表に入れ込むことは可能でしょうか?
ttp://uproda11.2ch-library.com/11288398.zip.shtml
DLキーは123です
宜しくお願い致します
0170デフォルトの名無しさん
2011/03/07(月) 22:25:23.10可能です。はい次の方ー
0171デフォルトの名無しさん
2011/03/08(火) 18:02:38.53は、
for each k in d.keys()
や
for each k in d.items()
で
ループさせるときにaddした順序が保たれることは保障されますか?
VBAに限らないとは思いますが。
0172デフォルトの名無しさん
2011/03/08(火) 19:44:07.77やってみりゃわかるだろ?
保障されるんだよ。
Dictionaryに限らずFor Eachじゃ順番が保障されないなんていうDQNもいるが、いままで順番を外れたのを見たことないわ。
0173デフォルトの名無しさん
2011/03/08(火) 20:23:50.42.NET互換のMonoとかは容赦なく保障しない作りになっているようだけど。
まあ、ドキュメントに記述されていない暗黙の了解があっさり覆されて
痛い目にあったりする事も間々あるから、慎重になる気持ちも解る。
0174デフォルトの名無しさん
2011/03/08(火) 20:33:07.38実際は順番通りだけどね。
0175デフォルトの名無しさん
2011/03/08(火) 22:52:52.89Application.GetSaveAsFilename(initialfilename:="C:\test.txt"...
と指定し実行するとダイアログ窓がでて
ファイル名前後に "(ダブルクォーテーション)が入ってしまう
ファイル名欄に "test.txt" と出てしまう
"(ダブルクォーテーション)を取るにはどうすればいいのでしょうか?
0176デフォルトの名無しさん
2011/03/08(火) 23:11:44.61正常に動くのを確認してから、マクロを実行したらエラーは
出なかったのですが、確認したのと違う動きになりました。
その後何度も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
となってしまいます。
0177デフォルトの名無しさん
2011/03/08(火) 23:32:21.96すくなくともこっちで実験したらそうならなかった
環境をちゃんと書け
>>176
g/Lを消し忘れてるだけじゃないのか?
0178デフォルトの名無しさん
2011/03/08(火) 23:44:33.23いいえ、”20”が入るはずのセルに”-”と
ハイフンが入ってしまうのです。
ハイフンは ELSEの判定の時のはずなのに。
0179デフォルトの名無しさん
2011/03/09(水) 00:37:53.49いろいろコードが間違ってると思うが、とりあえず確実にELSEに行ってるなら
A1に入ってる値が数字じゃないと思われ
i = .Range("A1").Value のあとで、iの型確認してみ
0180デフォルトの名無しさん
2011/03/09(水) 00:45:30.34>>179の言うような、評価が正しくされてない可能性がある
クイックビューかなにかで値を確認して初めて数字評価されて
デバッグ中だと正しく比較されるけど
通常の実行時は型の評価が遅延されてうまくいかない、って現象はある
確かめ方は、i <= 76 を i > 76にして、ifとelseの中身を交換してどうなるか見てみることだね
0181デフォルトの名無しさん
2011/03/09(水) 00:46:56.27が保証される旨の記載ってどこかにないの?
0182デフォルトの名無しさん
2011/03/09(水) 01:14:19.92iは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の処理が
ごっちゃになっているのです。
0183デフォルトの名無しさん
2011/03/09(水) 04:24:20.12そもそもRange("B1:C")なんて言う指定はエラーだと思うが
コード晒すなら正確に。あとその前後も晒せ
とくにwithのあたりとか、ループしたりしてないかとか、ifのネスト無いかとか
0184デフォルトの名無しさん
2011/03/09(水) 07:32:55.49A Dictionary object is the equivalent of a PERL associative array.
WindowsSDKからのコピペだけど、PERLの連想配列と同等と書かれているから、
あくまで、キーと値のペアの配列として保持されていると考えて良いんじゃないかな。
よって、KeysやItemsも追加した順で返されると。
KeysやItemsの説明には、配列に含まれる全ての〜を返す、としか書いてないけど。
0185デフォルトの名無しさん
2011/03/09(水) 09:24:41.75だからそのifあたりぼ書き方がおかしいかもしんないから検証しろっつってんだろカス
もう勝手にしろ
0186デフォルトの名無しさん
2011/03/09(水) 12:35:33.47Else の後ろのコロンを抜いて、
改行してから次の文をかく。
VBのコロンはただの行ラベル。
0187デフォルトの名無しさん
2011/03/09(水) 13:03:40.940188187
2011/03/09(水) 13:11:03.79変数の宣言を強制してないでElseの綴りを間違ったんだな。
0189デフォルトの名無しさん
2011/03/09(水) 15:50:13.38削除出来ないスタイルは、バイナリを直接編集して、スタイル名を変更することで削除することが、出来ました。
0190175
2011/03/09(水) 20:32:54.40InitialFileNameで設定するファイルの拡張子と
FileFilterで設定する拡張子が異なる場合(ファイル名を test.txt にしてfilterを *.xlsにした場合など)
"(ダブルクォーテーション)が付くことが分かりました
スレ汚し失礼しました
0191デフォルトの名無しさん
2011/03/09(水) 20:41:52.06Elseの綴りを間違って、ただの行ラベルになってしまったんだな。
綴りを間違わなければ行ラベルにはならんけど、どっちにしても>>186が言うように普通の書き方はにすべきだな。
0192デフォルトの名無しさん
2011/03/09(水) 21:56:00.51まあ落ち着けよwww
0193デフォルトの名無しさん
2011/03/09(水) 22:37:31.24そのまま1ページに印字して10件以上のデータがあった場合は
改ページプレビュでデータ件数の最後までを1ページに印字する
設定は可能でしょうか?
もしくは件数に応じて表の行の高さを変更させることは可能でしょうか?
どうかお知恵を貸してください。お願いします。
0194デフォルトの名無しさん
2011/03/09(水) 23:24:44.66昨日皆さんのアドバイスを頂いてからいろいろ検証してみました。
179さん、180さん、186さん、189さんおっしゃった通りに
すべて見直し、検証した結果上手くいきました。
原因としては他のモジュールで
.Range("B1:C1").Value = "-"
のコードがあり、記述途中での添削ミスでした。
こんな単純なミスを見逃し、みなさんを混乱させて
申し訳ありませんでした。
レスを下さった皆さんありがとうございました。
大変お騒がせいたしました。
0195デフォルトの名無しさん
2011/03/09(水) 23:30:47.26VBA使わなくても出きるような気がするが.....まあイイか
常に1ページにしたいなら
PageSetup オブジェクトで
Zoom = False
FitToPagesWide = 1
FitToPagesTall = 1
で出来ると思うよ
後 行の高さを変更するには RowHeight プロパティを使う
0197デフォルトの名無しさん
2011/03/10(木) 23:58:15.65現在は開発タブからVBを開いて実行という形をとっていますが
これらの操作をショートカットや他の方法で簡略化することは可能でしょう?
何か解決策ありましたら教えてください。
0198デフォルトの名無しさん
2011/03/11(金) 00:18:50.04フォームを呼び出すマクロを作れば、マクロには自由にショートカットキーが設定できる
0199デフォルトの名無しさん
2011/03/11(金) 00:32:16.35シートを保護する時にロックをしてるセルを選択出来なくなる
する奴あるじゃないですか?
あれをやると時々エクセルの挙動がおかしくなります。
矢印キーが効かなくなったり
アクティブセルの周りに普段なら出る黒い枠線が出なかったりとか。
スクロールロックが掛かってるとかそんなんじゃないです。
ロック有り無し関係なくして、シートイベントで制御した方が良いでしょうか?
前から時々なってて、ぐぐって調べたんですが
特にこれと言って解決策が見つかりません。
これだという絶対的な発生条件も不明です。なったりならなかったりします。
0200デフォルトの名無しさん
2011/03/11(金) 01:11:04.04一応ショートカットです。
Alt+F8 マクロの実行
とか
Alt+F11 VBEの起動
とかはどうですか?
0201デフォルトの名無しさん
2011/03/11(金) 12:39:01.06VBA?
0203デフォルトの名無しさん
2011/03/12(土) 07:46:57.11「マクロが実行できません。このブックでマクロが使用できないか、
またはすべてのマクロが無効になっている可能性があります。」
と表示されます。エクセル2010で作成したマクロは2010で当然動きます。
なにが理由か分かりません、助けてください。
0204デフォルトの名無しさん
2011/03/12(土) 14:18:36.86まくろが無効になってるから。
マクロ有効ファイルで保存しなおすか、
オプションでマクロの設定を変更するか、
信頼できる発行元の設定をすればいける。
0205デフォルトの名無しさん
2011/03/12(土) 14:21:17.240207デフォルトの名無しさん
2011/03/12(土) 15:42:26.87それで駄目ならこれとかやってみれば。
http://okwave.jp/qa/q6197506.html
0210デフォルトの名無しさん
2011/03/12(土) 19:26:05.430211デフォルトの名無しさん
2011/03/13(日) 21:36:27.84なんでかって言われると、マクロを悪用したトラブルが世界中で起きたから、
簡単には使えないように制限をかけたんだよ。
マクロを使うには、まずマクロ有効ブックとして保存しなおしたあと、
そのファイルを保存したフォルダを「信頼できる場所」に登録しなきゃいけない。
0212デフォルトの名無しさん
2011/03/13(日) 22:06:13.430213デフォルトの名無しさん
2011/03/14(月) 03:17:11.77もしかして64bit版Excelだったりしない?
32bitのマクロはそのままだと使えない機能があるんだけど
0214デフォルトの名無しさん
2011/03/18(金) 16:53:15.33Public test as Range
Public const test = range("A1")
sub a()
test.value = 1
end sub
このように使いたいのですがうまくできません
どうすればいいでしょうか
0215デフォルトの名無しさん
2011/03/18(金) 17:00:54.87エラーが出るのか処理が思った通りに行かないのか
エラーが出るならそのメッセージを、
思った通りに行かないのなら現在どうなっていてどういうふうになってほしいのか
そういう情報を書け
0216トリプルクリック
2011/03/18(金) 19:08:15.10こうか?
Sub a()
Dim rangeA1 As Range
Set rangeA1 = Range("A1")
rangeA1.Value = 1
End Sub
0217デフォルトの名無しさん
2011/03/18(金) 23:43:20.20エクセルで画像を再現できると聞いたのですが詳しく教えてくれませんか?
VBAでそういうことできるらしいのですがまったくわかりません
誰かわかりやすい解説サイトのURl貼るか解説してくれませんか?
0218デフォルトの名無しさん
2011/03/19(土) 00:12:19.73別に難しいことじゃないだろ、そんぐらい独学でやれよ
BMPのピクセル情報を取得する方法を調べる
セルの背景色を設定する方法を調べる
分ったら、とりあえずBMPのピクセル情報を一つ一つ調べて、それに基づいて
セルの背景を設定していく
ただそれだけだ
0219217
2011/03/19(土) 10:03:18.56馬鹿ですかあなた?
0220デフォルトの名無しさん
2011/03/19(土) 12:20:02.65金額列が一行目に5000、100行目に99999999999
という感じであるとRecordSetがintegerとして型を扱うのか、
100行目のデータがnullになってしまいます。
RecordSetの型認識を明示的に行う方法ってあるでしょうか。
order by 金額 descとすればいけるかと思いましたが、
金額列が複数あるので、その方法では解決しなさそうです。
0221デフォルトの名無しさん
2011/03/19(土) 12:41:47.610222デフォルトの名無しさん
2011/03/19(土) 13:18:54.4799,999,999,999
vbaのlong型だと、何があっても不思議じゃない数字だね。
0223デフォルトの名無しさん
2011/03/19(土) 14:10:12.68せめてプロパイダ何使ったかぐらい書け
Jetならschema.ini書けば行けるんじゃなかろうか
0224デフォルトの名無しさん
2011/03/19(土) 21:45:36.13ありがとう
調べても急にプログラミング言語が云々とか出てきて
具体的にどういうことをしてそうなるのかがわからなかったんだ
それがわかっただけでもマジ助かったわ
サンクス
0225デフォルトの名無しさん
2011/03/19(土) 23:58:51.18遊べる簡単なゲームを作りました。一応、ゲーム中は問題なく遊べるのですが、
ゲーム終了直後に多くのセルに文字が入力されてしまいます。ゲーム中に押した
「z」や「→」などの入力が、ゲーム終了直後にシートに反映されてしまっている
ようです(おそらく)。それらの文字を毎回消すのは面倒なので、どのように
すれば文字だらけにならないで済むか教えていただきたいです。
Declare Function GetAsyncKeyState Lib "User32.dll" (ByVal vKey As Long) As Long
sub ゲーム()
Do while ゲーム継続条件
If GetAsyncKeyState(40) <> 0 Then
・
・
・
end if
Loop
一応、こんな流れです。
0226デフォルトの名無しさん
2011/03/20(日) 01:16:26.80最後に全データを消せばいいのでは
Cells.Clear
0227デフォルトの名無しさん
2011/03/20(日) 01:42:35.95レスありがとうございます。
そのシートには、ゲームの途中経過や記録など、消えてほしくないデータもたくさん
あるので、全データを消すわけにはいきません。また、一応最後にcells.clearを書いて
見たところ、他のデータはすべて消えましたが、その後に「z」などが入力されてしまい
ました><
0228デフォルトの名無しさん
2011/03/20(日) 02:10:21.020229デフォルトの名無しさん
2011/03/20(日) 02:52:57.32レスありがとうございます。
チェンジイベントで消すという発想はなかったです!ゲーム終了直後にセルに文字が入力
されることに変わりはないので、セルが高速で選択されまくるのは少し気になりますが、
それらを手作業で消す必要がなくなったので問題はありません。ありがとうございました!
0230デフォルトの名無しさん
2011/03/20(日) 07:47:58.79A1セルの左上からC3セルの右下まで波線を引いたり、
A1セルの左上からA3セルの右下まで波線を引けると助かります。
0231デフォルトの名無しさん
2011/03/20(日) 11:36:39.78Excelのバージョンは?
0232デフォルトの名無しさん
2011/03/20(日) 15:08:58.53オリジナルページではマクロが動くことが分かりました。
使用するときはこのオリジナルページの新規作成ボタンを押して、
新たなエクセルファイルを作成するのですが、この新作成したマクロの
パスが新規作成ファイルのパスになっており、全てのパスをオリジナルに
設定しなおさなくてはなりません。設定せずに済むなにか良い方法はないでしょうか?
0233デフォルトの名無しさん
2011/03/20(日) 16:11:11.10いまいちわからない。オリジナルページってなんだ?
あとパスを設定?書き換える?にしても、
なに用のパスを変更するかわからないと手出できない。
とりあえず、そのマクロを作った人に聞いたほうがいいんじゃないか?
0234デフォルトの名無しさん
2011/03/20(日) 17:15:47.832003です。
0235デフォルトの名無しさん
2011/03/20(日) 20:43:10.88' ほい。できたよ
' セルを選択してから実行すると
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
0236235
2011/03/21(月) 03:18:30.50下から7行目、破線の位置を決めてる部分だけど
画面上で見る場合はこの方がピッタリになる
.IncrementTop 2.3 - p * 1.1
印刷時はまた違ってくるだろうけど、今すぐには確認できん
0237デフォルトの名無しさん
2011/03/21(月) 07:50:28.08線の外に文字でも入力するの?
そうじゃなきゃセルを結合すれば簡単
0238デフォルトの名無しさん
2011/03/21(月) 16:17:48.75どうやるの?
罫線だと波線は選べないよね
0239デフォルトの名無しさん
2011/03/21(月) 19:47:08.57そうか破線じゃできないな。
点線と勘違いしたよ。
>>235-236
A1:B10だとおかしくなるね。
0240デフォルトの名無しさん
2011/03/22(火) 00:21:24.81面白い現象だ
0241デフォルトの名無しさん
2011/03/22(火) 04:13:57.49落書き用のシートを作ればいいんじゃ?
0242デフォルトの名無しさん
2011/03/23(水) 13:08:07.89一つの音源の音の高さを変えて再生することって可能ですか?
0243デフォルトの名無しさん
2011/03/23(水) 18:01:16.51転職の際、同じことした御方みえますか?
0244デフォルトの名無しさん
2011/03/24(木) 11:47:08.990246デフォルトの名無しさん
2011/03/25(金) 00:24:23.64ホイールイベントをフックするぐらいしか思いつかん
0247デフォルトの名無しさん
2011/03/25(金) 12:52:21.32あいう
(空白行)
えおか
という文字があった場合、その空白行を消して
あいう
えおか
というように詰める事は可能でしょうか?
分かる方いましたら教えてください。お願いします。
0248デフォルトの名無しさん
2011/03/25(金) 16:48:35.11サンプル書いた
Sub Sample()
Worksheets("Sheet1").Columns("A").Replace What:=Chr(10) & Chr(10), Replacement:=Chr(10)
End Sub
0249247
2011/03/25(金) 20:24:54.73お答えくださってありがとうございます。
再度質問よろしいでしょうか?
Chr(10)がラインフィード文字というのは分かりましたが
何故Chr(10) & Chr(10)が空白行の検索ということになるのか
そしてReplacement:=Chr(10)に置換することによりどうして空白行が無くなるのか
いまいちわかりません。
それと、Cells(1,1)というようにして記述したい場合どのようになりますか?
よろしくお願いします。
0250デフォルトの名無しさん
2011/03/25(金) 21:05:59.77改行2個で空白行になるから、1個なら単なる改行になる。
A1のみならReplace関数でもいい。
With Cells(1, 1)
.Value = Replace(.Value, vbLf & vbLf, vbLf)
End With
A列を置換なら
Range("A:A").Replace vbLf & vbLf, vbLf
0251デフォルトの名無しさん
2011/03/26(土) 07:13:00.18MIDIデバイスをいじるといいぜ
昔自分用に作ったランダムに音を出すブック
http://www.death-note.biz/up/o/19433.xls
0252デフォルトの名無しさん
2011/03/26(土) 07:20:50.44グラフエリア上にツールバーからコンボボックスを作りました。
�@[コントロールの書式設定]でリストの入力範囲を設定し、
�A[マクロの登録]で、VBエディッタにコードを作成できたのですが、
コンボボックスでクリックされた値を�Aのサブプロシージャ-で取得する
方法がわかりません。ヒントでよいので、お願いします。
0253デフォルトの名無しさん
2011/03/26(土) 10:41:35.15つまり、グラフエリア上に作成したコンボボックスのコードとして記述するための名前がわからないのですが、、、
0254デフォルトの名無しさん
2011/03/26(土) 14:00:52.64Application.WorksheetFunction.StDevとかに使うためにやりたいです
0255デフォルトの名無しさん
2011/03/26(土) 14:33:21.31普通に出来るだろ
0256デフォルトの名無しさん
2011/03/26(土) 14:34:23.400257デフォルトの名無しさん
2011/03/26(土) 14:51:21.56サンプル書いた
Sub Sample()
Dim WS As Variant
Dim R As Range
Set WS = ActiveSheet
Set R = WS.Cells
End Sub
0259デフォルトの名無しさん
2011/03/26(土) 17:50:35.81> 転職用のアピール材料として、アプリを構築した。そんで、提案書とサルでも分かるような仕様書も作った。
> 転職の際、同じことした御方みえますか?
あるよ
0260デフォルトの名無しさん
2011/03/26(土) 20:39:43.48運悪くコードオタクとかがその会社にいたら、中身見られて汚いコードだから不合格とか言われるかもw
Selectだらけのど下手でもプロとしてやってる奴いたりするから会社次第とは思うが。
0261デフォルトの名無しさん
2011/03/26(土) 21:49:10.81新卒だったら考えるけど
0262デフォルトの名無しさん
2011/03/26(土) 22:40:16.83お前のコードはそんなに恥ずかしいのか?
0263デフォルトの名無しさん
2011/03/26(土) 23:05:05.690264デフォルトの名無しさん
2011/03/26(土) 23:41:37.570265デフォルトの名無しさん
2011/03/26(土) 23:43:30.520266デフォルトの名無しさん
2011/03/27(日) 10:55:16.310267デフォルトの名無しさん
2011/03/27(日) 12:23:49.91プログラマの能力を見るにはコードを見るのが一番だけど、
持ってこさせないのは面接官がコードを読めないんだろうな。
0268デフォルトの名無しさん
2011/03/27(日) 14:35:32.500269デフォルトの名無しさん
2011/03/27(日) 14:44:35.26そんなのは当たり前だが、プログラマがVBAってのがダメダメすぎw
つーかVBAじゃまともに能力計れないし
小学生のソフトボール投げが、大人になると砲丸や槍になるように
VBAで能力計れるのは、精々中学生1年生まで
0270デフォルトの名無しさん
2011/03/27(日) 14:53:09.07VBAは便利だぞ
0271デフォルトの名無しさん
2011/03/27(日) 15:02:09.60しかしVBAでアピールしようとする奴は、評価に値しない
0272デフォルトの名無しさん
2011/03/27(日) 15:16:38.45構築したアプリがVBAだとはどこにも書いてない
まあ、スレ違いだからこれ以上はよそでやってくれ
0273デフォルトの名無しさん
2011/03/27(日) 15:26:43.86そこはどうだろうと関係ない部分だけど?
> 構築したアプリがVBAだとはどこにも書いてない
ここはVBAスレなんだから、VBA以外でアピールする話をVBAスレでしてるなら
まともな判断能力が欠如してるってことで、それこそ就職どころじゃないw
0274デフォルトの名無しさん
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
----------
良い方法を教えてください。お願いします。
0275デフォルトの名無しさん
2011/03/27(日) 20:19:40.09引数(ひきすう)を使うといいよ
こんな感じで、何行目から始めるか指定する
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」にするだけで、処理の範囲を変えることができる
0276デフォルトの名無しさん
2011/03/27(日) 20:24:31.26もうちょっと分かりやすくお願いします。
初心者なんで
0277デフォルトの名無しさん
2011/03/27(日) 21:23:18.200278デフォルトの名無しさん
2011/03/27(日) 21:28:29.640279デフォルトの名無しさん
2011/03/27(日) 22:19:56.33態度でかい奴ばかり
0280デフォルトの名無しさん
2011/03/27(日) 22:30:06.840281デフォルトの名無しさん
2011/03/28(月) 00:16:17.14例えば、自己PRとしてアプリ提出することが何故いけないの?相手に売り込むための、プレゼンの一環だと思うし。
例えば、初心者だからと前置きしていて不遜な態度をとっていないのにもかかわらず、上から目線とか余裕ないですよね。
0282デフォルトの名無しさん
2011/03/28(月) 00:27:17.74なんでそんなに余裕がないの?
0283デフォルトの名無しさん
2011/03/28(月) 06:45:07.89企画系の募集じゃない場合
(ここでプレゼンとか何様だよ)
面接官がプログラマーの場合
(うわVBかよ)
面接官がプログラマーじゃない場合
(これ採用の評価基準にしろと?じゃめんどいから不採用で)
アプリ提出が前提でよっぽど自信作じゃない限り危険
0284デフォルトの名無しさん
2011/03/28(月) 10:08:05.000285デフォルトの名無しさん
2011/03/28(月) 10:17:38.05VBAスレでビジネスライクなまともなアプリとか言ってもカッコワルイだけだし
VBAスレなのにVBA以外での話だなんて言い訳しだしたらもっとカッコワルイw
0286デフォルトの名無しさん
2011/03/28(月) 10:47:27.910287デフォルトの名無しさん
2011/03/28(月) 11:26:09.69あえてVBAを選択して使ってるわけじゃないし
中にはVBAを簡易開発環境代わりにしてなんでもVBAでやる奴も居るけど
俺はOfficeアプリが必要な場合以外はVBAなんて使わないし
0288デフォルトの名無しさん
2011/03/28(月) 12:45:29.11Windowsのプログラミングはライブラリで決まる
何から呼び出しても結果は一緒
あと、なんかもう開発環境をわざわざインストールするのがめんどい
Officeは最初から入ってるし
最近のマシンは処理速度も十分
VBAを嫌ってるのは知識の古い老害だけ
0289デフォルトの名無しさん
2011/03/28(月) 12:59:45.38俺はすごい、レベル高いって思いたくなっちゃうんだよな
まあ、動物的本能というか感情の問題だな
0290デフォルトの名無しさん
2011/03/28(月) 13:21:41.55データを共有しないスタンドアロンアプリではExcelVBAが最強
0291デフォルトの名無しさん
2011/03/28(月) 13:25:48.49プログラマ募集でソース付きで作品を提出させればいい判断材料になりそうだけどな
0292デフォルトの名無しさん
2011/03/28(月) 13:29:16.85滑稽極まりないw
0293デフォルトの名無しさん
2011/03/28(月) 13:41:50.90> Officeは最初から入ってるし
> Officeは最初から入ってるし
> Officeは最初から入ってるし
何時からOS標準になったんだ?
0294デフォルトの名無しさん
2011/03/28(月) 15:02:55.380295デフォルトの名無しさん
2011/03/28(月) 15:17:53.070296デフォルトの名無しさん
2011/03/28(月) 15:31:03.120297デフォルトの名無しさん
2011/03/28(月) 15:42:53.290298デフォルトの名無しさん
2011/03/28(月) 16:37:39.070299デフォルトの名無しさん
2011/03/28(月) 17:21:33.6999%は一緒だから安心しろ
0300デフォルトの名無しさん
2011/03/28(月) 18:51:04.92言語じゃねーよ
0301デフォルトの名無しさん
2011/03/28(月) 19:56:33.060302デフォルトの名無しさん
2011/03/28(月) 20:23:54.55サンクス
0303デフォルトの名無しさん
2011/03/28(月) 21:48:00.87モジュールすら公開しないのに、わざわざ使う気力が湧かないわ
0304デフォルトの名無しさん
2011/03/29(火) 00:24:55.970305デフォルトの名無しさん
2011/03/29(火) 01:18:24.75現場で使ってるのを見たことがあるけどその時は
クラスとか全然知らなかったから全く分からなかった。
JAVAとか勉強した後にこのサイト見るとそんなに難しくなさそうだ
http://codezine.jp/article/detail/499
VBAしかやったことがない人にはクラスは難しそうに見えるけど
JAVAを勉強すればそんなに難しくない事に気がつく。
0306デフォルトの名無しさん
2011/03/29(火) 01:24:01.890307デフォルトの名無しさん
2011/03/29(火) 04:40:54.10構造体はapiの引数にしかたなく使う感じ
どっちも配列使うのに制限があって使い勝手が悪い
0308デフォルトの名無しさん
2011/03/29(火) 06:48:07.29俺の場合はそれだけだな
0309デフォルトの名無しさん
2011/03/29(火) 07:01:51.83構造体と似た、ほぼグローバル変数のみのクラスだが、
代入できる値の範囲を制限したり、値の代入に伴って行う簡単な処理を置いたり
特定の値が入った場合にRaiseEventでイベント起こしてやったり
307も言ってる仮想コントロール配列も、結局はコレだしね
0312デフォルトの名無しさん
2011/03/29(火) 10:36:10.36近似曲線の追加からグラフに傾きと切片の式を追加できるとおもうんですが
この式が表示されるテキストボックス(データラベル?)の位置を取得
したいと考えています。
その際、この式の位置やサイズを取得するときのコントロールオブジェクトを
教えてください。
0313デフォルトの名無しさん
2011/03/29(火) 16:02:41.54A1セルに数字を入力し、B1セルに数に応じた背景色を反映させたいのですがどうすれば良いでしょうか
2003だと条件書式で3つまでは入力できたのですが、2007は条件追加ボタンが見当たらず・・・
20001〜青
15001〜20000水色
10001〜15000緑
5001〜10000黄色
0〜5000赤
0314デフォルトの名無しさん
2011/03/29(火) 16:08:25.840315デフォルトの名無しさん
2011/03/29(火) 18:00:09.65Z1に入力した数字次第(○○以上○○未満の場合)で、W1セル背景が5段階に変色するという書式をAND関数を使って設定しています
以降入力数字に対する変色は同条件で、Z2に入力したものをV1に反映、Z3に入力したものをU1に反映と、縦の入力データを横左方向に出力、といった書式を一括でコピーしたいのですが方法はあるでしょうか
現状W1をコピーすると、V1にもZ1からデータをひっぱってくる数式がコピーされてしまいます
W1セルに対して
Z1<5001 のとき背景赤色
AND(Z$1>=5001,Z$1<10001) のとき背景黄色といった感じで記入してます
$の位置が悪いか不要ですかね
0316デフォルトの名無しさん
2011/03/29(火) 18:03:45.25つーか、ここはExcelスレではなくVBAスレなんだが
おまえはそれが解って来ているのか?
0317デフォルトの名無しさん
2011/03/29(火) 18:10:31.690318デフォルトの名無しさん
2011/03/29(火) 19:32:25.08ループで処理実行中の間、マウスカーソルを砂時計が回っている奴に変えたいのですが、
どうすればよろしいんでしょう?
0319デフォルトの名無しさん
2011/03/29(火) 19:34:27.89細かい事言うな
0320デフォルトの名無しさん
2011/03/29(火) 20:04:38.14マウスカーソルの変更はVBAではなくVBの分野。(>>3参照)
スレ違い。
0321デフォルトの名無しさん
2011/03/29(火) 20:24:15.49Application.Cursor = xlWait '砂時計
'ループ処理
Application.Cursor = xlDefault '通常
0322デフォルトの名無しさん
2011/03/29(火) 20:29:02.84…
>>321
ありがと
0323デフォルトの名無しさん
2011/03/29(火) 20:37:03.65本人納得して移動してるのに、他人が細かい事言うな
0324303
2011/03/29(火) 21:30:38.26コントロール配列を実装するのがいちばん使いでがありそうな感じだね
構造体はWin32APIとかで必須だけど、VBScriptだと使えないから
泣く泣くクラスで実装してる人も多いんだろうか
わざわざクラス使ってるVBS見たことないですわ
0325309
2011/03/29(火) 21:45:28.88> 連想配列にぶち込むオブジェクトとしてクラス使う
は、VBAでもVBSでも変わらないからな
ぶち込む先がVBA.CollectionかScripting.Dictionaryかの違いで
あとはVBAでは標準モジュール毎にPrivateメンバを持てるけど
WSFでインクルードする場合は、ファイル毎にPrivateメンバを持てないので
Privateメンバを持たせたい場合は必然的にクラス使うことになる
0326デフォルトの名無しさん
2011/03/29(火) 21:57:12.95俺もそれだと思ったんだが、俺のExcel2010じゃ砂時計にならないんだよな。
丸いのがぐるぐる回ってる。
砂時計はどうやって出すんだろ?
0327デフォルトの名無しさん
2011/03/29(火) 23:07:16.51VBSで入力補完が出来るエディタってある?
0328デフォルトの名無しさん
2011/03/29(火) 23:11:26.420329デフォルトの名無しさん
2011/03/29(火) 23:38:26.78APIでアイコンセットを切り替え
0330デフォルトの名無しさん
2011/03/30(水) 09:33:22.55仕事で必要なため、勉強したいが、
最初に読む書籍でオススメがあれば、
教えてください。
バージョンはExcel 2003です。
0331デフォルトの名無しさん
2011/03/30(水) 09:51:56.85先ずはこの3冊がおすすめ。2007でもいいかも。
かんたんプログラミング Excel2003 VBA 基礎編
かんたんプログラミング Excel2003 VBA 応用編
かんたんプログラミング Excel2003 VBA コントロール・関数編
0332デフォルトの名無しさん
2011/03/30(水) 17:03:17.22> できる大辞典 Excel VBA
> がオススメ
>
> 大村あつしは知識はあるが根本的にバカなので
> こいつの書いた本は素人にはオススメしない
> バカな内容に引きずられないだけの基礎スキルを持っていて
> 知識だけ上乗せしたい中級者以降なら構わないが
かんたんプログラミング Excel2003 VBAシリーズは大村あつし
0333デフォルトの名無しさん
2011/03/30(水) 21:49:48.50プログラム未経験なら
ExcelVBAより、CやJavaから始めたほうが、
学びやすい
ExcelVBAを1年間学ぶより、
Javaを11ヶ月学んで1ヶ月ExcelVBAを学ぶほうが
はるかにプログラマとしての実力がつくだろう
0334デフォルトの名無しさん
2011/03/30(水) 22:03:22.880335デフォルトの名無しさん
2011/03/30(水) 22:05:42.34ハードウェア(PCアーキテクチャ)に多少なりとも造詣があるならC
それほどでも無ければJAVA
Windowsしか解らんのであればC#
0336デフォルトの名無しさん
2011/03/30(水) 22:28:37.87ExcelVBAが仕事で必要という事ではないのか?
0337デフォルトの名無しさん
2011/03/30(水) 22:44:23.320338デフォルトの名無しさん
2011/03/30(水) 22:57:10.13Excelを使うのがメインならExcelVBA以外でどうする気だね?
0339デフォルトの名無しさん
2011/03/30(水) 23:08:25.580340デフォルトの名無しさん
2011/03/30(水) 23:09:54.98つまり、JScriptはもちろんのこと、Perl、Ruby、Pythonなどでも
VBAと同等とは言えないが、かなりの操作が可能だよ
まあ俺は別言語が使いたいわけじゃないから、外部から弄る場合もVBSだが
0341デフォルトの名無しさん
2011/03/30(水) 23:17:09.380342デフォルトの名無しさん
2011/03/30(水) 23:18:09.83別ので作り直すの?
0343デフォルトの名無しさん
2011/03/30(水) 23:23:22.79既に開いてる奴を外部から操作することもあるよ
まあExcelの操作できる言語はVBAのみじゃないってだけの話だし
0344デフォルトの名無しさん
2011/03/30(水) 23:46:48.37引数省略できねぇえぇぇ
0345デフォルトの名無しさん
2011/03/31(木) 02:08:31.030346デフォルトの名無しさん
2011/03/31(木) 11:29:59.92Excel2003です。お願いします
0347デフォルトの名無しさん
2011/03/31(木) 11:51:43.54手動での再計算操作をマクロの記録にとっても解るし
なんでこのレベルのことを自分で調べられないの?
0348デフォルトの名無しさん
2011/03/31(木) 20:04:40.56(実行時のエラーではなく、記述している最中のエラーです。)
ヘルプを見ると「メモリが不足しています。(Error 7)」というエラーのようです。
ヘルプに記載されている対処は行ってみたものの、改善されませんでした。
どのようにすればこの問題は解決できるのでしょうか?
Excel2007です。よろしくお願いします。
0349デフォルトの名無しさん
2011/03/31(木) 20:23:08.730350348
2011/03/31(木) 20:31:16.72すみません。ハードウェア環境は以下の通りです。
WinXPProSP3
CPU i7 2.80GHz
メモリ 2.96 GB
仮想メモリのページングファイル 2046 - 4092 MB
他の人のPCで起動しようとしても同じエラーが出ました。
0351デフォルトの名無しさん
2011/03/31(木) 21:12:32.060352348
2011/03/31(木) 21:18:50.73すみません。業務で作成したコードのため、公開することができませんでした。
自己解決しました。
ttp://hpcgi1.nifty.com/MADIA/VBBBS2/wwwlng.cgi?print+200604/06040032.txt
にあるように、新規でエクセルファイルを作成し、全コピーをすることで問題を解消することができました。
ただし、気になる点が1つだけあります。
全てのシート及びコードをコピーしたはずなのに、(数人で確認しました。)
新しいファイルが657KBに対し、エラーのあるファイルは17644KBでした。
これが原因だったのかもしれませんが、詳細は不明です。
0353デフォルトの名無しさん
2011/03/31(木) 22:39:26.82たぶん、どれかのシートの最下行(Excel2007なら数百万行だっけ)あたりになにかゴミデータでもあるんじゃないか?
0354デフォルトの名無しさん
2011/04/01(金) 00:50:47.68Excelのオブジェクトは省略パラメータだらけだって事だよ
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);
こんな感じになる
0355348
2011/04/01(金) 09:42:16.41返信が遅くなりました。
Ctrl+A->Ctrl+C->Ctrl+P の繰り返しでコピーしたので
ごみデータがあればそれも一緒にコピーされる気がしますが・・・。
ともあれ、問題は解決しました。
新規作成中のコードもうまく動くようになりました。
ご回答下さった皆様、ありがとうございました。
0356デフォルトの名無しさん
2011/04/01(金) 09:48:14.24◎Ctrl+V
0357デフォルトの名無しさん
2011/04/01(金) 10:14:53.51個人用マクロブックにユーザー定義関数を書いているんですが
実際にそのマクロを使用するワークシート内で関数を実行しようとする場合
=個人用マクロブック!関数名
という風にユーザー定義関数の指定を個人用マクロブックの指定も含めて
行わなければname?となってしまうんですが、個人用マクロブックの指定を
省略することができるような設定方法などないでしょうか。
0358デフォルトの名無しさん
2011/04/01(金) 10:21:24.500359デフォルトの名無しさん
2011/04/01(金) 12:28:23.64もう少し用途を具体的に言うと、図形の塗り潰し色を変更するマクロで、塗り潰し色に合わせて文字色も変更したいのです。
デフォルトの文字色は白のため、塗り潰し色を白にすると文字が読めなくて困っています。
.selection.shaperangeからいけるかと思ったのですが、該当するものが見当たらず……
OSはvista、エクセルのバージョンは2007です。
0360デフォルトの名無しさん
2011/04/01(金) 12:31:43.52Publicをつけていなかったのでつけてみたんですがやはりマクロブックの
指定をしないとname?になってしまいます。
標準モジュールには記述しています。
0361デフォルトの名無しさん
2011/04/01(金) 13:55:00.59Auto_OpenでExcelの起動と同時にマクロを走らせているのですが、
2007では起動と同時にワークシートも表示されていたのが
2010ではマクロが終了するまでシートが表示されません
なんとかなりませんか?
0362デフォルトの名無しさん
2011/04/01(金) 15:19:27.73アドインにすればいいと思うが。。
さうすれば他のPCでも使える。
0363デフォルトの名無しさん
2011/04/01(金) 16:56:53.55各エクセルファイルそれぞれのに同一のコードをコピペしたり、
エクセルファイル自体をコピーしてコードをそのまま持ってきて使用しています。
現状で、そのファイルが10個以上となっていますが、
vbaのコードに仕様を変更したり修正したりすると、それらのファイルのすべてそれぞれで
同様にコードを書きなおさないとなりません。
全選択のコピペで済む話ですが、かっこ良い仕様とは言えませんね。
なので、DLLみたいな感じで、コード自体は一つのファイルとして、
各エクセルファイルでそれを参照するようにすれば、もとのコードファイルを書き換えるだけで済むような仕様にしたいのですが、
そういう場合はどのようにすればよいのでしょうか?
0364デフォルトの名無しさん
2011/04/01(金) 17:05:09.100365デフォルトの名無しさん
2011/04/01(金) 17:09:29.77要するに、別ファイルに記述されているvbaコードを使えるかどうかです。
ちなみに BeforeDoubleClick等のイベントプロシージャも使用しています。
0366デフォルトの名無しさん
2011/04/01(金) 17:17:20.93もしかしたら個人用マクロブックでは出来ないとか勘違いしてるのかも知れないけど
イベントも含めてちゃんと出来るから
0367デフォルトの名無しさん
2011/04/01(金) 17:30:11.45自己解決ですが、参照設定でコードが書かれたxlsファイルを直接指定しておけばグッドそうです。
ありがとうございました><
>>366
個人用マクロブックだとそれらとは関係ないエクセルファイルを使用する時もいちいち読みこまれるのがカッコ悪いと思います。
0368デフォルトの名無しさん
2011/04/01(金) 17:59:41.210369デフォルトの名無しさん
2011/04/01(金) 20:43:03.14人に聞くのは
0370デフォルトの名無しさん
2011/04/01(金) 20:48:16.27→■
上の状況で■を選択してマクロを実行、いろいろした最後に、→を繋ぎ直す処理をしたい。
くっついてる最初の時点で名前を取っといて、最後にendconnect selectionすればいいと思うだけど。
0371デフォルトの名無しさん
2011/04/01(金) 21:57:43.94かっこいい…しびれた……
0372デフォルトの名無しさん
2011/04/02(土) 14:15:20.95自己解決しました。
0373質問
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
0374デフォルトの名無しさん
2011/04/02(土) 15:19:21.87何か勘違いしていたでしょうか?
もしかして、個人用マクロブックの中のマクロで、開いたファイル中で呼び出すことがないマクロに関しては読み込まれないんですか?
0375デフォルトの名無しさん
2011/04/02(土) 15:40:54.59"カテゴリ"シートに切り替えても
Rangeで取得されるのは、そのコードが書かれている親だよ
VBEのプロジェクトエクスプローラ見れば、どこに書いているか解る
なので
Worksheets("カテゴリ").Range("A2").Value '(With使っても良し)
とするか、どうしても切り替えたいなら
Worksheets("カテゴリ").Activate
ActiveSheet.Range("A2").Value
としな
>>374
もう出てこなくていいよ
君のレベルじゃ話にならないから
0377デフォルトの名無しさん
2011/04/02(土) 22:40:38.130378デフォルトの名無しさん
2011/04/02(土) 22:44:44.350379デフォルトの名無しさん
2011/04/02(土) 22:50:35.56>>377もそうやって必然性に迫られるまでは、クラスなんか使わなくていいよ
0380デフォルトの名無しさん
2011/04/02(土) 23:16:00.88リファレンスという側面以外に学習教材としての側面も大いに持ち合わせていてかなり良い!
0381デフォルトの名無しさん
2011/04/03(日) 00:24:47.36VBA環境の右クリックに独自イベント処理を追加したとき、くらいかなぁ
こんなかんじ
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/
0382デフォルトの名無しさん
2011/04/03(日) 17:14:30.22たくさん作ったのですが、1つをチェックするとほかのチェックボックスの
チェックが消えるようにして、チェックできるのが常に一つにしたいのですが、
どうしたらいいでしょうか?
0383デフォルトの名無しさん
2011/04/03(日) 17:45:07.90この時点で既に板違いなんでどうでもいいんだが、何で作ったかも書かないという
0384デフォルトの名無しさん
2011/04/03(日) 17:46:58.80オプションボタン(ラジオボタン)を使うんだよ、坊や
0385デフォルトの名無しさん
2011/04/03(日) 18:13:59.91みなさん、やさしいですね。ありがとうございます!!
0387デフォルトの名無しさん
2011/04/03(日) 22:15:50.29D1が =SUM(A1:C1)となっていた場合に、
F1にD1の値のみコピーをしたいんだけど、
A1 B1 C1に数値を入力するたびに、
F1にD1の値のみコピーってできる?
エクセル2007 VBAのコードを教えて。
特に、「A1 B1 C1に数値を入力するたびに」のコードの解説もよろ。
0388デフォルトの名無しさん
2011/04/03(日) 22:25:34.32ワークシートのChangeイベントで出来る
この説明で解らないなら、基礎を勉強して出直せ
ここは丸投げでコード書いて貰うスレではなく、要点だけ教えて貰えば、
あとは自分でコード書ける人がヒントを貰いに来るスレなので
0389デフォルトの名無しさん
2011/04/03(日) 22:56:21.79この種のクソ虫が最近増えてきたな
0390387
2011/04/03(日) 23:02:50.15本当に困っているvba初心者なんだ.
サンプルコード教えてw
0391デフォルトの名無しさん
2011/04/03(日) 23:14:18.17sub サンプルコード()
do
if msgbox("あなたは糞虫ですか?", vbyesno) = vbyes Then
msgbox "やはり糞虫だったんですねw"
exit do
end if
loop
end sub
0392387
2011/04/03(日) 23:23:04.84アフォかおまえ
おれはくそ蒸しであって糞虫ちゃうちゅうねんw
こいつじゃあ話にならん。
コードかける人かもーんw
0393コードかける人
2011/04/03(日) 23:32:04.10C G Am Em F C Dm/F G
コード書いたよ
大逆循環な
0394デフォルトの名無しさん
2011/04/03(日) 23:36:23.20なんの曲だよw
0395デフォルトの名無しさん
2011/04/03(日) 23:40:12.94普通に数式で、F1セルに「=D1」とかじゃあダメなのか?
0396デフォルトの名無しさん
2011/04/03(日) 23:43:12.39大逆循環はコード(進行)最適化の一つの結論だぜ
http://ja.wikipedia.org/wiki/%E3%82%AB%E3%83%8E%E3%83%B3_%28%E3%83%91%E3%83%83%E3%83%98%E3%83%AB%E3%83%99%E3%83%AB%29#.E5.A4.A7.E9.80.86.E5.BE.AA.E7.92.B0
0397デフォルトの名無しさん
2011/04/04(月) 00:13:17.03あーそういやそんなコード理論あったなぁ
つーか進行的に普通すぎて名前なんか出てこないぞw
0398デフォルトの名無しさん
2011/04/04(月) 01:08:21.43' ワークシートに変更があった場合
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
0399387
2011/04/04(月) 02:00:59.90ありがとうございます。
ここから、Copyメソッドや、PasteSpecialメソッドが続くと思うのですが、
よくわかりません。どうしてもエラーが出てしまいます。
0400デフォルトの名無しさん
2011/04/04(月) 02:14:46.11横レスだけど、>>398は、標準モジュールじゃなくて
ワークシートモジュールに書くんだよ
CopyメソッドとかPastSpecialメソッドとか関係ないよ
0401デフォルトの名無しさん
2011/04/04(月) 02:43:22.07するくらいなら
スルー
する
んだな!
0402387
2011/04/04(月) 02:55:56.78ワークシートモジュールに書いてます^^;
>>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
どこが誤りなのでしょうか?
0403387
2011/04/04(月) 03:05:15.99○形式を選択して貼り付け
でした。すみません。
0404デフォルトの名無しさん
2011/04/04(月) 06:23:27.58CopyやPasteSpecialは関係ない
>>398のままでいい
>>387でD1セルに「=SUM(A1:C1)」となっている
と書いてあるのを前提として
0405デフォルトの名無しさん
2011/04/04(月) 19:04:57.44答えてる方も釣りかw
0406デフォルトの名無しさん
2011/04/04(月) 19:06:21.05>>387のエクセルの自動計算がオフになってるだけじゃないのか?
0407デフォルトの名無しさん
2011/04/04(月) 20:34:41.64>エクセルの自動計算がオフ
何のこと?どこにチェック項目がある?
0408デフォルトの名無しさん
2011/04/04(月) 21:03:13.460409デフォルトの名無しさん
2011/04/04(月) 22:32:47.27Cells(1, 4).Value = Cells(1, 1).Value + Cells(1, 2).Value + Cells(1, 3).Value
が思いつくのに、
Cells(1, 6).Value = Cells(1, 4).Value
が思いつかないのは不思議だ
いっそ、プロシージャの中身、全部消して
上の2文だけにしたら?
0410デフォルトの名無しさん
2011/04/04(月) 22:45:36.59× Cells(1, 4).Value.Copy
○ Cells(1, 4).Copy
0411387
2011/04/04(月) 23:44:22.94ありがとうございます。自己解決してましたがw
ところで、このプログラムを実行すると、
Cells(1, 4)がコピー元の選択状態になってうざいのですが、
PasteSpecialメソッドを実行した後、
この状態を解消するメソッドってあります?
0412デフォルトの名無しさん
2011/04/04(月) 23:47:39.17Cells(1, 6).Value = Cells(1, 4).Value
ってやらんのだね?
そこまでコピペにこだわる特別な理由でもあるのか?
0413387
2011/04/04(月) 23:59:20.91実際、仕事で使っているエクセルには>>398さんのように、
Cells(1, 6).Value = Cells(1, 4).Valueの代入で、
プログラミングしております。皆様ありがとうございます。
コピペはもう必要ないのですが、
初め、CopyメソッドとPasteSpecialメソッドが必要と考えていたので、
この使い方もできれば習得したいと思いまして。。。
0414デフォルトの名無しさん
2011/04/05(火) 00:30:23.15Application.CutCopyMode = False
0415387
2011/04/05(火) 00:36:20.38おお、ありがとうございます。
ヘルプで調べればよいのですが、
VBEのヘルプがなぜか
このページはご利用いただけません
お探しのページはご利用いただけません。以下のことを試してみてください。
ツールバーの [更新] をクリックする
ツールバーの [戻る] をクリックした後、目的のページへのリンクをもう一度クリックする
コンピュータに保存されたオフラインのコンテンツを表示する
となってしまい、調べられないのです。
ううう。なぜだ?
0416387
2011/04/05(火) 00:43:38.46http://www.trickpalace.net/windows/tips/excel.open.window.htm
により、エクセルを多重起動に設定したのが
もしかしていけなかったのか?
0417デフォルトの名無しさん
2011/04/05(火) 07:03:42.39そうとう知能の低いクソ虫だな
その画面から「オフラインのコンテンツ」で調べるんだよ
あと2chで書き込む前に一度ググれ
例えば「vba ヘルプ オフライン」とか入力して検索してみろ
お前の知能ではVBAは向いてないから以後は関わらないしろ
0418デフォルトの名無しさん
2011/04/05(火) 07:10:56.44一つずつ下げるのを繰り返したいのですがエラー(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
☆のところでエラーになります。
0419デフォルトの名無しさん
2011/04/05(火) 07:39:47.18☆以前に
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
0420デフォルトの名無しさん
2011/04/05(火) 07:44:02.640421デフォルトの名無しさん
2011/04/05(火) 07:55:14.89d = Val(InputBox("抽出する日数を入力してください", "日数"))
If d = 0 Then Exit Sub
シートのセルが結合されてない?
0422デフォルトの名無しさん
2011/04/05(火) 07:58:03.67それだけだとInputBoxに数値以外の物を入力した時にエラーで止まる
0423デフォルトの名無しさん
2011/04/05(火) 08:11:56.65Dim i,d As Integer
でIntegerになるのはdだけだぞ
0424418
2011/04/05(火) 08:19:28.82ご指摘ありがとうございます。
また、夜試してみます。
>>421
セルは結合してないです。
そんなやり方もあるんですね。勉強になります!
0425デフォルトの名無しさん
2011/04/05(火) 09:00:11.06それは419の回答の問題ではなく、418に最初からある問題だから、419に言うのは筋違いかと。
0426デフォルトの名無しさん
2011/04/05(火) 10:12:24.280427デフォルトの名無しさん
2011/04/05(火) 10:17:16.65iがval型なのはあるが、dがval型なのは見あたらないんだが
0428デフォルトの名無しさん
2011/04/05(火) 12:33:36.35dがintだな
自動初期化だとdに0が入るから、if文はスルーされる
セル(2,0)が参照されたエラーだな
0429デフォルトの名無しさん
2011/04/05(火) 12:49:23.140430デフォルトの名無しさん
2011/04/05(火) 13:33:13.16Else: 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を使おうとおもったけど、うまくいきませんでした。
0431デフォルトの名無しさん
2011/04/05(火) 13:39:25.56疑似コントロール配列を使う
or
Controlsコレクションを使う
0432デフォルトの名無しさん
2011/04/05(火) 14:42:23.50///
>>430
1.コントロール情報を配列に格納して回す
2.判定と処理が複数回あるなら別コードに書いて呼び出す
3.全部のコントロールを対象にして後で修正しないならfor〜each使う
0433デフォルトの名無しさん
2011/04/05(火) 14:49:46.73が
Else: txt_金額.Value = ""
の間違いでない限り、まとめるのは無理
あと、False〜ThenじゃなくてTrue〜Elseになってるのが気持ち悪い
Elseのあと改行せずに : を書いてるのが気になる
いちいち= Trueを書くのも無駄っぽい
0434デフォルトの名無しさん
2011/04/05(火) 14:59:37.65> が
> Else: txt_金額.Value = ""
> の間違いでない限り、まとめるのは無理
無理じゃないよ
VB6のコントロール配列だと、コントロール種は揃えなきゃならないけど
VB6だろうとVBAだろうと、クラスとコレクションで作る疑似コントロール配列なら
コントロール種が揃ってなくてもまとめることは可能
0435デフォルトの名無しさん
2011/04/05(火) 15:38:17.73>>426とか>>428とか>>433とか
0436デフォルトの名無しさん
2011/04/05(火) 15:38:27.81見やすさを考慮するとどういった
記述になるでしょうか?
0437デフォルトの名無しさん
2011/04/05(火) 16:37:31.93遅れてるなあ超流行ってるよ知らないの?
0438デフォルトの名無しさん
2011/04/05(火) 16:43:22.490439デフォルトの名無しさん
2011/04/05(火) 16:56:21.71どれの恥ずかしさを晒して欲しいの?
恥ずかしい回答、いっぱいあるのでw
0440デフォルトの名無しさん
2011/04/05(火) 17:13:06.270441デフォルトの名無しさん
2011/04/05(火) 19:13:40.86VBAでINDIRECT関数を使うにはどうしたらいいですか?
0442デフォルトの名無しさん
2011/04/05(火) 19:39:13.70Range(Range("A1").Value).Value = "hage"
0443デフォルトの名無しさん
2011/04/05(火) 19:57:08.90ありがとうございます
0444デフォルトの名無しさん
2011/04/05(火) 20:08:33.05それぞれ対応するテキストボックスの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
以上のように、ひとつずつユーザーフォームのプロシージャに
記述するしかないのでしょうか?
0445デフォルトの名無しさん
2011/04/05(火) 20:22:24.180446デフォルトの名無しさん
2011/04/05(火) 21:03:32.72さっきの3つは何処が恥ずかしいか晒されてるだろ
0447デフォルトの名無しさん
2011/04/05(火) 21:35:00.21どうするのでしょうか?
0448デフォルトの名無しさん
2011/04/05(火) 21:40:30.55少し前に似た話と>>444にも使える解決策が出てるからログ嫁
0449デフォルトの名無しさん
2011/04/05(火) 22:09:00.79どこにだろう
0450418
2011/04/05(火) 22:35:10.96ActiveSheet.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
と不要な列の内容を削除するコードは正常に動いています。
どこがいけないのでしょうか??
0451デフォルトの名無しさん
2011/04/05(火) 22:36:16.98今大流行の的外れで恥ずかしい回答の実践見せてやってんだよそんくらい判れよ
0452デフォルトの名無しさん
2011/04/05(火) 22:57:19.31釣りかもしれんけどあえて エスパーしてみる
そのコードはシートモジュールに書いてない?
例えば
Sheet1のシートモジュールにコードを書いていて
Sheet2をActiveにした状態でそのコードを実行してるとか?
0453デフォルトの名無しさん
2011/04/05(火) 23:00:42.51いまひとつ何がしたいか分からないけど、
私の環境ではInputBoxで「10」を入力した場合、
Range(D2:J2)が最初に選択されて
Range(D12:J12)まで一行ずつずれていく動作になっているよ
0454デフォルトの名無しさん
2011/04/05(火) 23:06:21.43こんな感じになってる?
あと考えられるのは、少し前の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
0455デフォルトの名無しさん
2011/04/05(火) 23:07:18.83ActiveSheet.Range(Cells(2, 4), Cells(2, 10)).Select
が1004エラーになるというのは、
コード以外の問題じゃないのか?
イミディエイトウィンドウに書いても実行できないの?
0456デフォルトの名無しさん
2011/04/05(火) 23:09:35.15その通りでした。
標準モジュールに記述し直したら動きました。
For i = r To 10
ActiveSheet.Columns(i).ClearContents
Next
↑の部分が正常に動いていたので見落としていました。
勉強不足を痛感します。
ありがとうございました。
0457デフォルトの名無しさん
2011/04/05(火) 23:24:46.02書き込む前にリロードしていませんでした。
標準モジュールに記述したら、無事動きました。
dでセル範囲を指定して、iで下方向に検索しようと思い
前段階として、セルの選択ができるか試したかったのです。
レス下さった皆さんありがとうございました。
0458452
2011/04/05(火) 23:39:31.48余計なお世話かもしれないけれど
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
とかならシートモジュールでも問題なかったハズ
0459デフォルトの名無しさん
2011/04/05(火) 23:44:18.40クラスモジュール使ったらできたよ
でも、3組程度の個数で、enabled の切り替え程度の単純な処理内容なら、
>>444のコードのようにひとつずつ記述したほうがいいように思う
0460デフォルトの名無しさん
2011/04/06(水) 00:12:20.49なるほど。ありがとうございます。
今後の参考にさせていただきます。
0461デフォルトの名無しさん
2011/04/06(水) 15:58:02.08応用して曲線移動させることは可能ですか? Excel2003です。
0462デフォルトの名無しさん
2011/04/06(水) 16:10:10.300463デフォルトの名無しさん
2011/04/06(水) 17:13:21.68どうやるか教えてほしいんですが…
もしかして直線で細かくつなぐとか?
0464デフォルトの名無しさん
2011/04/06(水) 19:59:25.660465デフォルトの名無しさん
2011/04/06(水) 20:13:00.650466デフォルトの名無しさん
2011/04/07(木) 00:14:23.73入力用ユーザーフォームの実際の処理は
標準モジュールに記述するものなんですか?
それと、標準モジュールはいくつかつくって、
処理内容ごとにわけたりしますか¥?
プロシージャが増えるほど視認性が悪くなってきたもので。
0467デフォルトの名無しさん
2011/04/07(木) 00:40:06.57プログラミングの作法は宗教みたいなもんで統一されてないし、
VBAにはとくにガイドラインもなかったと思う
0468デフォルトの名無しさん
2011/04/07(木) 00:52:27.55ピュアオーディオ宗教みたいな感じですか。
自分が見やすかったり、使いやすければ
とくに問題なし、いったところのようですね。
僕は
dim aaa , bbb , ccc as integer
や
aaa = 1 : ccc = 3
bbb = 2 ddd = 4
とかまとめたくなってしまいます。
0469デフォルトの名無しさん
2011/04/07(木) 00:53:04.14コロンが抜けてました・・・
0470デフォルトの名無しさん
2011/04/07(木) 01:27:37.25dim aaa , bbb , ccc as integer
ってやっちゃうのがある
上でも言われてるけど、それでintegerになるのcccだけだから
0471デフォルトの名無しさん
2011/04/07(木) 07:35:23.63ややこしいんだよな。
0472デフォルトの名無しさん
2011/04/07(木) 08:13:38.60今後はともかく現状ではExcelVBAにVB6準拠のとVB.NET準拠のがあるわけではなく
全てVB6準拠で統一されているんだから
0473デフォルトの名無しさん
2011/04/07(木) 23:04:05.17タグで解析するにはどうすればいい?
例えば10個目のtdタグ内容をinnertextで
抜きだすとか
0474デフォルトの名無しさん
2011/04/07(木) 23:16:40.61ビジネスロジック部分はクラスにして管理って感じかねぇ
モジュールに入れるのは汎用関数ぐらいにして
VBAでもそういう意識を持てば、独学でも業務で通用するセンスを磨けるよ
0475デフォルトの名無しさん
2011/04/07(木) 23:19:37.75.NET環境使わないのはもったいない
0476デフォルトの名無しさん
2011/04/08(金) 00:24:35.68言語仕様を大幅に変えようとすると大混乱が起こるだろうな
0477デフォルトの名無しさん
2011/04/08(金) 12:58:01.96下のようにするとUserForm1.TextBox.Textの文字列がSheet2のセルに入ってしまいます。
For i = 3 To 34
Sheet2.Cells(MAXROW, i) = "UserForm1.TextBox" & i - 2 & ".Text"
Next
うまくテキストボックスの中の値をセルに入れる方法はありませんでしょうか?
0478デフォルトの名無しさん
2011/04/08(金) 13:08:28.93Controls
0479デフォルトの名無しさん
2011/04/08(金) 13:24:53.74ありがとうございます!助かりました。
0480デフォルトの名無しさん
2011/04/08(金) 17:02:29.82A 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です。
0481デフォルトの名無しさん
2011/04/08(金) 17:54:49.93Dim 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
邪魔くさいんで解説はしない
正常に動いてないようならお前の説明が悪い
0482480
2011/04/08(金) 19:15:02.31ありがとうございます
0483デフォルトの名無しさん
2011/04/08(金) 22:42:30.450484デフォルトの名無しさん
2011/04/08(金) 22:56:57.43コード出しておけば、コード読めないバカでもとりあえずコピペで動き、大人しく帰ってくれるから
0485デフォルトの名無しさん
2011/04/08(金) 23:00:24.84楽だからだろ
考え方はお前が教えてやれよ
0486デフォルトの名無しさん
2011/04/09(土) 00:37:04.26Sub 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
0487デフォルトの名無しさん
2011/04/09(土) 00:52:15.12激しくスレ違い>>3★3,4
0488デフォルトの名無しさん
2011/04/09(土) 00:59:53.950489デフォルトの名無しさん
2011/04/09(土) 01:26:44.86エクセルオブジェクトを操作するのがExcelVBAであって
アクセスのそれはスレ違い
逆にアクセスのVBAでエクセルオブジェクトを読んで操作する話なら
ここで質問して良し
0490デフォルトの名無しさん
2011/04/09(土) 02:44:50.120491デフォルトの名無しさん
2011/04/09(土) 03:49:17.000492デフォルトの名無しさん
2011/04/09(土) 10:46:41.61お前は俺か?w
俺も常々そう思ってるが、この程度ならコードだけでもしょうがねーなぁ。
IsNumericよりVarType使ったほうがいいと思うが。
0493デフォルトの名無しさん
2011/04/09(土) 11:13:40.96右寄せにしてたら区別が付かない
0494デフォルトの名無しさん
2011/04/09(土) 11:34:47.37IsNumericは「数値に変換できるものなら」だから"1D1"とかでもTrueになる。
0495デフォルトの名無しさん
2011/04/09(土) 11:38:57.68ここはそれらとは違う、何の利害関係にもない赤の他人同士だってことを忘れてないか?
それ解っている上で>>483を『行動として示す(補足説明を行う)』なら単なるお人好しだが
口先でちょっかい出すだけだと、単なるバカってことにしかならないねw
0496デフォルトの名無しさん
2011/04/09(土) 11:47:07.19不特定多数が使うことを想定して作るなら、どちらを使うにしても落とし穴への例外処理が必要
自分だけが使うなら、想定さてる値と落とし穴が被らない方を使えば良し
どちらの場合でも、「普通は〜」なんて一概に言う奴は考えが浅い
0497デフォルトの名無しさん
2011/04/09(土) 11:58:33.650498デフォルトの名無しさん
2011/04/09(土) 12:00:11.86数字を全角で入れたり「1500*1.05」みたいに計算式を入れたり
スペースいっぱい入れて消したつもりになってたり(表示されない部分にデータが残ってる)
ゼロとオーを間違えたり3桁ごとのコンマを手打ちで入れたり
あらゆるケースを想定してたらコードをどんだけ書いても足りないぜ
0499デフォルトの名無しさん
2011/04/09(土) 12:01:42.76わかってて書いてるっぽいし。
俺は説明するのに1行ごとにコメント書くやつ見ると頭どつきたくなるわ。
よいコードはコメントは最小限でもわかる。
0500デフォルトの名無しさん
2011/04/09(土) 12:02:26.930501デフォルトの名無しさん
2011/04/09(土) 12:05:11.19普段は抜けだらけのコード書いてるのは想像できる。
0502デフォルトの名無しさん
2011/04/09(土) 12:08:26.18それは言えてるが、こういう掲示板での回答じゃgdgd長いコードは書いちゃいかんよな。
0503デフォルトの名無しさん
2011/04/09(土) 12:11:03.54ほら、なんたら犬の遠吠えとかなんとか
0504デフォルトの名無しさん
2011/04/09(土) 12:14:24.30よっ!大統領w
0505デフォルトの名無しさん
2011/04/09(土) 12:19:12.340506デフォルトの名無しさん
2011/04/09(土) 12:23:09.02あんまり相手にするな。
0507デフォルトの名無しさん
2011/04/09(土) 12:31:39.000508デフォルトの名無しさん
2011/04/09(土) 12:44:18.810510デフォルトの名無しさん
2011/04/09(土) 13:48:32.52そういうのはデータチェック用のモジュールを1個作っといて使い回せばいいんだよ
何かあったらどんどん追記してけばいい
怪しいデータや判定不能な物を発見したらメッセージ表示するだけの簡単なやつを
0511デフォルトの名無しさん
2011/04/09(土) 16:19:41.68ldb有る無しで判定
0512デフォルトの名無しさん
2011/04/09(土) 19:48:00.49A.xls B.csv があります。
Bの入力補助としてAを使いたいのですが、
AからBを開いて、
BのセルをダブルクリックするとAのフォームが開く、
という動作は可能でしょうか?
個人用マクロブックを使えば出来そうな気がしますが、
可能なら使わないで処理をしたいと考えています。
0513デフォルトの名無しさん
2011/04/09(土) 20:04:54.61俺はできないと思う
csvファイルはイベントも使えないしマクロも保存できないと思うから。
B.csvがB.xlsならできるだろうが
0514デフォルトの名無しさん
2011/04/09(土) 20:16:16.080515デフォルトの名無しさん
2011/04/09(土) 21:17:06.86やりたい事はこんな事?
フォームを開かせる処理は作ってないけど
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
0516デフォルトの名無しさん
2011/04/09(土) 21:44:55.91フォームよりはコンテキストメニュー拡張しての入力補助だったが
まあVB6でCSV・TSVエディタ自作してからは、わざわざExcel使うことも無くなったけど
0517デフォルトの名無しさん
2011/04/10(日) 16:35:48.88Excel2007 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 オプション> 保存> ファイルの保存形式)
0518デフォルトの名無しさん
2011/04/10(日) 17:29:49.7597-2003形式 FileFormat:=xlExcel8
2007以降 . FileFormat:=xlOpenXMLWorkbook
2007以降マクロ有効 FileFormat:=xlOpenXMLWorkbookMacroEnabled
ちなみにxlOpenXMLWorkbookMacroEnabledは56じゃなくて52だよ
0519デフォルトの名無しさん
2011/04/10(日) 17:55:29.39く、釣り? or 釣りバカ?
そのブログにそのコードの使い道が書いてあったはずだ
や
ろ
う
0520デフォルトの名無しさん
2011/04/10(日) 18:02:35.78こんなに早く回答して頂きまして、ありがとうございます!
97-2003形式、2007以降、2007以降マクロ有効、全てのファイルフォーマットで保存できることを確認しました。
また、56 ではなく、52 である事も教えて頂いて、ありがとうございます。
0521デフォルトの名無しさん
2011/04/10(日) 18:15:53.48やりたいことは
1 母材の縦横サイズを入力
2 部材の縦横サイズと必要数を数種類入力
3 部材毎に縦横回転可否の条件入力
4 最適取り数とレイアウト図を表示
です。
3と4の間で、悩んでます。
ナップザック問題等でも
有名な、難解な問題ですが、
宜しくお願いします。
0522デフォルトの名無しさん
2011/04/10(日) 19:32:08.34クラスに最小サイズのグリッドを規定して、母材サイズBool型の2次元配列を作る
配列をFalseで初期化する
ループ噛まして配列にマッチングさせていく
マッチング処理でFalseの数と生成パターンをメンバー変数に入れる
以下パターンの数だけループさせて、保持してるFalseがメンバー変数より少なかったら、
メンバー変数を更新する
最後に母材配列をプロパティで取り出して終わり
じゃダメか?
0523デフォルトの名無しさん
2011/04/10(日) 21:49:02.38Excelでもいろいろできるが難しそうだな
0524デフォルトの名無しさん
2011/04/11(月) 14:20:09.98スレチながら教えてくだしあ。
時間のかかる処理(そんなに重くないもの)をバックグラウンドで動作させるには、どうしたらよいでしょう?
例えばExcelで、フォームを表示して入力可能にしつつ、
その間にネットワークフォルダの特定のファイルパスを裏で収集して、
順次フォームのリストに追加するような感じです。
0525512
2011/04/11(月) 20:27:46.75>>515さんのコードを基に、目的の物が作れそうです。
ありがとうございました。
その他、レスを頂いた皆さんもありがとうございました。
0526デフォルトの名無しさん
2011/04/11(月) 21:09:36.82今日も色々と探したんですけど
やぱ難しいですね
最適化よりも
部材を順番に
目一杯割り付けていって
残材にも、
順番に目一杯割り付けていく感じなら
どうにかなりますかね?
0527デフォルトの名無しさん
2011/04/11(月) 22:27:50.00え、そうなの?
>>486
ExcelVba的な回答であれば、mdbオープン時にフラグセット
>>524
擬似バックグラウンドなら
メインモジュールで恒常ループを発生させる
時間なり処理に応じて処理を分岐して呼び出す
非同期処理なら外部アプリケーションなりバッチ処理なり
擬似マルチスレッドならモジュール分けて別個非同期で処理汁
VBAでマルチスレッドは原則できない
モジュール内でVBSコードをビルドして独立外部処理を作り上げた上で自分を制御させるとか裏技が必要じゃね
0528デフォルトの名無しさん
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
よろしくお願いします。
0529デフォルトの名無しさん
2011/04/13(水) 13:36:23.38変数使いたい場合はRangeやCells使ってください
0530デフォルトの名無しさん
2011/04/13(水) 14:24:43.11そうでしたか、残念です。ありがとうございました
0532デフォルトの名無しさん
2011/04/13(水) 18:47:05.010533デフォルトの名無しさん
2011/04/13(水) 20:29:02.790534デフォルトの名無しさん
2011/04/13(水) 20:46:51.470535デフォルトの名無しさん
2011/04/14(木) 19:29:32.08メールの形式はリッチテキストです。
http://www.red.oit-net.jp/tatsuya/vb/Outlook.htm
ここに書かれているような内容でメールを作っているのですが、
↓のように添付ファイルを文中に入れたいのですが、
Attachments.Addすると添付ファイルが本文の最後に挿入されてしまいます。
どうしたら文中に添付ファイルを挿入出来るでしょうか?
■メール本文
---------------------------------------------
hogehoge
【添付ファイル】
piyopiyo
---------------------------------------------
0536デフォルトの名無しさん
2011/04/14(木) 20:26:34.740537526
2011/04/15(金) 06:18:32.76長方形詰め込み問題としても
有名な難解問題だけど
誰かヒントを下さい
0538デフォルトの名無しさん
2011/04/15(金) 07:45:12.840539デフォルトの名無しさん
2011/04/15(金) 11:54:11.68エクセルが起動している間、前回フォームで設定した値を保持しておきたいんですが
(次にフォームを開いたときに前回の場所を覚えている。エクセルを終了した場合は初期値に帰る)
やはりstaticな変数などを用意して前回の値を保存するなどの方法をとる必要がありますでしょうか。
楽をできる方法があるようでしたら教えてください。
0540デフォルトの名無しさん
2011/04/15(金) 12:31:07.63一番楽で一番一般的な方法だけど、それに何の問題があるの?
直接コントロールの初期プロパティを書き換える方法もあるけど
遙かに面倒な上に、この場合Excelの終了を跨いで設定が保持されちゃうので
起動か終了時に初期値に戻すコードまで必要になるし
0541デフォルトの名無しさん
2011/04/15(金) 13:44:28.620542デフォルトの名無しさん
2011/04/16(土) 06:33:42.560543デフォルトの名無しさん
2011/04/16(土) 08:35:23.840545デフォルトの名無しさん
2011/04/18(月) 07:50:50.47これまで問題なく動いていたのですが、excel 2007に変えてから途中で止まるようになってしまいました。
ファイルを閉じてもメモリが解放されず、途中でメモリがいっぱい(2G積んでいます)になることが原因のようなのですが、解決策がわかるかたいらっしゃいますか?
0546545
2011/04/18(月) 07:53:07.14ファイルを閉じるたびに、
Set bk=nothing や
Bk. Saved =true
を入れてみても変わりませんでした。(bkは開いたファイルへの参照を示すオブジェクト変数です)
0547デフォルトの名無しさん
2011/04/18(月) 10:16:01.19変えたのはExcelだけ?Windowsは変わってない?
データファイルはExcel形式?テキスト?
0548545
2011/04/18(月) 12:47:25.79レスありがとうございます。
OS はかわらず、XP pro SP 3です。
正常に動いていた時のexcel は2003で、大量に開くファイルも97-2003形式で保存されたexcel ファイルです。
タスクマネージャーで監視しているとファイルを開くたびに、使用メモリが増えていっています。
0549デフォルトの名無しさん
2011/04/18(月) 14:31:58.202007でひたすらオープンとクローズ繰り返してみたけど
メモリ使用量に変化は見られない
オープンクローズのせいじゃなくて、プログラム上どっかに問題があると思うんだが....
ただ前にも同じような話あって、そんときはDoEvents入れたら動いたって
試しにやってみては?
それが再現するミニマムコードあればいいんだけどなぁ
XPはまさか64ビット版じゃないよな?
0550デフォルトの名無しさん
2011/04/18(月) 15:04:03.15それと同じ症状かな?
>>549
同じファイルを何度も開くんじゃなくて、別々のファイルを開かないと症状が出ない可能性もあるし、
開くだけでなくデータを読み込まないとメモリを消費しないのかもしれない
0551デフォルトの名無しさん
2011/04/18(月) 16:08:44.440552デフォルトの名無しさん
2011/04/18(月) 16:09:19.200553デフォルトの名無しさん
2011/04/18(月) 17:50:07.47ttp://www47.atwiki.jp/excelvba/
見やすくしたり丁寧にまとめたりするのは誰かがやってくれるはず
17以前の過去ログいただけるとありがたいです〜
0554545
2011/04/19(火) 00:00:43.87DoEventsを入れてみましたが変わりませんでした。
で、気になって手作業での開く閉じるを、一回ずつ開くファイルを変えて何度も繰り返してみたところ、なんと、やっぱりメモリ使用量が増えていました。
一つ一つのファイルは128KBほどですが、開く時に3MBほど使用量が増えて、閉じた時には1MB しか解放されていません。
これはもうexcel 2007の仕様ということなんでしょうか。
他に同じ現象が出る方いませんか?
0555デフォルトの名無しさん
2011/04/19(火) 00:13:30.73どっかでWorkbookオブジェクトその他が暗黙的に生成されて開かれてるとか、
それがきちんとNothingにされてない(というかできない)んじゃないの?
0556デフォルトの名無しさん
2011/04/19(火) 03:22:18.68Windowsの仕様として、空いたメモリがすぐには解放されないってのがある
普通は15秒ぐらいの時間差で解放されていく
ファイルを閉じたあと、しばらく見てるとどう?
0557デフォルトの名無しさん
2011/04/19(火) 03:33:24.10すくなくともうちの環境では問題ない
手作業ってのは普通にエクセルファイルのダブルクリックか?
どうもエクセル以外に問題がある気がする
とりあえずディスプレイのドライバー最新にしてみるとか
ディスクトップ検索周り停止してみるとかしてみたら?
0558デフォルトの名無しさん
2011/04/19(火) 13:55:33.250559デフォルトの名無しさん
2011/04/19(火) 14:33:52.89A1 = RSS|’N225’!現在値
A2 = ユーザー関数(パラメータ)
ワークシート内のセルから ユーザー関数を呼び出して使っています。
楽天RSSでRSS受信が発生するたびに、A2の再計算がおこなわれてしまいます。
一つだけなら問題ありませんが、実際は数百箇所もあり、再計算に3秒ほどかかっています。
ツールメニューから再計算を手動にすると、A1のRSS受信も止まってしまいます。
RSS受信しながら、ユーザー関数の再計算を止める都合のいい方法はないでしょうか?
お知恵を貸してください
0560デフォルトの名無しさん
2011/04/19(火) 15:28:13.420561デフォルトの名無しさん
2011/04/19(火) 21:43:01.48ADOでsqlなげるのはどう?オープンしなくてもデータもってこれなかったっけ?
0562デフォルトの名無しさん
2011/04/20(水) 19:18:17.55それにExcelデータファイルをひらいてADOを使うとメモリリークが発生する
ActiveX データ オブジェクト (ADO) を使用して、開いている Excel ワークシートを照会するときメモリ リークに発生します
ttp://support.microsoft.com/kb/319998/ja
05631/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
05642/2
2011/04/21(木) 12:39:20.58Const 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
0565デフォルトの名無しさん
2011/04/21(木) 14:03:57.69どちらも二重ロードはしてないよ
但し、>>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のコードで
ユーザーフォームを変数に格納出来てるし、二重ロードにもなってないので問題なし
0566デフォルトの名無しさん
2011/04/21(木) 15:01:46.85変数読み込みでもアンロード漏れでもなく
イニシャライズするときに別モジュールに制御を渡して、そこからフォームを参照してた
フォームをロードする前に再度メモリに読み込みかけるから、結果二重になったみたい
でも単純にフォームを開いた時、ロードされるのは一個だな
vba.add()で開いた時には二重ロードしとる
05671/2
2011/04/21(木) 20:34:09.35ワークシートのデータを固定長のテキストファイルで出力したいと考えています。
で、実行結果がこうなっていて、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
05682/2
2011/04/21(木) 20:36:20.24"00001 12だだ "
"00002 ああああ "
"00003 ぐぐ2 "
"00004 tst "
"00005 hhhhhhh "
0569デフォルトの名無しさん
2011/04/21(木) 21:21:43.57>>3★3,4
0570デフォルトの名無しさん
2011/04/21(木) 21:33:04.040571デフォルトの名無しさん
2011/04/21(木) 21:33:18.670573デフォルトの名無しさん
2011/04/22(金) 00:47:49.02うまく行かなかったら、どこでうまく行かないのかを
探すようにしてください。
今回なら
strRecが思い通りの固定長の文字列になっているかどうか
0574てすと
2011/04/22(金) 19:01:14.260575てすと
2011/04/22(金) 19:03:21.590576デフォルトの名無しさん
2011/04/22(金) 19:29:53.97環境はエクセル2000です。
ActiveSheet.ChartObjects.Add(10, 20, 250, 120)
chartObj.Chart.SetSourceData ActiveSheet.Range("B2:B6")
0577デフォルトの名無しさん
2011/04/22(金) 22:44:55.95過去スレ、現行スレ見ても全く理解できませんでした
0578デフォルトの名無しさん
2011/04/22(金) 22:56:05.760579デフォルトの名無しさん
2011/04/22(金) 23:34:40.33こうじゃない?
Dim chartObj As ChartObject
Set chartObj = ActiveSheet.ChartObjects.Add(10, 20, 250, 120)
chartObj.Chart.SetSourceData ActiveSheet.Range("B2:B6")
0580デフォルトの名無しさん
2011/04/22(金) 23:36:24.77そろそろ初心者に戻るのか
0581デフォルトの名無しさん
2011/04/23(土) 15:30:00.87グループ化されたものも含め、Shapesのテキスト一覧取得マクロを作っています。
問題のエクセルはここからDLできます。
http://www1.axfc.net/uploader/Sc/
Sc_227075.xls
シート1 だと全て取得できますが、シート2だと一部のテキスト(FFF と FFF2)が
取得できません。
ちなみに、EEE と書いてあるシエイプを削除するとうまくいきます。
原因や解決方法がわかったら教えてください。
0582デフォルトの名無しさん
2011/04/23(土) 17:02:06.47その方法でも出来ませんでした
元のデータが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
0583デフォルトの名無しさん
2011/04/23(土) 17:27:59.16グループ化してるシェイプに対してループが回ってないようだから、
グループ化されてるシェイプを判定したら再帰処理するように書き換えたら
あとは処理しきったらExit ForなりGotoなりでループ抜けりゃいいよ
0584デフォルトの名無しさん
2011/04/24(日) 09:48:33.13http://www.moug.net/faq/viewtopic.php?t=56305
上記のやり方でほぼ出来たのですが、
一点、BodyFormatプロパティにリッチテキスト形式を指定してメール作成した際、
フォントの色を設定したいのですが方法が分かりません。
↓を見ても、それらしいものが分かりませんでした。
http://msdn.microsoft.com/en-us/library/bb176688%28v=office.12%29.aspx
0585584
2011/04/24(日) 09:51:57.80↓これだとhtmlで書いた書式が失われ、
HTMLBody = ""
BodyFormat = olFormatRichText
↓これだとリッチテキストではなくHTML形式に勝手に変更されてしまい駄目でした。
BodyFormat = olFormatRichText
HTMLBody = ""
0586デフォルトの名無しさん
2011/04/25(月) 17:55:28.31下記の�@で '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
0587デフォルトの名無しさん
2011/04/25(月) 18:00:06.67IsMissing(v)が真となるVariantの即値または組み込み定数はありますか?
この値を返す関数を作るのは簡単ですが、残念ながら関数の返値を用いて
定数を定義することはできないみたいですね。
0588586つづき
2011/04/25(月) 18:19:31.22Dim 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
0589デフォルトの名無しさん
2011/04/25(月) 18:31:22.070590デフォルトの名無しさん
2011/04/25(月) 19:04:20.51XP+Excel2003(もちろん日本語版)で試したけど正常に動いた
シート名に日本語使ってる?
0591586
2011/04/25(月) 19:22:06.05シート名英字でした
動きますか。。。(E)はだめです。
なにか言い換え、迂回策はないでしょうか?
0592デフォルトの名無しさん
2011/04/25(月) 22:01:12.90excel2003で作成したvbaプログラムをWin7×excel2010の互換モードで動作させてますが、
元シートから新シートへ書式コピー後、新シートの一部の行の高さや行番号の表示がおかしいです。
具体的には一部の行が
「行高さを409ピクセルまで広げたら縦真ん中に行番号と値がある」状態です。つまり動作直後の表示では行番号と値がまるきし見えないのです。(表示は意図した行高さのため)
互換モードを解除すると問題なく動作します。
また、複数のブックに見られたので同じ条件で発生するのかと思いきやそれぞれ微妙に違う条件で発生し、
上記条件を取っ払ってみたんですが発生します。新シートへコピー後、一度でも保存したり行番号が見えなくなっている行を手動で「高さを自動調整」すると高さが正常に戻ります。
コピー直後のセルのROWHEGHTは意図した通りで正常です
これは互換モードの不具合なのでしょうか。
自分はvba初心者なんですが、互換モードにはよくあることなんでしょうか
0593デフォルトの名無しさん
2011/04/25(月) 22:42:31.74検索した感じだとここらへんか
http://park.geocities.jp/tryvba/excel2007question.html
コード晒せないならなんとも言えん。
0594デフォルトの名無しさん
2011/04/25(月) 23:15:26.53ありがとうございます!助かります〜でもこのサイトのコードにはひっかかりませんでした。
「元シートをセレクトして範囲をコピー後、新シートに貼り付け」している数行で起こっていることです。
コードは出せませんがマクロで出力されるようなコードです。(もちろん一部分のことです)
効率が悪いと思い一行に書き直しても現象は変わらずでした。
私的には行を表示させるための自動計算が互換モードのある条件の時にすっぱ抜けているようにしか見えません。(が、発生条件に照らし合わせるとコピー範囲の大きさやデータサイズの関係がある?行高さの計算関数内で値が落ちてる?気もします)
とりあえず暫定対処方法は見つけたのですが、
悔しいですね…
互換モードは止めたほうがいいほどToo BUGGYなんでしょうか?
0595デフォルトの名無しさん
2011/04/26(火) 03:50:18.36勉強し直します。
0597デフォルトの名無しさん
2011/04/26(火) 23:48:41.13COBOLみたいな感じで長く細く続くんですかね。
顧客にはエクセルで済ませたら安そうだからみたいな人が多いように感じました。うちの庶務でもいじれるみたいな。
0598デフォルトの名無しさん
2011/04/27(水) 08:06:04.03敷居が低いのがひとつの特徴だからね。
マの人にとっては大変な言語だよね。予算と期限的な意味で。
庶務レベルでもいじれるのと製品レベルで仕上げるのはまったく違うのにね。。。
0599デフォルトの名無しさん
2011/04/27(水) 08:14:17.11関数等を駆使して「こんなことVBA使わないでできるの!?」
みたいなのも見かけるがね。
クエリとマクロで組み上げた巨大なmdbをシステム化してくれとか
0600デフォルトの名無しさん
2011/04/27(水) 08:30:10.040601デフォルトの名無しさん
2011/04/27(水) 12:39:44.11本当に優秀なマはあとでメンテしやすいようにモジュール化をきちんとやって
コメントもしっかり入れて、ドキュメントやヘルプまで残すもんだ
使う言語がどうとか処理効率とかミリ秒の違いばっかり気にしてるうちはまだヒヨッコ
0602デフォルトの名無しさん
2011/04/27(水) 12:57:41.75ようは美しいかどうかだ。
汚いのものは総じて遅いから問題なだけ。
0603デフォルトの名無しさん
2011/04/27(水) 13:16:47.240604デフォルトの名無しさん
2011/04/27(水) 13:21:55.95VBAの時点で処理効率考えるのは無意味
0605デフォルトの名無しさん
2011/04/27(水) 13:25:20.40プロでもそこらへんにゴロゴロしてる。
0606デフォルトの名無しさん
2011/04/27(水) 13:29:59.48一般的に汚いってのは、インデントグgchgch、Select多用、行番号使いすぎ
その他どんなのがあるの?
0607デフォルトの名無しさん
2011/04/27(水) 13:37:22.77行番号使いすぎってなんだ?
俺が入れるとしたらコメント多杉だな。
0608デフォルトの名無しさん
2011/04/27(水) 14:03:30.37与えられた条件で仕事をこなすのがプロ
0609デフォルトの名無しさん
2011/04/27(水) 14:09:51.77読みやすく書くには一定の法則を守り、それが首尾一貫しているかどうかで、訓練すれば誰でも出来ること
インデントがどうのってのはこっちの話
美しく書くには才能やセンスが必要
0610デフォルトの名無しさん
2011/04/27(水) 14:11:46.59コメントを変えると挙動はどう変わるんだろう・・・・・w
0611デフォルトの名無しさん
2011/04/27(水) 14:16:49.88VBAのコメントには意味が無いというのが定説
0612デフォルトの名無しさん
2011/04/27(水) 14:23:10.08プログラムの性能ってのは計算速度だけじゃなくて、仕様変更や拡張が柔軟にできるかどうかってのも重要な要素
それにはコメントは必要不可欠
つまりコメントの書かれてないコードはプロにとっては「性能が悪い」物になる
0613デフォルトの名無しさん
2011/04/27(水) 14:30:07.94VBAは、ダメ言語
0614デフォルトの名無しさん
2011/04/27(水) 14:33:12.06ダメ言語をダメだダメだと糾弾するだけで上手く使えない奴は
良い言語使わせたところで、どうせ並以下のことしか出来やしない件w
0615デフォルトの名無しさん
2011/04/27(水) 14:38:46.84こっちは選べないんだよ
それともなんだ?いちいちコンパイラを自腹を切って買うのか?
業務用だと値段も高いから大変世界だぞ
0616デフォルトの名無しさん
2011/04/27(水) 15:36:29.93狭義のプログラムとしては価値がないが、広義のプロジェクトを延命させリフレッシュさせるための有用なコード
書く人間がどこを意識するかで意味が異なるから一概に何が正しいとかはないが、他人に引き継ぐならコメントなり説明なりコーディングルールなりはあるといいな
0617デフォルトの名無しさん
2011/04/27(水) 17:40:04.88不一致クエリーなんてアルゴリズム知らなくても使えるし。
0618デフォルトの名無しさん
2011/04/27(水) 20:20:19.60ちゃんとクラスモジュール使ってきちんと書けば、.NETに近いシンプルな記述が出来る
インターフェース継承ができるから、大概のことは実現できる
センスが欠如してるのを、言語のせいにするやつってのは例外なくカスだ
0619デフォルトの名無しさん
2011/04/27(水) 20:26:08.23デリゲート使えないからイベントも作れないし
そこは見て見ぬふりだ
0620デフォルトの名無しさん
2011/04/27(水) 21:05:10.34モジュールわけや定数名、オブジェクト名が直感的に理解できるつくりだと思っています。
本当に直感的に理解できるプログラムはコメントはいらない、コメントがいらないようなコードを書きなさいとばっちゃに言われました
0621デフォルトの名無しさん
2011/04/27(水) 21:12:14.13コメントを全否定はしないが、すべてにコメントつけるやつはなんだかなぁと思う。
i = i + 1にまでコメントついてるの見たときはあきれたよ。
0622デフォルトの名無しさん
2011/04/27(水) 21:18:16.18は殆ど本人の独りよがりで、他人には直感的に理解できない件w
つーか、>>620-621なんで別人のフリしてるの?
0623デフォルトの名無しさん
2011/04/27(水) 21:20:13.28いつものことだが。
0624デフォルトの名無しさん
2011/04/27(水) 21:20:47.84コードを直感的に書ける人=センスのある人なのかなと。
コードの統一感だって結局は直感的に理解しやすくなるからってことでしょうし。
0625デフォルトの名無しさん
2011/04/27(水) 21:21:50.74アホの世迷い言にしか聞こえないわ
本人だけ理解しているオナニーを改めて、ちゃんと世間並みのコーディング
規約を調べて、自ら定めたそれに従えって
0626デフォルトの名無しさん
2011/04/27(水) 21:27:03.48スルーするとこだけど、なんでそんなに直感的って言葉に否定的なのかは知りたい。
0627デフォルトの名無しさん
2011/04/27(水) 21:28:10.980628デフォルトの名無しさん
2011/04/27(水) 21:32:22.90大きなプロジェクトは大抵コーディングもクラス設計にもきちんとした規約を作るし、もちろん従うよ。
そのせいもあって業務側で直感的なクラス設計が出来なくなるパターンもあるけど…
0629デフォルトの名無しさん
2011/04/27(水) 21:35:01.020630デフォルトの名無しさん
2011/04/27(水) 21:41:30.04いや、他言語をやってたのでそれはよくわかってる。
逆にVBAは全然私は詳しくないんだが、VBAには無理ってことなの?
それならまあ…いやそれでも関数くらいなら関数宣言時のコメントあれば行コメントいらんべさ
0631デフォルトの名無しさん
2011/04/27(水) 21:42:55.640632デフォルトの名無しさん
2011/04/28(木) 09:26:08.97VBAに関してはちょっとあれだったが、C言語とかではお世話になった。
VBAのできからして別人かも知れないけど。
0633デフォルトの名無しさん
2011/04/28(木) 09:54:35.32誰のこと?
0634デフォルトの名無しさん
2011/04/28(木) 11:10:28.63CSHARPで作ったら規約違反だから使えないとかね
その点VBAは「これエクセルですから」って言えるし、社員自身の拡張メンテ自由度が高い
まあ簡易なプロジェクトメインだが
0635デフォルトの名無しさん
2011/04/28(木) 12:12:38.76せいぜい「事務仕事がちょっと楽になる」程度にしとかないと、あとが大変だぞ
コンパイラの利用を認めさせるか、素人で非効率なことやってないでプロに外注
0636デフォルトの名無しさん
2011/04/28(木) 13:12:45.36ごく稀というほどでもなく存在するぞ
0637デフォルトの名無しさん
2011/04/28(木) 15:23:40.06メソッドが思い出せない。
intersection?
0638デフォルトの名無しさん
2011/04/28(木) 15:37:06.24つーかVBEには自動補完あるんだから>>637まで解ってれば
自力で簡単に正解に行き着きそうなもんだが
0639デフォルトの名無しさん
2011/04/28(木) 16:39:23.600640デフォルトの名無しさん
2011/04/28(木) 22:29:50.50本を出してる人のコード見たら全然別人だったわ。
ちょっとあれなのは本出してる人とは別の人ね。
よかったよ。
0641デフォルトの名無しさん
2011/04/29(金) 19:03:11.36個数や単価、合計を入力するところを
表にしたいのですが、
フレームなんかを使って擬似的にするしかないですか?
フォームのデザインって難しいですね。
0642デフォルトの名無しさん
2011/04/29(金) 19:30:34.08その他のコントロールから
Microsoft Office Spreadsheet コントロールを使うとか
0643デフォルトの名無しさん
2011/04/29(金) 22:34:49.98普通にエクセルのセルじゃダメなの?
0644デフォルトの名無しさん
2011/04/30(土) 03:11:09.21ExcelのフォームにOLEでExcel埋め込めないんだっけ?
以前VB6.0でなら試したことあるけど。
0645デフォルトの名無しさん
2011/04/30(土) 03:33:03.960646デフォルトの名無しさん
2011/04/30(土) 06:38:39.86関数とか使えたっけ?
0648デフォルトの名無しさん
2011/04/30(土) 10:21:40.830649デフォルトの名無しさん
2011/04/30(土) 11:05:51.280650デフォルトの名無しさん
2011/04/30(土) 11:06:01.70[更新プログラム MS11-021 KB2464583」をアンインストールすると処理できるようになりました。更新プログラムのバグ?VBAの仕様変更?情報をお持ちの方がいらっしゃいましたら、教えていただけないでしょうか?
0651デフォルトの名無しさん
2011/04/30(土) 11:16:14.85ttp://www.microsoft.com/japan/technet/security/bulletin/MS11-021.mspx
0652デフォルトの名無しさん
2011/05/01(日) 05:33:06.220653デフォルトの名無しさん
2011/05/01(日) 06:52:41.510654デフォルトの名無しさん
2011/05/01(日) 08:22:42.78というのが昔のBasicだとあったけど絶対関係無いよなw
0655デフォルトの名無しさん
2011/05/01(日) 12:10:14.48どっちにしてもコメントは多すぎると可読性は悪くなる
俺はコメントの多いソースは消してから読むから別に困らないが
0656デフォルトの名無しさん
2011/05/01(日) 12:44:41.35バカっぽいw
つーかプログラミングにおける可読性の評価基準は、コメント以外って定義だから
コメントの量によって可読性が左右されることは無いんだよね
そもそも「コメントが多いと可読性が〜」なんてのは「モニタが小さいと可読性が〜」ってのと
同レベルの話
0657デフォルトの名無しさん
2011/05/01(日) 14:15:34.70食い違ってるってのでもない限り気にならん。
コメント多いと嫌なのは処理の変更後コメント修正
忘れるやつが多いからなんじゃないかな。
0658デフォルトの名無しさん
2011/05/01(日) 16:18:04.83条件がいっぱいあってごちゃごちゃした判定式とか分岐とか、
コメントがあれば丹念にコード読む必要なくなるじゃん
0659デフォルトの名無しさん
2011/05/01(日) 18:18:54.71PGを作る時点で可読性を高めるか処理速度を優先するかにも関わって来るから一概に
言えないんだよねぇ。例えば、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)にしましたと。
まず、どっちの方法を選びますかと言う問題と、コメントはどうしますかと言う問題があるんだよね。
多分人によって回答は違うと思うけど、センスの問題になって来ると思う。
0660デフォルトの名無しさん
2011/05/01(日) 18:38:09.61いろいろ調べてプロパティやlinesなど手を出してみたのですが・・・
どなたかご教授願えないでしょうか?
0661デフォルトの名無しさん
2011/05/01(日) 18:43:37.89テキストボックスから纏めて取って来たデータをVBCrlfでパースすりゃいいんじゃないの?
言ってる意味違う?
0662デフォルトの名無しさん
2011/05/01(日) 18:49:09.07返信ありがとうございます
本当に無知で申し訳ありません、VBCrlfでパースの意味を詳しく教えていただけないでしょうか?
0663デフォルトの名無しさん
2011/05/01(日) 19:02:51.51今手元に環境無いし、あんまりフォーム使ってないから違うかもしんないけど許してね。
Dim sTextValue() As String 'フォームのテキストボックス格納変数
Dim I as Long '欲しい行のデータのインデックス
I = 0
sTextValue = Split(Me.Text1,VbCrlf)
Call MsgBox(sTextValue(I)
Iは欲しい行数を入れてやって、
Me.Text1の値をVbCrlf(キャリッジリターンとラインフィード)で
パース(ぶった切ってやって)
配列変数のsTextValueに突っ込んでやって、
あとは配列から何番目の行のデータを取ってくるかって、
こんな意味で書いたんだけど、違っているかな?
0664デフォルトの名無しさん
2011/05/01(日) 19:04:38.31Call MsgBox(sTextValue(I)
のケツの括弧が無い・・・
ごめん、Call MsgBox(sTextValue(I))ね。
0665デフォルトの名無しさん
2011/05/01(日) 19:27:26.33書いたんだけどCellと違うから、Me.Text1.Textとか
Me.Text1.Valueとかやらんとエラーで落ちるかもしんないね。
明後日Office2010買う予定だから
それまで待っててくれればもっとキチンと答えられると思うけど・・・
0666デフォルトの名無しさん
2011/05/02(月) 09:44:50.29無くもないがなぜにだ
0667デフォルトの名無しさん
2011/05/02(月) 10:16:11.93MsgBoxに限らず、戻り値の無い関数やメソッドはそれを呼び出している事を
明示的に表す為にそう記述する癖が付いている。
0668デフォルトの名無しさん
2011/05/02(月) 11:23:18.74アリだな
0669デフォルトの名無しさん
2011/05/02(月) 12:47:11.94これがまだVBAの話だから組み込みだからとか、自作関数だからとか、
考え的に分けているのかもしれないけど、いずれVB.Netとかをやる様になったら同じ名前を付けてその引数の数や型で見分けて
違うメソッドを実行する場合もあるからね。
組み込みだからとか違うからとか言う区分けはここでの説明には不適切だと思うよ。
0670デフォルトの名無しさん
2011/05/02(月) 14:06:48.55自作関数や自前クラスとかならまぁ意義はあるけど
0671デフォルトの名無しさん
2011/05/02(月) 14:28:11.95そのオーバーロードの事言ってるんだけど
0672デフォルトの名無しさん
2011/05/02(月) 14:37:04.24参考にしまう
自作関数の戻り値を変数に入れる時call使えないから一貫性がなくてもやもやしてたんだ
0673デフォルトの名無しさん
2011/05/02(月) 15:04:34.16今はいらない。互換性のために残されてるだけ
0674デフォルトの名無しさん
2011/05/02(月) 17:49:52.02マウスでクルクルや、スクロールバーをウニウニさせるのが面倒なので
マクロにしてキーボードショートカットにしたいです。
0675デフォルトの名無しさん
2011/05/02(月) 20:20:53.82アクティブなセルが端の場合はどうする?
0677デフォルトの名無しさん
2011/05/02(月) 21:31:03.89つActiveWindow.VisibleRange
マクロのポイントで正確の"Visible/可視"範囲を返す
ttp://support.microsoft.com/kb/149241/ja
0678デフォルトの名無しさん
2011/05/02(月) 21:40:09.16取得する方法がありましたら教えてください。
※別ファイルのEXCELマクロからボタンをSENDMESSAGEで押下したいためです。
0679デフォルトの名無しさん
2011/05/02(月) 21:59:13.08ActiveWindow.ScrollRow = 5
ActiveWindow.ScrollColumn = 5
これでE5が左上に来る
5の数字のところを変数に変えてうまく指定してSelectionChangeと組み合わせる
0680デフォルトの名無しさん
2011/05/02(月) 22:37:16.40こうか?
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
0681デフォルトの名無しさん
2011/05/02(月) 22:44:08.76動かねーぞ
0682デフォルトの名無しさん
2011/05/02(月) 22:59:40.730683デフォルトの名無しさん
2011/05/02(月) 23:02:51.350684デフォルトの名無しさん
2011/05/02(月) 23:20:34.870685デフォルトの名無しさん
2011/05/02(月) 23:39:33.280686デフォルトの名無しさん
2011/05/03(火) 00:04:29.53指定した条件に一致したセルにだけ処理を施すというのはできるんだろうか?
A列を全選択→指定条件に一致するセルがあったらそのセルの背景色を変える、
というのはできたけど、A列と離れてるC列に同じ処理を同時に施すことは
できなかったので。
0687デフォルトの名無しさん
2011/05/03(火) 00:07:38.00条件付けがVBAで拾える範囲なら出来る
セルになんらかのデータがあるとか、法則性があるとか。
セルあるデータに規則性があるなら、VBAでなくて条件付書式使うべきかな
0688デフォルトの名無しさん
2011/05/03(火) 00:09:31.57Union(Columns("A"), Columns("C").select
0689デフォルトの名無しさん
2011/05/03(火) 00:12:43.56訂正
Union(Columns("A"), Columns("C")).Select
0690デフォルトの名無しさん
2011/05/03(火) 00:17:57.89>>689
しねごみくず
0691デフォルトの名無しさん
2011/05/03(火) 00:26:43.79色塗りゃいいってんなら、任意の列に条件付き書式設定しとけばわざわざVBAで
設定する必要もないべさ
0692デフォルトの名無しさん
2011/05/03(火) 00:34:00.08数式で賄え無いならユーザー関数作って補えばいいべさ。
0693デフォルトの名無しさん
2011/05/03(火) 00:46:12.78Boolean型のTrueとFalseをInteger型やLong型に置き換えるとそれぞれ-1と0になるよね。
あれって全てのビットを立たせてある状態と全てのビットを立たせてないと言う状態を表す為に
あんな数値になってるって事で認識合ってる?
0694デフォルトの名無しさん
2011/05/03(火) 00:48:10.81レスありがとう。背景色つけるってのは例みたいなもんだから、
個人的には計算式ぶちこんだりセル結合したりと、もう少し手を加えたいと思ってるんだ。
だから条件付け書式は使えないかもしれない。
VBAかじり始めたばかりなのでunionは使ったことなかった。明日試してみることにするよ。
ありがとう優しい人達。
0695デフォルトの名無しさん
2011/05/03(火) 01:05:06.53それでOK。
昔のBASICでの真偽値の表し方を継承しているとも言えるけど、
結局はそういう目的だったろうし。
0696デフォルトの名無しさん
2011/05/03(火) 01:05:36.56センドメッセージを使うと言う事はAPIを使って他のEXCELファイルのボタン押下処理を実行したいって事?
残念ながらボタンのウィンドウハンドルの捕まえ方は知りません。
代用の方法としてApplication.Runで他ブックのボタン押下時の処理を呼び出してみてはいかが?
0697デフォルトの名無しさん
2011/05/03(火) 01:07:02.89あざーす。これでちょっとモヤってたのがスッキリしました。
0698デフォルトの名無しさん
2011/05/03(火) 01:08:43.26TrueとFalseがVBA内の定数じゃないの?
0699デフォルトの名無しさん
2011/05/03(火) 01:12:50.33そう。だけど中身ひっくり返してみると実はって所の質問だったんですわ。
0700デフォルトの名無しさん
2011/05/03(火) 03:02:01.24返信ありがとうございます。
マクロにパスワードがかかった別EXCELのボタンを押下しようとしています。
0701デフォルトの名無しさん
2011/05/03(火) 03:04:06.37OLEObjectsを使用してボタンをアクティブ後、SendKeysでボタン押下はできたのですが、
何度か試してみるとタイミングにより押下できていない場合がありました。
SendKeysでの押下だと確実性がないため、ウインドウハンドルを取得してSendMessageで押下しようとしています。
0702デフォルトの名無しさん
2011/05/03(火) 04:08:53.890703デフォルトの名無しさん
2011/05/03(火) 05:11:05.71まで出来ていて、なんで>>700のような発言が出るかねぇ?
マクロの表示にパスワードが掛かってようと、ボタンオブジェクトの取得まで出来ているなら
コントロールツールのボタンなら.Nameを調べて「ブック名!シート名.Name_Click」
フォームツールのボタンなら.OnAction調べて「ブック名!OnAction」
これをApplication.Runすれば良いだけじゃん
0704デフォルトの名無しさん
2011/05/03(火) 07:12:15.52自ブックの終了処理イベントで、
自ブックが使用している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
0705デフォルトの名無しさん
2011/05/03(火) 08:12:46.67> 複数開いているファイルに対しても閉じる(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回目の確認メッセージは出ない
0706デフォルトの名無しさん
2011/05/03(火) 12:34:30.27CPU:Athlon64 3500、メモリ:1G
15000行×35列のシート8枚について、それぞれ同一処理を行うマクロを作りました。
しかし、6枚目あたりから処理時間が長くなり、8枚目でリソース不足のメッセージが出ます。
現状でファイルサイズは101MBです。
こういう場合、シート数、データ数を減らす以外でどのようなことをすれば、
リソース不足が発生しなくなるのでしょうか。
0707デフォルトの名無しさん
2011/05/03(火) 12:49:03.92その処理をプロシージャに書いて8回呼び出す
0708デフォルトの名無しさん
2011/05/03(火) 14:31:11.59Rangeでもできる
Range("A:A,C:C,E:E,3:3,O5").Select
Unionが有効なのは変数を使って動的に範囲を指定したいときに楽にできる
0709デフォルトの名無しさん
2011/05/03(火) 17:05:34.65どんな処理を行ってるかによりけり。
今分かってる状況だけで言うとメモリを増設したらとしか言えない。
0710デフォルトの名無しさん
2011/05/03(火) 20:59:35.920711デフォルトの名無しさん
2011/05/03(火) 21:09:27.61http://hpcgi1.nifty.com/kenzo30/b_cbbs/cbbs.cgi?mode=al2&namber=742&rev=&no=0&P=R&KLOG=8
0712デフォルトの名無しさん
2011/05/03(火) 21:13:39.79ありがとう
0713デフォルトの名無しさん
2011/05/03(火) 21:19:55.42isnumeric(゙4E2゙)
isnumber(゙4E2゙)
では結果が異なる
isnumericは文字列で渡されたデータでも数値変換してから判定する
0714デフォルトの名無しさん
2011/05/03(火) 23:14:58.65返信ありがとうございます。
実行後の結果を保存する都合上、オブジェクトを開いてから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" ←見つからないというエラー
0715デフォルトの名無しさん
2011/05/03(火) 23:46:24.22Application.Run xx.Name & "!S1.cmdExecuteA_Click"
Application.Run xx.Name & "!" & sh.Name & ".cmdExecuteA_Click"
Applicationオブジェクトをボタンの置かれているブックやシートのオブジェクトから呼ぶ場合でも
ちゃんとブック名から指定しないとダメだぞ
つーか>>703にも「ブック名!」を付けろって書いてあるのに、なんで勝手に外すんだ?
Runのヘルプにも、一番最初に
> このメソッドの引数では、名前を使用できません。引数には、位置のパスで必ず指定してください。
って書いてあるのに・・・
0716デフォルトの名無しさん
2011/05/04(水) 00:27:43.19返信ありがとうございました。
ブック名付きでエラー出たので、外して検証していたソースを載せてしまいました。
以下で解決しました。ありがとうございます。
「ブック名!シート名.Name_Click」
↓
「ブック名!シートオブジェクト名.Name_Click」
0717デフォルトの名無しさん
2011/05/04(水) 13:53:01.79メッセージとして表示するのはどうしたらできるかな。
たとえばC列を全選択していたとして、メッセージボックスには
「C1:C12」とだけ表示したいんだが。そういうのって無理かな。
0718デフォルトの名無しさん
2011/05/04(水) 15:19:39.08選択した列の1〜12行目ってこと?
ちゃんと日本語で、エスパーじゃない人にも伝わるように書いてよ
0719デフォルトの名無しさん
2011/05/04(水) 15:30:28.54そう。まさにそれ。>選択した列の1〜12行目
717の3行目から読んでもらえたら分かりやすいかも
しれない。
あと攻撃的な文章やめて。傷つくから。
0720デフォルトの名無しさん
2011/05/04(水) 16:18:53.31できるよ
0721デフォルトの名無しさん
2011/05/04(水) 16:41:57.73Dim c as String
c = Split(Activecell.Address,"$")(1)
Msgbox c & "1:" & c & ":12"
0722デフォルトの名無しさん
2011/05/04(水) 17:48:18.56クラス利用側から見るとメンバー変数のように振舞う プロパティという機能を
ご用意しました。
0723デフォルトの名無しさん
2011/05/04(水) 17:57:11.19OFFICE2010買ってきたー!!
>>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, ",")
0724デフォルトの名無しさん
2011/05/04(水) 17:58:15.26'範囲毎にアドレスを変換し、結合して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
0725デフォルトの名無しさん
2011/05/04(水) 18:00:12.66ごめんね。
0726デフォルトの名無しさん
2011/05/04(水) 18:00:56.23こういうやりかたも
MsgBox Intersect(Selection.EntireColumn, Range("1:12")).Address
0727デフォルトの名無しさん
2011/05/04(水) 18:05:28.701行限定
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の段階では確定していない)
0728デフォルトの名無しさん
2011/05/04(水) 18:11:30.55こんな命令あったのか。知らんかったorz
0729デフォルトの名無しさん
2011/05/04(水) 18:17:24.09どこの誤爆かはしらんけど、VBAでもゲッタ、セッタは使えるぞ。
0730デフォルトの名無しさん
2011/05/04(水) 19:28:39.90カス
>>723
>>724
マヌケ
>>727
クズ
0731デフォルトの名無しさん
2011/05/04(水) 19:40:01.12まだまだ精進が足りないな。
0732デフォルトの名無しさん
2011/05/04(水) 23:06:45.62特定の文字が?になってしまいます。
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
0733732
2011/05/04(水) 23:09:28.48聞きようがないな。。
0734デフォルトの名無しさん
2011/05/04(水) 23:10:11.720735デフォルトの名無しさん
2011/05/04(水) 23:13:45.54本当か?
0736732
2011/05/04(水) 23:27:09.62フォントはMSゴシックでした。
<追加で調査>
人名で文字は、小松なんだけど、松が違ってる。
木 へんに 八 と 口 が縦に並んでる文字
IME再変換したら、 しょう と読めるらしい。
んで、UNICODEと書いてありました。。。
0737デフォルトの名無しさん
2011/05/04(水) 23:53:55.98unicodeだとエラーが出るなら
unicodeからシステム既定のコードに変えてから実行
0738デフォルトの名無しさん
2011/05/05(木) 00:14:19.30ひょっとして環境依存文字とか言うオチだったりして
0739デフォルトの名無しさん
2011/05/05(木) 00:26:07.76調べてみたら同じようなことで悩んでた人がいるみたいだった。
http://www.accessclub.jp/bbs2/0069/beginter22056.html
0740デフォルトの名無しさん
2011/05/05(木) 01:02:09.78俺の環境だと何の問題もない
0741デフォルトの名無しさん
2011/05/05(木) 09:45:53.39> 738
> 739
> 740
とりあえず、> 739 さんの教えてくれたサイトの
ユーザ関数入れたら表示されました。
ありがとうございました。
0742sage
2011/05/05(木) 12:16:37.83http://jizen.kuronekoyamato.co.jp/jizen/servlet/crjz.b.NQ0010?id=000000000000
Webクエリで上記URLの「05/05」と「投函完了」という文字列を
引用しようとしたら、
引用できず、
--------------------------------------------------
お問い合わせ伝票番号
※半角数字でご入力下さい。 日付 配達状況
1件目
2件目
3件目
--------------------------------------------------
という文字列のみ 引用できました。
Webクエリをマクロに組み込んで上記の文字列を取り出すマクロを
作成しようと思ったのですが、うまく上記の文字列を取得する
良い方法は無いでしょうか?
0743デフォルトの名無しさん
2011/05/06(金) 11:23:13.98おしえたがりのみなさん、よろしくね!
0744デフォルトの名無しさん
2011/05/06(金) 11:53:21.29俺はどうせVBA使うなら、MSXML2.XMLHTTPとかで処理しちゃうけど
その話はExcelの話ではなくHTTPの話で、スレ違いになっちゃうんだよな>>3★3,4
0745デフォルトの名無しさん
2011/05/06(金) 15:17:48.16Ascで文字コードを取得するとShift-JISになのに
だから
If "亜" < "上" Then
If Asc("亜") < Asc("上") Then
の結果が正反対になる
0746デフォルトの名無しさん
2011/05/06(金) 18:18:43.53手厳しい意見は、もちろんもけっこう。
0747デフォルトの名無しさん
2011/05/06(金) 18:28:31.72自分は、転職希望者である。
そこでだ!もし、VBAプログラマーの求人があったら応募したいと思う。もっとも、VBAプログラマーの求人自体はかなり少ないが。
とりあえず、自分のスペックはこんな感じだ。
31歳四大卒で、VBAプログラミングで高度な販売管理アプリケーションなどが作れる。
しかし、これまでプログラミングの仕事をしたことはなく、もちろんIT企業経験もない。
いわゆる実務経験なしだ。
この状況で、VBAプログラマーへの転職成功の見込みなど、自由な意見を聞きたい。
手厳しい意見は、もちろんけっこう。
よろしくお願い致す!
0748デフォルトの名無しさん
2011/05/06(金) 18:37:29.290749デフォルトの名無しさん
2011/05/06(金) 18:49:49.02独立ならまあわからんでもない
いろいろ書いたが整理めんどいんで他の人にきいてくれ
0750デフォルトの名無しさん
2011/05/06(金) 18:53:18.40ある
0751デフォルトの名無しさん
2011/05/06(金) 19:32:47.53IT業界の経験がないのに高度な販売管理アプリケーションが作れるのか。
そもそも、何をもってして高度と言っているのかが分からない。仕様書とか自分で作れるの?
今からIT業界でやりたいならオブジェクト指向型言語や関数型言語の方が先々困らなくて
済むと思うけど、まず何でVBAを選択しようと思ったのか聞きたい。
0752デフォルトの名無しさん
2011/05/06(金) 19:45:31.70ちなみに俺は同様に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
0753デフォルトの名無しさん
2011/05/06(金) 19:49:56.330754デフォルトの名無しさん
2011/05/06(金) 21:22:42.230755デフォルトの名無しさん
2011/05/06(金) 22:27:26.60IT産業以外のところで便利屋さんになった方が幸せな気がする
あるいは自分で会社作って、頑張るという手もある
需要は確かにあるけど、むしろ必要なのは営業力かもね
0756デフォルトの名無しさん
2011/05/06(金) 22:42:45.820757デフォルトの名無しさん
2011/05/07(土) 12:13:57.320758デフォルトの名無しさん
2011/05/07(土) 15:26:59.18よろしくお願いします。
0759デフォルトの名無しさん
2011/05/07(土) 15:28:04.320760デフォルトの名無しさん
2011/05/07(土) 15:43:24.480761デフォルトの名無しさん
2011/05/07(土) 17:02:35.280762758
2011/05/07(土) 17:10:52.620763デフォルトの名無しさん
2011/05/07(土) 17:52:51.85標準モジュールの変数に保持しておく方法と、
変数保持用のクラスを作ってそっちに保持しておく方法の2つを
いまパッと思いついたけど、どっちも似たようなもんだべさ。
どっちでもゲッタとセッタ作っとくと綺麗に見えるべさ。
0764デフォルトの名無しさん
2011/05/07(土) 18:39:39.63UserForm1には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
と記述してやると。
続く
0765デフォルトの名無しさん
2011/05/07(土) 18:41:15.85Module1には
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に
閉じる前の内容が設定されているでしょ?これが標準モジュールを使ったやり方ね。
0766デフォルトの名無しさん
2011/05/07(土) 18:49:46.46明示的に書いといた方がいいね。
Public Sub SetTextVal(IN_sTextVal As String)ね
0767デフォルトの名無しさん
2011/05/07(土) 18:50:49.83Set で変数にブックを指定したいのですが、エラーが出ます。
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’: となります、どのように修正したらよろしいでしょうか?
0768デフォルトの名無しさん
2011/05/07(土) 19:17:24.85先と元のブックごっちゃになってね?
どっちかのブックに「テスト」「リスト」の名前があるシートが無いんでしょ
0769デフォルトの名無しさん
2011/05/07(土) 19:25:33.14まず、転記元.worlsheetsじゃでないべさ。
転記先.Worksheets("テスト").Activate
転記元.Worksheets("リスト").Activate
でやってみ。
それとActivateは何かしたら切り替わるから
あまり使わない方がいいと思うよ。
0770デフォルトの名無しさん
2011/05/07(土) 19:41:31.12シート名は確認しました。
>>769さん
やってみましたが、
転記先.Worksheets("テスト").Active
でエラーとなります。
転記元を指定するいい方法はありますか??
0771デフォルトの名無しさん
2011/05/07(土) 19:44:53.95おっちょこちょいさん。
「転記先.Worksheets("テスト").Active」じゃなくて
「転記先.Worksheets("テスト").Activate」だわさ。
Activeの部分をもう一度Activateに変えてやってみ?
それでダメならまた考えるわさ。
0772デフォルトの名無しさん
2011/05/07(土) 19:56:12.09失礼しました!
ご指摘の通りActivateにしたら上手く動きました。
ありがとうございました!
0773772
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行ずつ挿入はできているのですが、オートフィルタの結果がコピーされません、
どこをどのように修正したらよろしいでしょうか?
0774デフォルトの名無しさん
2011/05/07(土) 21:00:28.61まだろくすっぽコード見たわけじゃないんだけど、
転記元.Worksheets("リスト").Range("W2:AD4").Copy Destination:=転記先.Worksheets("テスト").Cells(Rows.Count, d) の、
一番最後のCells(Rows.Count, d)の列に指定しているdってこのソースでは何を設定しているか
見えないんだけど、何を設定しているの?
0775デフォルトの名無しさん
2011/05/07(土) 21:12:56.29dはあらかじめInputboxで指定しています。
0776デフォルトの名無しさん
2011/05/07(土) 22:41:24.55色々ある。正直いって何がやりたいのかが良く見えない。
まず、myvalueはどこで設定しているのかな?いや、どこかで設定していたとして、
Cells(Rows.Count, 3).Value = myvalueを行った後に行挿入を行おうとすると、
最終行に書き込んだそのデータはどうするのと怒られる筈。
後、Selection.AutoFilter Field:=16, Criteria1:="=" & myvalueの
Selectionは何を選択しているのか。まずここで項目名を指しているセルの範囲を
設定しなくてはならないのでは?
それとループの中でまたオートフィルタの絞り込みを行っているけど、1回の絞り込みでいいのか、
再度絞り込みたいのか。再度絞り込みたいなら一度絞り込みを解除してから
行わないと怒られるんじゃない?
本来これらのエラーが出ると思うんだけど、実際に出てないとすればオートフィルタ―自体の
範囲がちゃんと設定されていない可能性もあるね。
取り敢えずその辺から見直して見るといいんじゃないかな?
0777デフォルトの名無しさん
2011/05/07(土) 22:46:53.56>>776は>>775へのレスね。
ちょっと疲れたべさ。暫く自分の方のAndroidの勉強するわ。
0778デフォルトの名無しさん
2011/05/07(土) 23:04:10.790779デフォルトの名無しさん
2011/05/07(土) 23:39:09.19転記元のデータをオートフィルターで抽出して、転記先に張り付けていきたいのです。
いろいろ修正して
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列目等)は
どうすればできるのでしょうか??
分かりにくい文章、見にくいコードで申し訳ありません。
0780デフォルトの名無しさん
2011/05/08(日) 00:02:10.730781デフォルトの名無しさん
2011/05/08(日) 00:28:12.81よく分からないけど
転記元.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はオートフィルタ―で絞り込みの対象としてる列の横位置)
とかに変えてあげればいいんじゃないかな。
0782デフォルトの名無しさん
2011/05/08(日) 00:32:09.70Range(Cells(2, 3), Cells(Cells(Rows.Count, X).End(xlUp).Row, 6))
(※Xはオートフィルタ―で絞り込みの対象としてる列の横位置)か。
なんか疲れてるみたいだわ。
0784デフォルトの名無しさん
2011/05/08(日) 01:33:53.25お役に立ててなによりだけど
もし自分の勉強の為じゃなくて仕事として作ってるなら、
転記先のシートに行を挿入する必要は本当にあるのか、
変数dはループの中で特にいじってないから貼られる先は常にいっしょじゃないのか、
なによりシートをアクティブにしてセル操作を行っているだけで、
どのブックのどのシートのどのセルを操作すると言う書き方をしてないから
操作的に非常に不安定じゃないかとか
まぁ色々あるからその辺を良く考えて作り直した方がいいと思う。
どうせ長いコードじゃないし。
0785デフォルトの名無しさん
2011/05/08(日) 01:55:02.53仕事で使用するために試行錯誤しながら作っています。
変数dと行の挿入はこの前にデータの整理や不要行・列の削除を
行っているため必要となっています。
ご指摘のようにシートやセルの操作は改善の余地が大ありと
思っています。
また分からないことがあれば質問させていただくので
機会があればご教示の程よろしくお願いします。
0786デフォルトの名無しさん
2011/05/08(日) 16:12:04.37あまり読んでないけど、
オートフィルタの結果のコピーは、
範囲.SpecialCells(xlCellTypeVisible).Copy
かな
でもVBAでオートフィルタ使うのは良くないと思う。
だから質問自体がナンセンス。
私なら転記元のデータを走査してヒットしたら、ひとつずつ転記先にコピー
していくか、collectionか何かに溜めてからまとめてコピーするかだな。
念のため、コピーと言ってもCopyメソッドを使うわけではないよ。
if ヒットしたら then
転記先.Cells(ヒットした分).Value=転記元.Cells(走査した分).Value
end if
0787758
2011/05/08(日) 17:06:37.90何度もすみません。
フォームを閉じた後も変数を保持しておく方法がまだ解決していません。
webをいろいろ見てみたのですが宣言セクションで宣言した変数はブックを閉じるまで値を保持し続ける
と書いてありやってみましたが上手くいきません。
763さんが言っている「標準モジュールの変数に保持しておく方法」
というのも調べてみましたがよくわかりませんでした。
本当に申し訳ありませんが、このようなやり方が記載されているweb
もしくは、コードを教えて頂けると助かります。
馬鹿な質問で申し訳ありません
0788デフォルトの名無しさん
2011/05/08(日) 17:25:14.24一番簡単なのはワークシートのセルに保存しておくかな
標準モジュールの宣言セクションでPublic で宣言した変数を
フォームで使うようにしたらどうなの
0789デフォルトの名無しさん
2011/05/08(日) 17:33:07.26>>764
>>765
0790デフォルトの名無しさん
2011/05/08(日) 17:40:20.88要するに変数のスコープという基本的な知識が抜けているんだよ
他にもプログラミングの基本的な知識が抜けすぎ
このまま先へ進めても分からないことだらけになってしまう
VBAでプログラミングの勉強をするのは困難すぎる
素直にCやJavaなどメジャーな言語の入門書を読めば必ず書いてある
0791デフォルトの名無しさん
2011/05/08(日) 17:45:52.34VBAに限った話じゃないかも知れないけど
0792デフォルトの名無しさん
2011/05/08(日) 17:54:57.33そう思ってクラスモジュールを作ってやる方法を書かなかったんだけどなぁ。
プライベートとグローバルの宣言の違いさえ理解しててくれてればなぁ。
0793デフォルトの名無しさん
2011/05/08(日) 18:00:15.50前に進められたVBのエラーコーディングはとても参考になった。
0794デフォルトの名無しさん
2011/05/08(日) 18:13:33.03MSも早く.NETに移行すればいいのに
0795デフォルトの名無しさん
2011/05/08(日) 18:36:05.82オブジェクト指向型言語から入った人から見れば、このスレで書いてるコードとか見た時、
あー、破綻してるなコレと思う事が多々あるだろうし、
低級言語から入った人とかが見れば、
ぐはぁ、メモリが、処理コストがぁ〜と思う事も多いと思う。
でもま、時代の流れから見てもオブジェクト指向を取り入れて損はないと思うべさ。
0796デフォルトの名無しさん
2011/05/08(日) 20:13:20.88どんなクラスを作って、どこでインスタンスを生成して
どんな使い方をするのかを考えて組むのは>>970の人が言ってる通り多分まだ無理。
一度>>764-765に書いてある様に実際に打ち込んで走らせて流れを追ってほしいな。
それでも理解できなければカプセル化の概念が崩れるけど>>788の人が言ってるみたいに、
標準モジュールにPublicで宣言した変数に保持するのが手っ取り早いかな。
0797デフォルトの名無しさん
2011/05/08(日) 20:26:45.17for文中で、変数を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などで結構ですので、よろしければ教えて下さい。
0798デフォルトの名無しさん
2011/05/08(日) 21:02:42.47はい
n = Cells(1, 1)
For n = 1 To n
Cells(n, 2).Formula = "=VLOOKUP(E" & n & ",sheet2!A1:B100,2,FALSE)"
Next
0799758
2011/05/08(日) 21:10:27.320800デフォルトの名無しさん
2011/05/08(日) 21:30:29.26たとえばA1に"http:yahoo.co.jp"と書いてあって、VBAでそのページを開く方法です。
Excel2003です、よろしくお願いします。
0801デフォルトの名無しさん
2011/05/08(日) 21:42:17.79わざわざVBA使わんでも、ハイパーリンクじゃ駄目なの?
0802デフォルトの名無しさん
2011/05/08(日) 21:52:04.38目的からして処理が速くないと意味無いのでハイパーリンクじゃ駄目です
0803デフォルトの名無しさん
2011/05/08(日) 21:53:26.35開くってブラウザでか?
0804デフォルトの名無しさん
2011/05/08(日) 21:54:43.51Webクエリなのでブラウザは関係ないと思いますが
0805デフォルトの名無しさん
2011/05/08(日) 21:55:56.30テキストに流し込んでHTML作成
フォームのに描画する
webbrowserコントロールでブラウザ作る
梳きなのどうぞ
0806デフォルトの名無しさん
2011/05/08(日) 22:01:03.81なんか突貫工事っぽいけど、とりあえずは完成したのかな。
完成する前にとやかく言うのもアレだと思って言わなかったんだけど、
>>786の人の意見はごもっともだからね。初期の設計そのものに問題があるよ。
例えば私だったら後々抽出条件が複雑になる様な改修が入る事を想定して、
転記元のシートにSQL投げてRecordsetに値を取得して、それを転記先のシートに
展開する様な方法を視野に入れたと思う。
まぁ、実際そのツールの事を知ってる訳じゃないから何とも言えないけどね。
頑張ってね。
0807デフォルトの名無しさん
2011/05/08(日) 22:16:21.38マクロ記録でwebクエリ挿入したのを見るといいよ
0809デフォルトの名無しさん
2011/05/08(日) 22:52:47.00こんなんでどう?適当だけど。
Option Explicit
Sub ChangeWebQueryRefer()
With ActiveSheet.QueryTables(1)
.Connection = "URL;" & Cells(1, 1)
.Refresh
End With
End Sub
0810デフォルトの名無しさん
2011/05/08(日) 23:01:41.16URLを設定した場合ね。
0811デフォルトの名無しさん
2011/05/08(日) 23:19:23.35ありがとうございます,できました。
0812797
2011/05/08(日) 23:21:47.69>>798
で、関数中のEを変数nにしたがって移動させるにはどうしたらいいのでしょうか?
n=3のとき関数中のEをGにしたいのですができますでしょうか?
よろしくお願いします。
0813デフォルトの名無しさん
2011/05/08(日) 23:28:24.23よくわからんがifで条件分岐させるのじゃダメなの?
0814デフォルトの名無しさん
2011/05/08(日) 23:38:17.20はい
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
0815デフォルトの名無しさん
2011/05/08(日) 23:39:49.79E列のアドレスから n-2 ぶんだけ下にOffsetしろ
ttp://msdn.microsoft.com/ja-jp/library/microsoft.office.interop.excel.range.offset(v=office.11).aspx
0816797
2011/05/08(日) 23:40:54.19ありがとうございます。しかし私の書き方が悪かったようで、nがいかなる数字の場合でもそれを加えた数だけ列を移動させたいのですが無理でしょうか?
0817デフォルトの名無しさん
2011/05/08(日) 23:42:38.17放物線の話しじゃないの。
0819デフォルトの名無しさん
2011/05/09(月) 00:06:30.53はい
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
0820デフォルトの名無しさん
2011/05/09(月) 00:08:04.09なんだ、もう片付いちゃってたのね。
0821デフォルトの名無しさん
2011/05/09(月) 04:55:51.310822デフォルトの名無しさん
2011/05/09(月) 15:02:27.04入力する度に文字をチェックするプロシージャを作ってるんですけど、
PrivateSub TextBox1_Change
(略
PrivateSub TextBox2_Change
(略
・
・
・
と60個も並べたくなく、
一発で済む方法ないですか?
0823デフォルトの名無しさん
2011/05/09(月) 16:34:09.59コントロール配列ってVBAじゃ使えなかったっけ?
0824デフォルトの名無しさん
2011/05/09(月) 16:37:06.78.Textプロパティに代入とかならControlsでも出来るけど
イベント取りたいとなるとコレクションとクラス使った疑似コントロール配列だな
0825デフォルトの名無しさん
2011/05/09(月) 20:57:43.19この手の質問定期的にきてうざいな
クラスモジュールを使えばできるから
自分で調べてみろ
0826822
2011/05/09(月) 21:57:30.59サンクス、「擬似コントロール配列」で検索してみたら出てきた。
ホントはChangeじゃなくAfterUpdateだからそんなに難しくなさそう。
頑張ってみるよ!
0827デフォルトの名無しさん
2011/05/09(月) 22:08:54.500828デフォルトの名無しさん
2011/05/10(火) 13:58:47.10ボタンコントロールクリック、以下の処理内で実行時エラー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…。
原因につながるヒントを頂けると助かります。
0829デフォルトの名無しさん
2011/05/10(火) 14:03:17.25cells.copy
cells(1,1).pastespecial paste:=xlpastevalue 以外
0830デフォルトの名無しさん
2011/05/10(火) 14:53:04.75釣りだな。ほらよ。
Range(Cells(1,1),Cells(Rows.Count,Columns.Count)) = Range(Cells(1,1),Cells(Rows.Count,Columns.Count))
0831デフォルトの名無しさん
2011/05/10(火) 15:01:57.890832デフォルトの名無しさん
2011/05/10(火) 15:25:50.92> Range(Cells(1,1),Cells(Rows.Count,Columns.Count))
なんでわざわざこんな書き方してるの?釣り?
0833デフォルトの名無しさん
2011/05/10(火) 16:01:43.670834デフォルトの名無しさん
2011/05/10(火) 19:16:22.55釣り用のヘボいコードだと言う事までは分かったらしいが、
この程度のコードのどこがヘボいかまでは指摘できる脳みそを持ち合わせていなかったようだな。
0835デフォルトの名無しさん
2011/05/10(火) 20:00:52.48Range(Cells(1,1),Cells(Rows.Count,Columns.Count))ってCellsと同じだわな
0836デフォルトの名無しさん
2011/05/10(火) 21:44:45.24実は今マリオみたいなゲームを作ろうとしていますが、セルをドットの様に使って
横スクロールをした時、すぐに右端へたどり着いてしまいます。
擬似的に左右で永久にスクロール出来る様に見せかけたいのですが、どんな方法が有りますか?
又、その方法を使った時、最少のセルの横ピクセル数は何ピクセルくらいになりますか?
環境はWinXPのEXCEL2003です。
0837デフォルトの名無しさん
2011/05/10(火) 21:49:42.97セルを変化させる
0838デフォルトの名無しさん
2011/05/10(火) 21:53:44.59どの様にでしょうか
0839デフォルトの名無しさん
2011/05/10(火) 21:59:49.19右端に来たら下の方の行とか別のワークシートに移動させる
0840デフォルトの名無しさん
2011/05/10(火) 22:15:16.95なるほど、そうすると最低のセル横幅は256セルで2画面分になる様に設定すればいい訳ですね。
何となく目処が立ちました。ありがとうございます。
0841デフォルトの名無しさん
2011/05/11(水) 00:09:22.41この程度終わる話に「指摘できる脳みそ」なんて発想は出てこないから
Cells以外の何かを発想してたんだろうね。恥ずかしすぎるw
0842デフォルトの名無しさん
2011/05/11(水) 03:29:31.490843デフォルトの名無しさん
2011/05/11(水) 08:05:41.61そして>>829,>>832,>>835,>>841は全て同一人物。
>>829で質問を投げといて、しょぼい答えが返って来るのを待って、返って来たらぶっ叩く。
それを楽しみにこのスレに来ている訳だ。
今回は煽りをくれてやって初めて反応したが、
やっぱりこいつがいつもスレが荒れる原因を作ってる奴だったんだな。
0844デフォルトの名無しさん
2011/05/11(水) 08:42:56.730845デフォルトの名無しさん
2011/05/11(水) 08:47:06.69マシンスペックによって動作速度が違うゲームが出来上がりそうだなw
0846デフォルトの名無しさん
2011/05/11(水) 09:05:15.88相当悔しかったようだねw
0847デフォルトの名無しさん
2011/05/11(水) 09:58:31.83その辺はAPIを使ってwaitかけて統一するつもり。
余りにマシンスペックが低いのは見捨てる方向で。
0848デフォルトの名無しさん
2011/05/11(水) 11:12:24.40残念、その中に俺が一つ入ってるので全て同一人物ってのはハズレ
他3つが同一人物でも、少なくとも2人だ
俺の予想では質問者は別で、残り2つが同一人物で、計3人だな
0849デフォルトの名無しさん
2011/05/11(水) 12:01:31.70>>484は気付いてないかも知れないが、君は俺の自演から生まれた人格なんだよ
さあ俺の元へ還れ
0850デフォルトの名無しさん
2011/05/11(水) 13:21:31.460851デフォルトの名無しさん
2011/05/11(水) 14:27:29.93UserFormの
CommandButton1_Click()
のようなものはユーザーフォームに直接記述して、
実行するものをcallするといった感じでしょうか?
それともUserFormには一切記述しないのでしょうか?
いまいち質問が分かりにくいかもしれませんが、よろしくお願いします。
0852デフォルトの名無しさん
2011/05/11(水) 14:48:04.50好きにしろ
マクロの実行からも選べる
0853デフォルトの名無しさん
2011/05/11(水) 15:09:21.13クラスモジュールにならイベントごと移動することも可能
どちらを使うかは852も言うとおり「好きにしろ」で
0854デフォルトの名無しさん
2011/05/11(水) 22:49:20.82なったセルが、
ペーストされたのか、手入力されたのか、
分かる方法ない?
0855デフォルトの名無しさん
2011/05/11(水) 22:53:07.59Target の個数が複数だとペースト1択だけど、1個だと・・・どうでしょうねえ
0856デフォルトの名無しさん
2011/05/11(水) 23:10:56.00ありがとう。
解決の方向性は見えました。
0857デフォルトの名無しさん
2011/05/12(木) 13:09:51.161、3、5、7、9、
といった感じです
0858デフォルトの名無しさん
2011/05/12(木) 14:28:48.310859デフォルトの名無しさん
2011/05/12(木) 15:43:55.99セルにセットします
素数を一つ飛ばしで一致させるプログラムを作ります
配列にランダムソートで格納します
APIから時刻を取得し、データが枝と一致したら、シートから正規表現で該当セルを抜き出します
抜き出したセル番地を配列にセットします
IDEをインポートして、自コードを行を一つ飛ばしで選択出来るよう書き換えます
保存せずに終了させます
0860デフォルトの名無しさん
2011/05/12(木) 16:18:03.69>>859
お前ら優しいな
0861デフォルトの名無しさん
2011/05/13(金) 23:15:03.00別のパソコンでデバッグした場合、「Shapes」が取得される場合があります。
同じプログラムソースコードから取得した型の結果が違うのですが、
原因が掴めないです。
Debug.Print Typename(ActiveSheet.Shapes(0).Parent)
当パソコン→Worksheetが返されます。(正常結果)
別パソコン→Shapesが返されます。(異常結果)
何が違うのか教えていただけませんか。すみません。
0862861
2011/05/13(金) 23:16:31.18両端末とも、
OS: Windows XP
オフィス:Excel 2007
です。
0863デフォルトの名無しさん
2011/05/13(金) 23:57:24.55当ててあるサービスパックが違うんじゃないの?
0864861
2011/05/14(土) 00:13:20.35ありがとうございます。
なるほど。
元々、シートのシェープの親を取ってくる事になるので、
はじめから、ワークシートオブジェクトのみを取得してきたほうが安定しますね。
大変助かりました。
0865デフォルトの名無しさん
2011/05/14(土) 01:26:51.28Auto_Openを動作させずにマクロを開きたい時に、Excel2007ではShiftキーを押したまま
Excelを起動した時でもAuto_Open処理が動いてしまいます。
また、マクロ設定を無効にしている場合はマクロの編集ボタンが無効になっており
プログラム編集ができません。
Auto_Openを動作させずにマクロを編集する方法をご教授願います。
0866デフォルトの名無しさん
2011/05/14(土) 01:33:35.990867デフォルトの名無しさん
2011/05/14(土) 02:21:46.89たしかにShift押しながら起動でもAutoOpenは起動するね
回避方法は知らん
0868デフォルトの名無しさん
2011/05/14(土) 02:29:29.19直接フォルダからEXCELを開くんじゃ無くて、一度EXCELのアプリケーションを立ち上げてから
「ファイルタブ」の「開く」で開きたいブックを選択して、シフト押しながら「開く」ボタン押下で出来るわさ。多分。
0869デフォルトの名無しさん
2011/05/14(土) 09:07:32.82テーブルジャンプを行いたいです。
具体的には2つの動的な配列変数を用意して、一つの配列に処理順、もう一つの配列に
実行する関数のアドレスを設定して
その配列に設定された順序に関数を実行する処理を作りたいのです。
方法としては、スタックポインタが指しているアドレスの
関数戻りアドレス情報を次の呼び出し関数の呼び出しアドレス情報に書き換えてEnd Functionなり
End subなりを実行して行うか、または
なんらかしらのAPIでコールバックして行う方法を考えているんですけど、
取り敢えず配列に処理順序と関数の開始アドレスを設定する所までは上手くいったものの、
その後のいい方法がなかなか無いんです。
かといって適当に繰り返し処理や分岐でただの関数呼び出しを行ったんでは
処理コストが掛かり過ぎるのと、管理し辛いといった面から避けたい訳です。
特に今作っているのがゲームだから、処理コストは出来るだけ掛からない様にしたいのです。
何かいい方法はありませんか?
0870デフォルトの名無しさん
2011/05/14(土) 09:19:24.42スレ違い >>3★3,4
0871デフォルトの名無しさん
2011/05/14(土) 09:27:50.00別にAPIを使う方法じゃ無くても実現出来れば方法にこだわらないわさ。
何ですれ違いになるのかな?
0872デフォルトの名無しさん
2011/05/14(土) 09:35:31.750873デフォルトの名無しさん
2011/05/14(土) 09:41:37.13まず★2を読んで欲しい。
それと、全体から見てVB6のUIでは遅すぎて考えた通りのゲームを作れ無いので、
EXCELのシートを使ってゲームを作成している。
その辺の処理速度を考慮しての話だからすれ違いでは無いよね。
0874デフォルトの名無しさん
2011/05/14(土) 09:56:00.41その前の処理は全てExcel関係ない処理になるんだってば
それにVBAと比べれば、処理も描写もVB6の方が速いぞ
間違った方法取ってなければな
0875デフォルトの名無しさん
2011/05/14(土) 10:03:13.88でもいい方法が有ったら教えて欲しいなぁ。
0876デフォルトの名無しさん
2011/05/14(土) 10:13:03.31スレ違いでも教えて貰える可能性は0ではないからな
0877デフォルトの名無しさん
2011/05/14(土) 10:40:19.28ジャンプテーブルになるんじゃないかな。
0878デフォルトの名無しさん
2011/05/14(土) 11:01:40.10ありがとう。
その方法は一番最初に考えたんだけどやっぱり条件分岐なもんで
キャラクターの属性と動作ごとに処理分けを行うと相当数になるから
出来れば条件分岐ではなく、インデックスを与えてそれを実行する様な方法を取りたかったんですわ。
でも最悪、その方法を使う事にさせて頂きますわ。
本当にありがとうございます。
ただ、この話題はすれ違いらしいのでこの辺で。
0879デフォルトの名無しさん
2011/05/14(土) 11:39:22.030881デフォルトの名無しさん
2011/05/14(土) 13:11:25.33これならスレ違いにもならぬ
0882デフォルトの名無しさん
2011/05/14(土) 13:33:22.780883デフォルトの名無しさん
2011/05/14(土) 13:47:20.50余程ヘボいソートアルゴリズム使ってるんですねw
0884デフォルトの名無しさん
2011/05/14(土) 15:07:03.410885デフォルトの名無しさん
2011/05/14(土) 15:22:00.68「公開してくれるそうなので楽しみに待ちましょう」とか、バカっぽすぎて吹いた。
0886デフォルトの名無しさん
2011/05/14(土) 15:31:45.02自分が馬鹿なんだと気づいてね
0887デフォルトの名無しさん
2011/05/14(土) 15:38:19.03その言葉は自分にこそ相応しかったと
0888デフォルトの名無しさん
2011/05/14(土) 16:04:11.350889デフォルトの名無しさん
2011/05/14(土) 16:21:48.50草複数生やす奴は総じて口だけのヘタレだったけど。
0890デフォルトの名無しさん
2011/05/14(土) 16:23:03.390891デフォルトの名無しさん
2011/05/14(土) 16:34:18.940892デフォルトの名無しさん
2011/05/14(土) 16:39:24.580893デフォルトの名無しさん
2011/05/14(土) 17:35:13.84責任重大だな。
0894デフォルトの名無しさん
2011/05/14(土) 17:51:56.85ヒント:>>885
0895デフォルトの名無しさん
2011/05/14(土) 18:08:06.89なるほど、クイックソートより超っ速いのがその辺に転がっているとか言ってる時点で
察しろよ、言わせんな恥ずかしいって事か。やっぱり語尾に草生やす奴は総じて駄目か。
0896デフォルトの名無しさん
2011/05/14(土) 18:08:30.38着色もしたいのですが、下記のユーザ定義関数では
#VALUE!になってしまいます。
Public Function hoge()
ActiveCell.Interior.colorIndex = 3
hoge = "aaa"
End Function
どのようにすれば実現できますか?
Windows7、Excel2010です
0897デフォルトの名無しさん
2011/05/14(土) 18:10:48.62うーんそれ関数?
0898デフォルトの名無しさん
2011/05/14(土) 18:25:13.42ユーザー定義関数内で着色しようとしてるからじゃない?
条件付き書式で代用すれば?
0899デフォルトの名無しさん
2011/05/14(土) 18:28:26.26どういった意味でしょうか?
>>898
実際には複雑な条件チェックをして
その結果によって着色するかしないか
を決めたいので条件付き書式では難しいんです。
0900デフォルトの名無しさん
2011/05/14(土) 18:35:25.45なんか曲解してるな
言い負かされて悔しいからわざとねじ曲げて解釈して憎まれ口叩いてるのか?
0901デフォルトの名無しさん
2011/05/14(土) 18:47:14.93俺からして見ればコード挙げられずに顔真っ赤にして必死に書き込んでいる
お前の方がよっぽど悔しそうに見える訳だが。
Wikipediaのソートに関して
http://ja.wikipedia.org/wiki/%E3%82%BD%E3%83%BC%E3%83%88
どのソートが一般的に一番早いと言われているか
自分で確認してからコード晒してくれな。
0902デフォルトの名無しさん
2011/05/14(土) 18:52:54.87関数にしてどうしたいの?
0903デフォルトの名無しさん
2011/05/14(土) 18:54:43.96いつのまにかクイックソートとの比較になってる
悔しさのあまり顔真っ赤にして必死になってると、
こうやって話が明後日の方向に飛んでいってしまうのかな?
0904デフォルトの名無しさん
2011/05/14(土) 18:58:07.42あたしのためにこれ以上争わないで!
0905デフォルトの名無しさん
2011/05/14(土) 19:02:45.04プッ
今頃何言ってるのかな。逃げに入っちゃったかな?
>>884の発言の後で>>885でその辺に転がっているって言ってるよな。
ほら、その辺に転がっているならとっとと挙げてみれば?
人の言ってる事オウム返しにしか言えない奴にはちょっと厳しい?
0906デフォルトの名無しさん
2011/05/14(土) 19:07:05.930907デフォルトの名無しさん
2011/05/14(土) 19:08:59.36本当に逃げてるなら、逃げてると言われるのは痛いところだろうが
逃げに入ったとか、ちょっと厳しいとか言われたところで
根本を勘違いしてる奴の言葉じゃ滑稽なだけで煽りにもなってないもんな
0908デフォルトの名無しさん
2011/05/14(土) 19:16:53.09あーあ、完全に逃げたな。
結局根本とか何とかウダウダ言ってその辺に
転がっているって自分で言ってたコードも晒せないんだもんな。
やっぱり草生やす奴は総じて糞と言うことが確定したな。
0909デフォルトの名無しさん
2011/05/14(土) 19:17:36.040910デフォルトの名無しさん
2011/05/14(土) 19:19:14.58ワークシートソート(並べ替え機能)より速いソートを晒せば納得するのか?
0911デフォルトの名無しさん
2011/05/14(土) 19:20:42.42>>899
>>902
0912デフォルトの名無しさん
2011/05/14(土) 19:23:40.28ひょっとして文字を設定するという部分は
hoge = "aaa"
の部分?
0913デフォルトの名無しさん
2011/05/14(土) 19:23:56.05ワークシートソート(並べ替え機能)より速いソートがあると言ったら>>883
クイックソートより超っ速いコードを公開してくれる>>884
といきなり一言も出してないクイックソートにすげ替えたバカが粘着中
0914デフォルトの名無しさん
2011/05/14(土) 19:26:25.56ハァ?
それじゃ>>884に対する>>885の発言の解になってないだろ。
ちゃんと自分でクイックソートより速い奴がその辺に転がっているって
言ってるんだからそれを晒せばいいだけじゃないか。何か問題でもあるのか?
0915デフォルトの名無しさん
2011/05/14(土) 19:27:15.720916デフォルトの名無しさん
2011/05/14(土) 19:27:32.07これうまくいかねえな
0918デフォルトの名無しさん
2011/05/14(土) 19:30:11.40http://www.asahi-net.or.jp/~ef2o-inue/vba_o/sub05_800.html
0919デフォルトの名無しさん
2011/05/14(土) 19:34:01.38Public Function hoge(str As String)
ActiveCell.Interior.colorIndex = 3
ActiveCell=str
End Function
0920デフォルトの名無しさん
2011/05/14(土) 19:34:21.010921デフォルトの名無しさん
2011/05/14(土) 19:36:08.83自分の発言には責任持つけど、バカの曲解にまでは責任持てませんぜ
俺が書いたのは
「ワークシートソート(並べ替え機能)より速いソートがある」
と、それに対して公開しろ的なレスがあったので
「(自分があると書いたワークシートソートより速いソートは)その辺に転がってる」
だけだ
「クイックソートより超っ速いコードがあると言ってるなんて曲解してるバカがいるが
それについてもその辺に転がってるぜ」
なんてことは書いた覚えは無い
0922デフォルトの名無しさん
2011/05/14(土) 19:36:37.53ワークシートにこれを書けば
Const ConstTargetStr = "=hoge()"
Private Sub Worksheet_Change(ByVal Target As Range)
'シート上のどっかが書き換わったらConstTargetStrを探し出す
'探し出したセルに"aaa"を代入して色を変更するプログラム
End Sub
0923デフォルトの名無しさん
2011/05/14(土) 19:38:19.66は?
0924デフォルトの名無しさん
2011/05/14(土) 19:38:35.39なんだ、僅差でクイックソートよりワークシートのソートメソッド使った方が速いのか。
これは>>921はどう言い訳するんだろうな。
じゃあ「ワークシートソート(並べ替え機能)より速いソートがある」のを晒してくれればいいや。
ちょっと楽しみ。
0925デフォルトの名無しさん
2011/05/14(土) 19:41:42.44「ワークシートソートなんてクソ」
って言ってるように見えたが
0926デフォルトの名無しさん
2011/05/14(土) 19:42:44.73どのレスを見て?
0927デフォルトの名無しさん
2011/05/14(土) 19:43:18.73うわーこんな事できるの知らなかったわ><
0928896
2011/05/14(土) 19:43:58.95やってみましたが、#VALUE!になってしまいます。
>>920
呼べます。
それをユーザ定義関数と呼ぶらしいです。たぶん。
>>922
これでも要件を満たせますが、
実際にやりたい処理はもっと複雑なので、
シート上の変更のたびに呼び出されてしまうのは、
避けたいです。
0929デフォルトの名無しさん
2011/05/14(土) 19:48:14.19ほれ http://chaichan.web.infoseek.co.jp/vbtips/VBMemo2006081601.htm:0.737s
ワークシートソート:0.861s
0930デフォルトの名無しさん
2011/05/14(土) 19:49:18.22>>882以降全部
>>928
あはい
自作関数も呼び出しで言えばおんなじようなもんだけどご自由に
0931デフォルトの名無しさん
2011/05/14(土) 19:56:28.46こちらの Win2000, Excel2000 では
以下のコードでおkだった
Public Function hoge()
ActiveCell.Interior.ColorIndex = 7
hoge = "aaa"
End Function
0932896
2011/05/14(土) 20:05:01.64色も変わりました?
WinXP、Excel2003もあるので、それで試してみました。
#VALUE!にはならないですが、色がかわりませんでした。
0933デフォルトの名無しさん
2011/05/14(土) 20:06:30.47色も変わりますよ。
0934デフォルトの名無しさん
2011/05/14(土) 20:06:52.890936デフォルトの名無しさん
2011/05/14(土) 20:11:21.430937デフォルトの名無しさん
2011/05/14(土) 20:12:52.55何回かやってたら色が変わらなくなった。
VBエディタの実行ボタンを押すと変わるんだけど・・・
0938896
2011/05/14(土) 20:15:49.05あ、そういうことですか。
VBAエディタから実行させるとExcel2003でも、2010でも正常に動きます。
ワークシートから=hoge()ではどのバージョンでもダメみたいですね。。。
0939デフォルトの名無しさん
2011/05/14(土) 20:27:17.11なんかソートでおかしな比較論を展開してるやつなんなの?
まず配列ありきなら配列をワークシートに書き出してソートするより、配列上でソートする方が速いわなぁ。
なぜなら配列のワークシートへの書き出しはコストがゼロじゃないからな。
0940デフォルトの名無しさん
2011/05/14(土) 20:43:17.75糸冬了
0941デフォルトの名無しさん
2011/05/14(土) 20:46:10.74>>869に対するExcelを使用した方法の提示なんだけども
0942デフォルトの名無しさん
2011/05/14(土) 22:07:24.26関数は(あれば)引数を受け取って値を返すだけの機能
書式の変更等はできない仕様
Subのほうに書くしかない
0943896
2011/05/14(土) 23:03:54.96functionから書式変更するsubを別途呼んでもダメだったので、
そういう仕様なのかと疑っていましたが、やっぱり仕様だったんですね。
諦めてボタン等から起動して、チェックと書式変更する処理を流すようにでもしてみます。
レスくれた方々、ありがとうございました。
0944デフォルトの名無しさん
2011/05/14(土) 23:44:07.49もう見てないかな?
これはたしかユーザー定義型の制約で仕方ない事だったと思ったべさ。
>>922の人のが殆ど自分の考えと一緒だったけどちょっと違うのが、
変更された特定値をサーチするんじゃなくて、値の書き込み元の範囲を
最初に特定してしまって、その範囲外ならすぐに処理を抜けてしまえば
シート上の変更のたびに呼び出されても負担が少ないわさ。
たとえばシートのセル範囲にRng_TgtFromと言う名前を切って、これを
計算が反映される入力元の範囲とした場合、次の様にVBEのシートに書くべさ。
0945デフォルトの名無しさん
2011/05/14(土) 23:46:29.37Private 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))
0946デフォルトの名無しさん
2011/05/14(土) 23:47:57.42For 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
0947デフォルトの名無しさん
2011/05/14(土) 23:59:48.52まず入力したセルが指定範囲内かチェックしてるわさ。
次に入力したセルが範囲内だった場合、指定範囲と入力された範囲の
被った部分を処理対象にするわさ。
で、処理対象範囲の中のセルを一個づつガラガラまわして値と色を設定してるわさ。
値の"AAA"と結果出力位置は適当に後で直して欲しいわさ。
インデントが取れたからかなり見辛くなったから
コピッてはっつけてインデント補正してから見てほしいわさ。
0948デフォルトの名無しさん
2011/05/15(日) 00:24:17.64ユーザー定義関数の間違いね。ユーザー定義型って言ったら構造体のことになっちゃうわさ。
0949デフォルトの名無しさん
2011/05/15(日) 04:36:24.95色を変えるセルを引数に指定すれば良いんじゃねえかと思うんだが
0950デフォルトの名無しさん
2011/05/15(日) 08:02:20.850951デフォルトの名無しさん
2011/05/15(日) 10:36:16.75やってみてから言えば?
0952896
2011/05/15(日) 11:54:30.92改良案ありがとうございます。
たしかに範囲指定内でのみ処理が流れるようにすれば負荷を抑えられますね。
書いてもらったコードですが、名前付きセル内のセルの
値と書式を設定した場合は、設定時に再び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
これなら私がやりたかったことにだいぶ近づきました。
ありがとうございます。
0953デフォルトの名無しさん
2011/05/15(日) 12:08:15.55ちょっと待って、
今更だけどもうちょい考える余地がある事に気付いたべさ。
0954デフォルトの名無しさん
2011/05/15(日) 12:26:43.23今更だけど条件付き書式を使ってやる方法も思いついたわさ。
複雑な条件で着色しなければいけないって話だったから、これもユーザー定義関数に
してしまって、出来るなら処理元を一緒にしてしまえば楽になるかな。こんな感じ。
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セルの設定は面倒だけど後はコピペで展開すれば
わざわざイベントの事を気にしないでも済むわさ。
まぁ、後は好みで使い分けるわさ。
0955896
2011/05/15(日) 13:06:05.15おお、条件付き書式にユーザ定義関数指定すれば確かにいけますね。
もしかし>>898の方はそういう意味で言ってくれていたのかも・・・^^;
これのほうが考え方としてはシンプルかもしれませんね。
この方法も検討してみます。どうもです。
0956949
2011/05/15(日) 19:04:06.15すまん。やってみたらできなかった
ユーザ定義関数で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で指定する
つづく
0957949
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)とか指定する
0958デフォルトの名無しさん
2011/05/15(日) 20:18:50.35なんかVBAの本来の目的から外れてる気がしないでもない
本当に必要な要件なのか、その辺から見直しオススメw
0959デフォルトの名無しさん
2011/05/15(日) 20:31:17.58>ユーザ関数呼んだセルはApplication.ThisCellでとれるみたいなので
>引数にRangeとる必要はなさそう
その方法だと再計算後のイベントで拾って来て1セルしか処理していないから
一度計算式を入れたセルを、違う色に着色して複数セル選択してコピペしても
一つのセルしか色が変わらないんじゃないか?
0960デフォルトの名無しさん
2011/05/15(日) 20:37:16.18あと条件をチェックする前に塗りつぶしをクリアしないと
0961デフォルトの名無しさん
2011/05/15(日) 20:51:45.220962デフォルトの名無しさん
2011/05/15(日) 22:09:09.26これが正論であるがゆえ、Word VBAは隆盛をみないんだよなw
Access VBAはともかく
0963デフォルトの名無しさん
2011/05/16(月) 03:55:56.12複数セルコピペは試したけどちゃんと動いてる
ユーザ関数はセル単位で呼ばれてるはずだけど、そのたびに再計算してる模様
再計算方法を手動にしたらどうなるかって今ふと気になったがそこは知らん
0964デフォルトの名無しさん
2011/05/16(月) 12:52:35.59Aftercalculateがどう言うイベントか知っていればそんな返事は返って来ないと思うんだが。
一度ヘルプで確認してからトレースでも確認しろ。
背景色ごと複数セルを選択してコピペして以前塗られた背景色が残っているだけじゃないのか?
これが業務なら、指摘されても気付かないでそのまま通して本番環境で発覚したりする訳だ。
それに要件的には差程難しい要件ではないと思うが。
自分でトリッキーに作って難易度を上げておいて要件のせいにするのはどうかと思うぞ。
0965デフォルトの名無しさん
2011/05/16(月) 16:59:57.44>背景色ごと複数セルを選択してコピペして以前塗られた背景色が残っているだけ
これはその通りのようだ
で、何を要件のせいにしてるってんだ?
素直に作るとしてお前ならどう作るんだ?
0966デフォルトの名無しさん
2011/05/16(月) 18:00:13.48俺の意見は>>898で既に述べているが何か?
0967デフォルトの名無しさん
2011/05/16(月) 20:57:41.990968デフォルトの名無しさん
2011/05/16(月) 21:00:34.430969デフォルトの名無しさん
2011/05/16(月) 21:23:29.600970デフォルトの名無しさん
2011/05/16(月) 21:41:20.690971デフォルトの名無しさん
2011/05/16(月) 22:42:01.640972デフォルトの名無しさん
2011/05/16(月) 23:09:53.990973デフォルトの名無しさん
2011/05/16(月) 23:11:10.780974デフォルトの名無しさん
2011/05/16(月) 23:19:28.810975デフォルトの名無しさん
2011/05/16(月) 23:59:33.760976デフォルトの名無しさん
2011/05/17(火) 17:10:44.710977デフォルトの名無しさん
2011/05/17(火) 23:16:49.040978デフォルトの名無しさん
2011/05/17(火) 23:19:14.420979デフォルトの名無しさん
2011/05/18(水) 01:18:37.22for文で処理ごとに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回書いて非常に不細工な記載になっているのですが
もっと簡単な方法ってあるのでしょうか?
0980デフォルトの名無しさん
2011/05/18(水) 01:35:08.37If 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
0981デフォルトの名無しさん
2011/05/18(水) 03:42:36.32それおかしくない?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
0982デフォルトの名無しさん
2011/05/18(水) 07:32:17.400983デフォルトの名無しさん
2011/05/18(水) 07:55:23.670984デフォルトの名無しさん
2011/05/18(水) 08:25:17.55txt = "<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>"
だな。
0985デフォルトの名無しさん
2011/05/18(水) 10:26:36.03【statements】←A ?
【exit do】 ←B ?
【statements】
loop
参考書に載ってるモデル図ですがAとBの個所が何を表わしてるのか
わかりません(´・ω・。)教えてくださいです
0986デフォルトの名無しさん
2011/05/18(水) 10:45:59.19つヘルプ
0987デフォルトの名無しさん
2011/05/18(水) 10:56:21.08なんか処理
loop
これで条件達成するまでなんか処理を続ける
条件が不達だといわゆる無限ループ
do オプション
なんか処理1
ループ抜ける
なんか処理2
loop
これで無限ループからも抜けられる
0988デフォルトの名無しさん
2011/05/18(水) 13:26:39.24バカ?
0989デフォルトの名無しさん
2011/05/18(水) 14:25:43.420990デフォルトの名無しさん
2011/05/18(水) 14:48:54.58その記述は無限ループを回避する為の手法じゃないしな
ということは「バカ?」ではなく「マヌケ?」と言うべきだったかな?
0991デフォルトの名無しさん
2011/05/18(水) 15:28:46.38が、どうでもいい
次スレまだー?
0992デフォルトの名無しさん
2011/05/18(水) 15:58:13.210993デフォルトの名無しさん
2011/05/18(水) 16:06:31.680994デフォルトの名無しさん
2011/05/18(水) 16:11:45.450995デフォルトの名無しさん
2011/05/18(水) 16:19:51.78草生やすクズを一々相手にしてたら自分が嫌な気分になるから止めといた方がいいよ。
0996デフォルトの名無しさん
2011/05/18(水) 16:22:50.640997デフォルトの名無しさん
2011/05/18(水) 17:03:46.10新スレ欲しいなっ
0998デフォルトの名無しさん
2011/05/19(木) 06:40:21.69Excel VBA 質問スレ Part19
http://hibari.2ch.net/test/read.cgi/tech/1305754555/l50
0999デフォルトの名無しさん
2011/05/19(木) 10:10:39.251000デフォルトの名無しさん
2011/05/19(木) 10:18:18.4110011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。