5ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

■ このスレッドは過去ログ倉庫に格納されています

Excel VBA 質問スレ Part18

1 :デフォルトの名無しさん:2011/02/21(月) 07:24:26.35
過去スレ
01 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/

2 :デフォルトの名無しさん:2011/02/21(月) 07:27:09.77
忘れてたので追加

前スレ:
Excel VBA 質問スレ Part17
http://hibari.2ch.net/test/read.cgi/tech/1289182437/

3 :デフォルトの名無しさん:2011/02/21(月) 10:58:31.77
>1 乙でした。テンプレです。

ExcelのVBAに関する質問スレです

★1 質問テンプレ(雛形)は用意しませんが、OSとExcelのバージョンは必ず書きましょう。

★2 ExcelのVBA以外の部分に関する質問はNGです。
   但し、VBA無しでも出来ることだが、あえてVBAでやりたいって物に関してはOK。

★3 ExcelのVBE(Visual Basic Editor)を使うとしても、VBAの分野以外に関してはスレ違いです。

 VBAとは、『Visual Basic for Application』の略で
  Application
  ├Workbooks
  |└Workbook
  |  ├Worksheets
  |  |└Worksheet
 というApplication以下のオブジェクトを、VB言語で操作するものを指します。
 例えExcel付属のVBE(Visual Basic Editor)を利用しようとも、このApplication以下のブックやシート、
 セルやオブジェクト等を操作するもの以外はVBA分野の話ではないので、ここでは聞かないでください。

★4 とりあえず、Excelのインスタンスを作らずにVB6で出来ることは全てスレ違いだと思ってください。

★5 レベルはどうあれ、ここはプログラマ用の板スレです。プログラマとは、自分でプログラムを組み
   コードを書く人の事なので、自分でやるきは全く無く、丸投げしようって人はお断りです。
   ヒントを貰えばあとは自力でなんとかしますって人のみどうぞ。

★6 わからなければとりあえず「マクロの記録」(Alt, T, M, R)

4 :デフォルトの名無しさん:2011/02/21(月) 20:01:09.42
2つユーザーフォームについて質問です

一つはユーザーフォームを多重で起動することは可能でしょうか?
userform1.show
userform2.show
二つ続けても消さないと次が出てきません。

二つ目はユーザーフォームの番号を変数で表示することは可能でしょうか?
UserForm(i).Show こんな感じに、でもこれだとエラーでてしまいます。

5 :デフォルトの名無しさん:2011/02/22(火) 10:35:10.58
>>4

まず最初の質問は

userform1.show False

とすると多重で表示できます。

これをすると、シートのデータがいじれるので
場合によっては危険です。

2番目の質問は、下のコードを見て色々試してみてください。
(UserFormsとUserFormの違いに注意)

Load UserForm1
MsgBox ("UserForm1 を読み込みました。表示はまだです。")
Load UserForm2
MsgBox ("UserForm2 を読み込みました。表示はまだです。")

UserForms(0).Show False
MsgBox ("最初に読み込んだUserFormオブジェクトを表示しました")
UserForms(1).Show False
MsgBox ("2番目に読み込んだUserFormオブジェクトを表示しました")

6 :デフォルトの名無しさん:2011/02/22(火) 10:40:12.18
表示形式が、文字列(A)、数値(B)、日付(C)の値のみを消去する場合

1)Range("A1:C50").value = ""
2)Range("A1:C50").ClearContents
 
上記1,2、どちらでもOKか?
 


7 :デフォルトの名無しさん:2011/02/22(火) 17:13:53.07
>>5
できました。
丁寧にありがとうございました。

8 :デフォルトの名無しさん:2011/02/23(水) 07:14:27.98
>>6
jsk駄目だろ?
例えば後ろにデータがないときMsgBox Range("A1000").End(xlUp).Addressってやってみなよ。

9 :6:2011/02/23(水) 13:40:24.46
>>8

確認した。ありがと。
 


10 :デフォルトの名無しさん:2011/02/23(水) 17:45:59.06
ttp://www.excellenceweb.net/vba/class/class_method.html
このページの下の方の例文(足し算を行い、合計と平均を返すクラスの運用 その2)で
SATOU、SUZUKI、TAKAHASHI等の変数が20個も200個もある場合
整理されて、後で改造もしやすくするにはどうすればいいですか

Dim humans As Variant
humans = Array(, "SATOU", "SUZUKI", "TAKAHASHI", ・・・・・・・・
とかしてループして各メソッドを呼ぶんですかね

11 :デフォルトの名無しさん:2011/02/23(水) 18:21:24.52
>>10
俺だったら配列で引き渡すわ
それが個人的には1番楽だし改修も引数だけでいいしね

あと、Variantは関係ない

12 :デフォルトの名無しさん:2011/02/23(水) 20:53:31.46
WinXP sp3 Excel 2003

1024列×768行の数値が書かれたCSVファイルをラインモードで読み込み、平均した後、
256列768行にして数値を入力するような命令を実行しています。
この数値の中で、ある値以下の平均を取っていき、その変動が最小になる値を求めたいです。
(10以下平均-9以下平均)、(11以下平均-10以下平均),,,,(30以下平均-29以下平均)
Averageifがないので、SUMIF()/COUNTIF()のように計算させ、Do loop等で
順番に計算させようとしたところフリーズしてまともに計算できません。

そこであらかじめシートの方に、A列にSUMIF/COUNTIFを入力し、
B列にA3-A2のように入力し、B列が最小になる行のA列の値を取得しようと思います。
どのようにしたらよいでしょうか。またほかに何かよい方法はないでしょうか。


13 :デフォルトの名無しさん:2011/02/23(水) 21:18:54.63
>12
パフォーマンスを求めるならExcel/VBAじゃなくて.NETなり
数学計算できるソフトほうがいいんじゃないかな?

あと、どうしたらいい?じゃなくて思ったことをじゃなくてVBAやってみたら?
ロジックを考えてくれっていうのはナシの方向で。

14 :デフォルトの名無しさん:2011/02/23(水) 21:19:10.66
>>12
if文で最小値比較して、それをfor文で回すだけじゃね?

15 :デフォルトの名無しさん:2011/02/23(水) 22:21:03.12
>>13 >>14
あまり美しいとはいえないですが、
A列にSUMIF/COUNTIF
B列にA3-A2,,,,
適当なセルにSUMPRODUCT((B10:B30=MIN(B10:B30))*ROW(B10:B30))で行番号取得、
Cells()でA列のこの行番号の値を入れて取得でできました。
SUMIF/COUNTIFもマクロ上だと重いですが、セル上だとさくっといくみたいです。




16 :デフォルトの名無しさん:2011/02/24(木) 00:38:00.27
>>12
たかだか70万件のデータでフリーズするとは、あきらかにプログラムがタコだな
アルゴリズムをよく考え直した方がいい

まあ、とりあえずExcel2010買ってこい
小細工しなくても1024列のデータがそのまま読み込めるから
プログラムが少し楽になる

17 :デフォルトの名無しさん:2011/02/24(木) 01:11:43.68
>>16
ど素人ゆえプログラムもかなりのへたれですが、
パソコンもへたれです。pen4世代のCeleron1.8Gのノート。
会社パソコンなもので、ハード、ソフトともにアップデート不可です。



18 :デフォルトの名無しさん:2011/02/24(木) 04:04:46.60
>>12
何をやりたいのか、よく判らないが

『フリーズしてまともに計算できない』コードにはバグがある可能性が
高い気がする

昔、同じくらいのマシンで数十分かかる処理をさせた事もあるが
この場合、無限ループに陥っている可能性を疑う

それと毎回セルに書いていたりする?

その場合、
Application.ScreenUpdating = False
とかは使っている?

19 :デフォルトの名無しさん:2011/02/24(木) 05:53:39.00
フリーズ=単に時間のかかる処理の実行中でエクセルが反応しない の意味なんじゃね?

20 :デフォルトの名無しさん:2011/02/24(木) 06:31:38.57
>>12
たぶん、プログラムをちゃんと作ればそんなに時間はかからないと思うんだけど、
その説明だけでは不明な部分がいくつかあるから具体的なプログラムが示せないんだよなあ
まず「ラインモード」ってなんだ?

たぶん、文章で説明するのはかなり難しいだろうから、現物を見た方が早い
そのデータとExcelのファイルは公開できる?

21 :デフォルトの名無しさん:2011/02/24(木) 07:54:34.68
>>18
使うのが基本。

22 :デフォルトの名無しさん:2011/02/24(木) 07:57:01.13
あとメモリはいっぱい積もうな。8Gなんて今余裕だろ。
これで100万件ぐらいでフリーズしない。

23 :デフォルトの名無しさん:2011/02/24(木) 08:01:40.30
>>22
>>17の状況じゃ無理だろう

まあ、このスペックでもこのデータ量なら動くと思うけどね

24 :デフォルトの名無しさん:2011/02/24(木) 13:18:30.49
頭の弱いやつがいくら高性能パソコンでメモリいっぱい積んでも根本的な解決にはならん。
他言語でも同じ。
まず計算ロジックの見直しだな。
SUMIF()/COUNTIF()なんてのは論外だよ。
>>16の言うとおり。

25 :デフォルトの名無しさん:2011/02/24(木) 13:28:12.58
(10以下平均-9以下平均)、(11以下平均-10以下平均),,,,(30以下平均-29以下平均)をSUMIF/COUNTIFかよ。
ソートすりゃどうにでもなりそうだな。

26 :デフォルトの名無しさん:2011/02/24(木) 14:46:15.77
ピボットテーブルでグループ化して平均出せばいいんじゃないの?

27 :デフォルトの名無しさん:2011/02/24(木) 15:27:19.57
【コラム】あまりに便利すぎた・・・Excel VBAの「行き詰まり」問題〔07/02〕
http://pc11.2ch.net/test/read.cgi/pcnews/1246498806/

検索してたらこんな切ないスレがあったんだけど、今からExcelマクロ勉強するのって無駄?
まあ、ちょっと頑張って正規表現と両方憶えれば万能なんだけれども・・・

28 :デフォルトの名無しさん:2011/02/24(木) 17:07:59.98
無駄ってことも無いとは思うが、昔納品した客から
Excelのバージョンアップしたら色々問題が出て
VBA使うPCのExcelを前のバージョンにしたと聞いた

29 :デフォルトの名無しさん:2011/02/24(木) 18:28:27.62
>>27
このスレを見てればわかるとおり、VBAのエキスパートになる必要はないけど
Excelを使うならVBAは知ってた方が捗る

30 :デフォルトの名無しさん:2011/02/24(木) 18:37:52.75
このスレを見てればわかるんですか?

31 :デフォルトの名無しさん:2011/02/24(木) 19:41:43.64
VBAのエキスパートにならなくても
ここで質問すれば解決って意味でしょ

32 :デフォルトの名無しさん:2011/02/24(木) 20:37:23.79
B7からK19までを一行おきに色を付けたいと思い下の通りに
作ったのですがうまくいきません;;どこが間違っているか教
えて下さい。宜しくお願いします。

Sub test()
For CellGyo = 7 To 19 Step 1
Range("B" & CellGyo & ":" & "K" & CellGyo).Select
Selection.Interior.ColorIndex = 34
Next CellGyo
End Sub


33 :デフォルトの名無しさん:2011/02/24(木) 20:54:42.82
step 1 じゃなくて step 2

step 1ってことは、色を塗って、次はその下の行を塗る
1行ずつってことは、色をぬった行の2行下の行を塗るわけだ


34 :デフォルトの名無しさん:2011/02/25(金) 12:12:12.41
>>33
ありがとうございます!理由まで書いて頂いて本当に助かりました!!

35 :デフォルトの名無しさん:2011/02/25(金) 12:17:28.14
>>32
Sub a()
  With Range("B7:K19")
    .FormatConditions.Add Type:=xlExpression, Formula1:="=MOD(ROW(),2)=1"
    .FormatConditions(1).Interior.ColorIndex = 34
  End With
End Sub

36 :デフォルトの名無しさん:2011/02/25(金) 15:18:34.17
良スレ

37 :デフォルトの名無しさん:2011/02/25(金) 19:54:03.97
>>32
Sub b()
Dim R As Range
For Each R In Range("B7:K19")
If R.Row Mod 2 Then R.Interior.ColorIndex = 34
Next
End Sub


38 :デフォルトの名無しさん:2011/02/26(土) 00:27:10.81
みなさん昨日はありがとうございました。VBAを始めてまだ数日なので、教えて頂けてとても助かります!
今日は4月度売り上げデータのシートの値を月別売り上げ報告書のシートに転記したくて次の様に作った
のですがエラーになってしまいました;;どうしたらエラーにならないか教えてください。本を読みなが
らやりましたが分からないのでどうか宜しくお願いします。

Sub 報告書作成()
Dim CellGyo As Long
Dim HoukokuGyo As Long
Dim Tanto As String
Dim Tokuisaki As String
Dim Tiku As String
Dim Gyoshu As String
Dim Month As String
Dim Uriage As Currency
For CellGyo = 3 To 65536
Sheets("4月度売上げデータ").Select




39 :デフォルトの名無しさん:2011/02/26(土) 00:28:53.04
続き@です
Range("C" & CellGyo).Select
Tanto = Selection.Value

Range("D" & CellGyo).Select
Tokuisaki = Selection.Value

Range("E" & CellGyo).Select
Tiku = Selection.Value

Range("F" & CellGyo).Select
Gyoshu = Selection.Value

Range("H" & CellGyo).Select
Uriage = Selection.Value

If Tanto = "" Then
Exit For

MsgBox "処理が終了しました"

End If

Next CellGyo



40 :デフォルトの名無しさん:2011/02/26(土) 00:29:43.70
続きAです
Sheets("月別売り上げ報告書").Select

For HoukokuGyo = 7 To 65540

Range("C" & HoukokuGyo).Select
Selection.Value = Tokuisaki

Range("D" & HoukokuGyo).Select
Selection.Value = Tiku

Range("E" & HoukokuGyo).Select
Selection.Value = Gyoushu

Range("F" & HoukokuGyo).Select
Selection.Value = Uriage

Next HoukokuGyo

End

End Sub



41 :デフォルトの名無しさん:2011/02/26(土) 01:28:16.83
>>38
デバッグのやり方は経験を必要とするが、コードを書いたら
まず、メニューの『デバッグ』から『VBAProjectのコンパイル』を選ぶ

これにより、あなたのコードで、すぐ判るのは

Dim Gyoshu As String
で定義しているが

Selection.Value = Gyoushu

と書いているところがあり、これの定義がされていない
(つまり変数名が間違い)

なお、『ツール』メニューの『オプション』を選び、『編集』タグで
『変数の宣言を強制する』にチェックをつける事が前提

42 :デフォルトの名無しさん:2011/02/26(土) 01:32:56.49
>>38
エラーが出たなら最低限どんなエラーが出たかぐらい書け。あとExcelのバージョンも書け
エラーの原因をエスパーすると、
4月度売上げデータのH列に数字以外が入ってる行がある
Excelのバージョンが古くて月別売り上げ報告書に65540行もデータを作れない
のどっちか。でもたぶんエラーでなくても思った通りには動いてないと思うけどw
Sub 報告書作成()
    Dim CellGyo As Long
    For CellGyo = 3 To 65536
        If Sheets("4月度売上げデータ").Cells(3, CellGyo).Value = "" Then
            Exit For
        End If
        Sheets("月別売り上げ報告書").Cells(CellGyo + 4, 3).Value = Sheets("4月度売上げデータ").Cells(CellGyo, 4).Value
        Sheets("月別売り上げ報告書").Cells(CellGyo + 4, 4).Value = Sheets("4月度売上げデータ").Cells(CellGyo, 5).Value
        Sheets("月別売り上げ報告書").Cells(CellGyo + 4, 5).Value = Sheets("4月度売上げデータ").Cells(CellGyo, 6).Value
        Sheets("月別売り上げ報告書").Cells(CellGyo + 4, 6).Value = Sheets("4月度売上げデータ").Cells(CellGyo, 8).Value
    Next CellGyo
    MsgBox "処理が終了しました"
End Sub
やりたいのはこういうことじゃないのか

43 :42:2011/02/26(土) 01:43:43.61
>>41
うは、普通に見落としてたわ

ちなみに、『変数の宣言を強制する』は後からチェック入れてもダメだからな
あれは最初からコードの頭にOption Explicit入れてといてくれるだけだから

俺の感では今回はおそらくそのエラーではないと思うが

44 :41:2011/02/26(土) 07:33:55.33
>>43
実は、同感

何度か回答してきたけど、デバッグの基本的なやり方とか
書いておかないと、きりがない気がしてきたのでw

コンパイルとブレークポイントを覚えるだけで質問以前に
解決する事例も少なくないように思う

45 :デフォルトの名無しさん: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

ただ、質問主さんが説明不足なので分かりませんが、
もしかしてこのシート、別々のブックだったりしませんかね?
同じブックの中でこんな転記したってあまり意味が無い作業のような・・・
本来は、全体の売り上げデータが入ったブックから担当ごとのブックに転記、
という作業なんじゃないかなぁという気がします。
(それにしては担当者の選択処理が無いけど)


46 :デフォルトの名無しさん:2011/02/26(土) 12:32:13.66
個人的な好みで言えば、同じオブジェクトを何度も参照する時はWith、
複数ある時は変数にまとめたいところ

Set WS = Sheets(Write_Sh).Cells(CellGyo + 4, 3)
Set RS = Sheets(Read_Sh).Cells(CellGyo, 4)
WS.Offset(0, 0).Value = RS.Offset(0, 0).Value
WS.Offset(1, 0).Value = RS.Offset(1, 0).Value
以下略

わざわざOffsetを並べてるのは、セル番号が不自然に飛んでるから、
あとで参照先を増やしたり減らしたり改造が必要になる可能性がありそうだから
修正箇所をわかりやすくするのが目的

47 :38:2011/02/26(土) 12:55:34.54
何のエラーか書いていなくてすみません。次からはちゃんと分かって頂ける
ように書きます。エクセルは2007です。そして2つのシートは同じブックの
ものです。
これは実際仕事で使うものではなく通信教育の課題です。もっと勉強して
から課題に取り組めば良いのですが提出期限明後日なので・・・。
みなさんありがとうございました!!


48 :デフォルトの名無しさん:2011/02/26(土) 14:43:42.65
GetAsyncKeyStateで何かボタンが押された処理はどうするのでしょうか
Cでいうwaitkeyです

Do
If GetAsyncKeyState Then Exit Do
Loop
したいのはこういう感じです

49 :デフォルトの名無しさん:2011/02/26(土) 15:01:05.26
>>48
ここに書くより検索した方が早い気がする

vba GetAsyncKeyState で検索

キーボードからの入力を判定する
ttp://www.happy2-island.com/excelsmile/smile04/capter00301.shtml

50 :デフォルトの名無しさん:2011/02/26(土) 15:19:28.38
言い忘れていました
引数を指定せずに何でもいいのです

51 :デフォルトの名無しさん:2011/02/26(土) 17:45:12.39
>>50
>>49を参考に出来ると思うのだが?

GetAsyncKeyState は、256 とおりの仮想キーコードのいずれかを指定することで
そのキーが押されたかどうか調べるわけだから、マウスボタン等の不要なキー以外の
いずれかが押されれば、Loopを抜ければいいんじゃないの?

まあ、Escキーを押されたらというのは工夫がいるかもだけど

52 :デフォルトの名無しさん:2011/02/26(土) 19:12:23.20
まあ、最終的に何をやりたいかが判らないけど

UserFormのKeyDownイベントで拾うという方法も考慮してもよいかもね

53 :デフォルトの名無しさん:2011/02/26(土) 23:22:42.06
testtese

54 :デフォルトの名無しさん:2011/02/27(日) 12:38:40.55
Private Sub Main()
 Dim c As Variant,i As Long
 c=ThisWorkbook.Worksheets("Sheet1").Range("A1:V17616")

 For i = 0 To 999999999999999
  calc c
 Next i
End Sub

Main内で全く変更されない変数cがあって、その変数cがcalc関数にパラメータとして渡される場合
変数cはモジュールレベル変数とした方が良いか、ローカル変数とした方が良いかアドバイス下さい

55 :デフォルトの名無しさん:2011/02/27(日) 12:40:19.82
訂正
全く変更されない
    ↓
c=ThisWorkbook.Worksheets("Sheet1").Range("A1:V17616")以降全く変更されない

56 :デフォルトの名無しさん:2011/02/27(日) 12:41:53.94
Step 1 も忘れてた

57 :デフォルトの名無しさん:2011/02/27(日) 12:48:31.23
>>54
変数等のスコープは可能な限り狭いほうがいい。

58 :デフォルトの名無しさん:2011/02/27(日) 12:56:40.38
>>57
パラメータとして渡した方が良いんですか
ありがとうございました

59 :デフォルトの名無しさん:2011/02/27(日) 13:03:14.09
>>57
それ、何故か?ということについて、
詳しく開設されている本とかサイト知りません?

60 :デフォルトの名無しさん:2011/02/27(日) 13:13:43.94
その変数がどこで使われているのかとか判り辛くなるから。
一ヵ月後に修正とかしようとすると簡単に死ねる。
>>54 の例だと、cに設定した内容が他で参照される可能性とか
考えなくてはならなくなる。
ローカル変数なら、そもそもあり得ないから頭を使わなくて済む。

61 :デフォルトの名無しさん:2011/02/27(日) 13:18:38.19
>>59
>>57じゃないけど

友人がシステム保守の仕事をやっているわけだが
パブリック変数を安易に使うな!と怒っていたなw

パラメータで渡しておけばデバッグは相当楽になる
(大抵はその関数だけ見ておけばよい)

自分は一人で組んでいる場合は、パブリックに逃げる癖があるけどw

62 :デフォルトの名無しさん:2011/02/27(日) 14:52:46.52
>>59
個人的には、
メソッドを後でコピペで再利用しようと思っても出来ない。
変数の状態が追跡しにくい。

その中でもフラグ系は特にひどいな。

63 :デフォルトの名無しさん:2011/02/27(日) 15:44:55.87
>>61>>62
なるほど。ありがとうございました。

今、高速化する方向で書いている最中なので気になりました。

64 :デフォルトの名無しさん:2011/02/27(日) 16:20:28.94
>>63
可読性や安全性、バグの出にくさと処理速度は反比例するからねー
コア部分をうまくモジュール分けしてブラックボックス化するぐらいしか対応策はないと思う

65 :デフォルトの名無しさん:2011/02/27(日) 16:28:14.74
引数渡しをパブリック変数化することで高速化?

まずは本当にそこがネックになっているか確認したほうがいいと思うよ。

66 :デフォルトの名無しさん:2011/02/27(日) 16:32:31.54
>>65
違う。ループ内とかのブロック変数の話。


67 :デフォルトの名無しさん:2011/02/27(日) 16:40:19.75
VBA でブロック変数って With しか思いつかないんだけど、
どこからそんな話が出てくるんだ?

そもそも >>58 で、「パラメータとして渡した方が良いん
ですか」と言ってるし。

68 :デフォルトの名無しさん:2011/02/27(日) 16:47:40.93
>>67
すみません。>>57から乗りました。
ブロック変数じゃなくてブロック内定義変数について
気になってました。

69 :デフォルトの名無しさん:2011/02/27(日) 17:33:48.88
だから、そもそも VBA に With 以外のブロックなんてないだろ。

これ以上何か聞きたいなら、>>52 のようにソースとともに書き
込んだほうがいいよ。

70 :デフォルトの名無しさん:2011/02/28(月) 09:46:25.98
>>54だったら定数化もありだね。
const付けられないから変数になっちゃうけど。

71 :デフォルトの名無しさん:2011/03/01(火) 10:29:40.84
問題で月別売上集計のマクロを作成しないといけないのですがわからないのでどなたかおしえてください!
例えばセルB2からセルB299までに1年分の日付がランダムで入力されてるとします。
で、セルK2からセルK299に金額がランダムで入力されています。
マクロを使って月別の売上を出すにはどのようにしたらよろしいですか?
説明が下手で申し訳ないです

72 :デフォルトの名無しさん:2011/03/01(火) 10:56:03.69
VBA使わずDSumでいけるという話だが
あえてなおVBAならWorksheetfunction.DSum


73 :デフォルトの名無しさん:2011/03/01(火) 11:04:52.81
ありがとうございます!
VBAでしないといけないのです。。。
とりあえずWorksheetfunction.DSum
でやってみます




74 :デフォルトの名無しさん:2011/03/01(火) 11:54:19.80
何度もすみません
1月の集計 ○○円
2月の集計 ○○円
・・・
と続くのですが月別にするのがわかりません。。。
またアウトラインを使わないといけないのですが
1、総計
2、月別
3、全体の表示
としないといけないのですがわかりません。
どなたかおしえてください

75 :デフォルトの名無しさん:2011/03/01(火) 12:48:31.73
>>74
アウトラインって集計か?
集計とか統合はウンコだから覚えなくてよい。
ピボットテーブルを覚えりゃよい。
月でグループ化すれば簡単だ。
ピボットテーブル使えない人は日付でソートして同じ月の間だけ加算していくマクロになるが,、ピボット覚えた方が楽。

76 :デフォルトの名無しさん:2011/03/01(火) 12:55:41.90
VBAでやるにしたって、ソートなんて必要ないだろ…
月をインデックスとした配列に順番に足すだけ

77 :デフォルトの名無しさん:2011/03/01(火) 13:07:26.23
>>76
1年分の月に関しては確かにそうだな。
一般的なピボットの内部ロジックを書いた。

78 :デフォルトの名無しさん:2011/03/01(火) 13:11:52.15
複数年の月別でも列が年で行が月とかなら次元配列でもいいか。

79 :デフォルトの名無しさん:2011/03/01(火) 13:12:42.21
上は2が抜けた。

80 :デフォルトの名無しさん:2011/03/01(火) 15:32:01.88
問題でって書いてるから、まあなんかの実習問題なんだろうけど
それってVBAでやれって問題なのか?

VBAでやるのにアウトライン使えとか普通ないだろ
エクセルの機能とかの実習ならむしろVBAつかっちゃいかんのじゃないか

81 :デフォルトの名無しさん:2011/03/01(火) 20:32:10.83
>>74
VBAで「ピボット操作して集計シートにコピペ」までやれば
「マクロを使って月別の売上を出」したことにならないかな。
同じ結果を出すなら、自作コードでやるより
エクセルの機能を使ったほうが明らかに動作速いし。


82 :デフォルトの名無しさん:2011/03/01(火) 21:23:33.63
ワンタッチで全部済むと
とても気分はいいけどな

83 :デフォルトの名無しさん:2011/03/02(水) 01:22:15.86
>>81
月別なら自作の方が速いだろ?

84 :デフォルトの名無しさん:2011/03/02(水) 13:38:32.17
置換について分からないことがあるので教えてください。
セルA1に文字と数字が入った
ABC123DEFというような文字列があります。
この中の数字のみ(文字も数字も桁数は一定ではありません)
置換したいのですが、例えば0から200の間であれば置換
というようにReplaceを使った場合指定する方法はあるのでしょうか?
お願いいたします。

85 :デフォルトの名無しさん:2011/03/02(水) 14:12:05.65
>>84
ない
数字と文字を分けて数字の大きさを判断して置き換える、というプログラムを自分で作る必要がある

86 :デフォルトの名無しさん:2011/03/02(水) 18:43:35.02
流れぶった切ってすみませんが、どなたか教えてください。
Win7 64bit、Excel2007、CPU Corei7 980X、メモリ12GB の環境です

まず一地点分のファイル(新規ワークブック)を作成して、
次に
一日分のデータ(一つ30MBぐらいのcsvファイル)を開いて、
その中の一列(約43万行)を新規ブックにコピー
クローズして次のcsvファイルを同様に処理、
一か月分で新規ブックを保存、
新たな新規ブックを作成
というのを30回ほど繰り返すマクロがあるのですが、
(つまり30地点、30日で計900回オープン、クローズを繰り返す)
このマクロが処理の途中でよく止まりました。
(エクセルは起動しているがマクロは終了している
エラーメッセージも特に無し)
タスクマネージャで見てもCPU使用率もメモリ使用量も20%弱なので
PCスペックの問題ではなさそうなのですが、
エクセル上のリソース不足を疑いました。

そこでWebで調べたら
DoEventsという命令を実行させれば良いらしいと分かったので、
実際に試したら確かに止まらなくなりました。
ただ、なぜ効果があるのかが分からないのでちょっとモヤモヤしてます。

どなたか、DoEventsにどのような効果があるのか教えてください。

87 :デフォルトの名無しさん:2011/03/02(水) 18:59:19.45
VBAからタスクが帰ってこないことを無限ループとみなしてExcelが強制的にストップさせてたのを
DoEventsで定期的にExcelにタスクを回すことで処理が継続できるようになったとか

勘ですまん

88 :デフォルトの名無しさん:2011/03/02(水) 21:26:05.84
>>84
正規表現で数字を取得してCintした数値を条件分岐すれば良い

89 :86:2011/03/02(水) 22:16:20.31
>>87さん
どうもありがとうございます。
無限ループですか。
確かにForNextで地点ごとのループと、一月分のループをネストして
その中でひたすらオープン・コピー・クローズを繰り返してましたから
無限ループに近かったかもです。
処理を完走させるには10時間以上回しっぱなしで、
その間エクセルでは他の作業が一切出来ませんでした。

私はファイルオープンしたときに確保したメモリを
ファイルクローズ時にきちんと解放できていないのではないかと疑っていましたが、
理由はなんにせよ、
エクセルには止まるなら止まるで何らかのアナウンスをしてほしいところですね。
マクロ停止の理由はともかく、
それを何らのエラーメッセージも出さずにただ止まるだけというのは
アプリケーションの挙動としてどうかと思いますね。

90 :デフォルトの名無しさん:2011/03/02(水) 23:26:44.73
splitに関してお聞きしたいことがあります。
セル内の最後の空白から前と後ろで分けたい場合
どのように記述すればよいでしょうか?

91 :デフォルトの名無しさん:2011/03/02(水) 23:43:33.04
>>90
InStrRevで場所を特定して分割すればいいんじゃないか?
Splitで返された配列の最後の一つ以外を繋ぎ直す手も無くはないけど。

92 :デフォルトの名無しさん:2011/03/03(木) 00:08:10.26
>>89
何となくですが、

Application.ScreenUpdating = False

が記述されていない気がします。

何回もオープン・コピー・クローズしたため、
描画の方に問題が生じた可能性は無いでしょうか?

93 :デフォルトの名無しさん:2011/03/03(木) 00:09:29.80
>>89
>マクロ停止の理由はともかく、
>それを何らのエラーメッセージも出さずにただ止まるだけというのは
>アプリケーションの挙動としてどうかと思いますね。

いや理由は大事なんだが
VBAのエラーなのに何のメッセージもなく停止するのは確かにどうかと思う
が、あまりそういう状況は見たことがない
VABが無限ループしたからと言って、勝手に停止する機能も聞いたことがない
(スタック不足等のエラーで止まることはあるけど)

それらがDoEventsで解消される理由もわからない
あれは制御をいったんOSに戻すだけのものだが
(まあ、DoEventsについては不思議な副作用を起こすことはまれによくあるが)

実際にはエラーでとまってるのに、エラーハンドリングが適切じゃないので
だまって停止したように見えるだけじゃないかと思うんだが、差し支えなければ
実際のコードを晒してみてはくれないか


294 KB
★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.04.00 2017/10/04 Walang Kapalit ★
FOX ★ DSO(Dynamic Shared Object)