Excel VBA 質問スレ Part18

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
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ってやってみなよ。
96: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
やりたいのはこういうことじゃないのか
4342:2011/02/26(土) 01:43:43.61
>>41
うは、普通に見落としてたわ

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

俺の感では今回はおそらくそのエラーではないと思うが
4441: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を並べてるのは、セル番号が不自然に飛んでるから、
あとで参照先を増やしたり減らしたり改造が必要になる可能性がありそうだから
修正箇所をわかりやすくするのが目的
4738: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した数値を条件分岐すれば良い
8986: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については不思議な副作用を起こすことはまれによくあるが)

実際にはエラーでとまってるのに、エラーハンドリングが適切じゃないので
だまって停止したように見えるだけじゃないかと思うんだが、差し支えなければ
実際のコードを晒してみてはくれないか
94デフォルトの名無しさん:2011/03/03(木) 00:17:18.88
>>89
Application.Calculation = xlManual
も入れた方がいいな

今どきの64bitマシンで、ファイルをたった900個開く程度で落ちるなんて考えられん
計算してみると1ファイルあたり40秒もかかってることになるわけで
全体で10時間というのも、ちょっと遅すぎる気がする

いっぺんコード晒してみ?
9590:2011/03/03(木) 00:38:13.04
>>91
お陰さまで無事成功しました。
ありがとうございます。
ただ、こんなことで躓いていてはまだまだだなーと・・・
96デフォルトの名無しさん:2011/03/03(木) 00:45:42.87
VBAだし43万行だし、40秒はあり得ない話ではなさそう
ところでOffice 2007って32bitアプリじゃないの?
32bitプロセスってメモリ空間2GBしか使えないんじゃなかったかな。12GBの20%弱ってそれに合ってるよね。
メモリの問題ではないかもしれんが、もしかしたらDoEventsでガベージコレクトできるようになって、メモリが解放されたから動く、とか。
9786:2011/03/03(木) 00:47:46.46
>>92-93
どうもすみません、コードを出したくても会社のPCにしか入ってなくて
しかもデータの持ち出し禁止なのでちょっと提示できません。
一応、守秘義務契約もあるのでデータの詳細も明かせないのですが、
頭で覚えてる範囲で書きますと以下のような流れです。

Application.ScreenUpdating = False
Application.Calculation = xlManual
でシートの再計算と画面更新を停止
For i= 1 to 30 '地点ごとループ
転記用の新規ブック作成
For j=1 to 30 ’日を表すループ(実際の日数は31とか28とかの事もあります)
i地点、j日 のCSVファイルをひらく
新規ブックの J列にCSVのデータをコピー
CSVクローズ
Next j
i j を基にした名前で新規ブックを保存
Next i
シートの再計算と画面更新を再開
大体こんな感じです。
扱うデータの大きさはちょっと大きめですがマクロとしては至極単純なものだと思います。
エラー処理は入れてませんが、起こりうる可能性のあるエラーとしては
読み込み元のCSVファイルが存在しないとか、
保存するブックと同名のファイルがすでに存在する、などがありますので、
そういったエラーは起きないようにマクロ実行前にファイルの確認はしています。
(というかそういうミスではエラーメッセージがちゃんと出ます。)
・・・ちょっと自分でも分かりにくい説明なので、
明日にでもコードをきちんと確認して再度書き込みさせていただきます。
9886:2011/03/03(木) 00:52:25.74
>>95-96
すみません、>>93を読んでからリロードせずに書いてたので
気づきませんでした。
アドバイスどうもありがとうございます。
9986:2011/03/03(木) 00:54:40.63
うわぁぁぁぁテンパッてて安価ミスった。
>>95-96ではなく
>>94さん、>>96さんでした。
ほんとすみません
100デフォルトの名無しさん:2011/03/03(木) 00:56:32.61
あとCorei7 980Xは12スレッドだから、Excelが計算に2スレッドをフルに使えば20%弱だな
たしか設定で使うスレッド数を決められた様な気がするから、増やせばもっと早くなるかもね
101デフォルトの名無しさん:2011/03/03(木) 02:03:48.35
行数だけでなく列数も書いてもらえると、再現実験がやりやすくなるんだけどなあ
102デフォルトの名無しさん:2011/03/03(木) 06:58:58.41
>>97
保証はできないけれど

For j=1 to 30 ’日を表すループ(実際の日数は31とか28とかの事もあります)
i地点、j日 のCSVファイルをひらく
新規ブックの J列にCSVのデータをコピー
CSVクローズ
Next j

の、CSVクローズの直後か直前に、新規ブックを保存 した方が良い気がする

昔、ワードのVBAで新規ファイルを大量にいじる処理をした時、
同様のエラーが出て、随時保存で解決した

ワードとエクセルは違うかもだけ、大量の変更履歴を内部的に
保持できなくなったのが原因の模様だった
103デフォルトの名無しさん:2011/03/03(木) 07:12:56.83
>>97
それと

『エラー処理は入れてませんが』

とあるけど、転ばぬ先の杖で入れた方が良いと思う

ホント、世の中、びっくりするようなことが起きるもんだってw
104デフォルトの名無しさん:2011/03/03(木) 07:29:56.33
>>97
五月雨式で、申し訳ないがもう一つ

それだけ長い処理だと、自動バックアップが影響しているのかも?
(結果的に>>102、あるいは自動バックアップをオフにするべきか?)
10586:2011/03/03(木) 07:38:10.09
>>100-104
おおっ!
みなさん有難うございます。
出勤前でばたばたしてますのでひとまずお礼のみで失礼します。
良かったらまた今晩よろしくお願いします。
106デフォルトの名無しさん:2011/03/03(木) 15:11:28.92
とある文字列をA1からA1000までの中から検索するときに
forとifで比較しながら探すのって馬鹿なんでしょうか・・・
107デフォルトの名無しさん:2011/03/03(木) 17:55:24.96
forは使うけど、variable型配列に入れてInStrを使うかな
108デフォルトの名無しさん:2011/03/03(木) 18:04:11.98
>>106
個人的信条ですが、プログラムは正しく動くなら問題なしです^^

ただ、より簡単な方法もあります

ご参考まで

Sub test()

Dim FindCell As Range

'A1:A1000の中から最初に"xyz"が入力されたセルを探します
Set FindCell = Range("A1:A1000").CurrentRegion.Find(What:="xyz")

If FindCell Is Nothing Then
MsgBox "検索に失敗しました"
Else
MsgBox "見つかりました"
FindCell.Select
End If

End Sub
109108:2011/03/03(木) 18:14:32.29
追記
>>108の例ですと、部分一致の場合も見つかったと言いますので注意してください

完全一致のものを探すならば

Set FindCell = Range("A1:A1000").CurrentRegion.Find(What:="xyz", lookat:=xlWhole)

と、lookat:=xlWholeを指定の必要があります
110108:2011/03/03(木) 18:26:52.55
さらに追記

CurrentRegionは、不要ですね

Set FindCell = Range("A1:A1000").Find(What:="xyz", lookat:=xlWhole)

このサンプルは、『vba range 検索』で検索して見つけた

Office TANAKA - Excel VBA講座:セルの操作[セルの検索]
ttp://officetanaka.net/excel/vba/cell/cell11.htm

を参考に(というか、ほぼまる写し)しています
111デフォルトの名無しさん:2011/03/03(木) 20:37:06.02
Excel2007


Sub settest()
Const dataf As String = "test"
Dim datafile_path As String

datafile_path = "g:\data\"
Set ws3 = Workbooks(datafile_path & dataf & ".xlsx").Worksheets("test") ←エラー部分

Set ws3 = Nothing
End Sub

インデックスが有効範囲にないってエラーになります

ファイル及びtestシートの存在は確認しています
回避方法を教えてください
112デフォルトの名無しさん:2011/03/03(木) 21:07:27.25
Excel 2003と2007、XP SP3またはVistaが対象です。
諸事情あって、VBAからWin32 APIを直接使っています。

DIBを使って画像処理をしているのですが、ワークスペース上の画像を
直接LoadImage(API)するような荒業ってありますでしょうか。

今は、SaveAsを使いxlhtml形式でまるごと保存>そのうち画像ファイルをLoadImageでメモリ上にロード
>保存しているファイルを削除・・・・という方法でやっていますが、どうにも泥臭くて・・・。
113デフォルトの名無しさん:2011/03/03(木) 21:37:58.59
>>111
Workbooksの使い方が間違っているとおもう
Workbooks(....)は既にオープンされている ブックにしか使えない

  Set wb = Workbooks.Open(datafile_path & dataf & ".xlsx")
  Set ws3 = wb.Worksheets("test")
又は
  Set ws3 = Workbooks.Open(datafile_path & dataf & ".xlsx").Worksheets("test")

後処理で ブックを クローズ(場合によってはセーブ)する事を考えると前者の方が良いと思うけど
wb.Close とかね
114デフォルトの名無しさん:2011/03/03(木) 22:58:30.23
グラフに誤差範囲をVBAでつける事って可能ですか?
ユーザー設定でマスを指定したいです。
可能ならばやり方をお教えください。
windows7 SP1でExcel2007です。
115デフォルトの名無しさん:2011/03/04(金) 00:59:02.91
11686:2011/03/04(金) 01:20:52.85
86です。昨日の続きをよろしくお願いします。

必要ない部分は省きましたが大体こんなコードです。

モジュールの頭に
Option Explicit
Option Base 1
が書いてありまして、
Application.ScreenUpdating = False
Application.Calculation = xlManual
も実行済みです。
また、下記変数は親プロシージャから引数として渡してます。

Dim Mnth As Long '月
Dim Yr As Long '年

11786:2011/03/04(金) 01:22:26.42
Private Sub ファイル集計(ByVal Yr As Long, ByVal Mnth As Long)
Const POINT_COUNT = 30 '地点数
Dim MyLdPth As String '読込元のパス
Dim MySvPth As String '保存先のパス
Dim MyFldr As Variant '地点名
Dim MyNwBk as Workbook '新規ブック
Dim i As Long
Dim j As Long
MyLdPth = "C:\****\****\"
MySvPth = "C:\****\****\"
MyFldr = Array(***,***,***,***,……) '各地点の名称セット
For i = 1 to POINT_COUNT
Set MyNwBk = Workbooks.Add(xlWBATWorksheet)
'本来はここに1列目に時刻、1行目に日付を入れる処理が入ってます。
'約43万行とは0.2秒刻みで24時間 = 43,2000行です。
For j = 1 to MnthCnt(Yr, Mnth) '月の日数はFunctionで処理してます
Workbooks.Open(MyLdPth & MyFldr(i) & "\" & Format(i,"00") & "_" & Yr &
Format(Mnth,"00") & Format(j,"00") & ".csv")
With ActiveWorkbook.Sheets(1)
.Columns(4).EntireColumn Copy Destination:= MyNwBk.Sheets(1).Cells(2,j+1)
End With
ActiveWorkbook.Close
'**** ここにDoEvents を入れたら止まらなくなりました。 ****
DoEvents
Next j
MyNwBk.Close SaveChanges:=True, FileName:= MySvPth & "\" & MyFldr(i) &
"_" & Yr & Format(Mnth,"00") & ".xlsx"
Set MyNwBk = Nothing
Next i
End Sub
11886:2011/03/04(金) 01:23:18.98
'月の日数を求める関数
Private Function MnthCnt(ByVal Yr As Long,ByVal Mnth As Long) As Long
Select Case Mnth
Case 1, 3, 5, 7, 8, 10, 12
MnthCnt = 31
Case 4, 6, 9, 11
MnthCnt = 30
Case 2
MnthCnt = CDate(Yr & "/03/01") - CDate(Yr & "/02/01")
End Select
End Function

現時点で(DoEventsがあれば)問題なく動作してますので
ループ中でのブック保存などは入れてません。
現状でもファイルのオープンとクローズ(セーブ含む)に一番処理時間がかかって

いるので、ループ中に保存処理を入れると処理速度が極端に遅くなりそうです。

エラー処理については、
何をチェックすべきかも良く分かっていません。
先にも書いたとおり
ループ中でオープンするファイルは確実に存在しているので、
他にチェックすべきものが思いあたらないです。
11986:2011/03/04(金) 01:36:28.13
>>117 におかしなところがありました
正しくはこうです

With ActiveWorkbook
.Sheets(1).Columns(4).EntireColumn Copy Destination:= MyNwBk.Sheets(1).Cells(2,j+1)
.Close
End With
120デフォルトの名無しさん:2011/03/04(金) 03:18:05.71
>>117
Workbooks.Addでは追加したブックがアクティブになるとの記載があるが
Workbooks.Openにはその保障はなさそうだ(EXCEL2007のヘルプによる)
なので With ActiveWorkbook.Sheets(1)のなか辺りでエラーが出てる可能性はある

その位置でDoEventsいれて正常に動作するなら、連続でオープンクローズすると
思ったブックがアクティブになってないのが改善してるのかもしれん
OS側の処理が追いついてなかったのがDoEventsで改善されてる可能性が無いわけでもないが

いちど
Workbook.open ...
With ActiveWorkbook...

With Workbook.open ...
にして、DoEventsなしで動くかみてみたら?

ちなみに、行全部コピーして、行全部じゃないRangeに張りつけって、正常に動くのか?
121デフォルトの名無しさん:2011/03/04(金) 03:49:34.09
>>120
セルのコピペの動作は手動でやるのと同じだよ
選択範囲のサイズが違った場合は一部が切り取られたり、同じ物の繰り返しになったりする
全データコピーなら、あまりいい方法じゃないね
12286:2011/03/04(金) 03:58:15.55
>>120
ありがとうございます。
実は明日から3日間休みなので、次にPCさわれるのが月曜日でして月曜日に確認したいと思います。

>ちなみに、行全部コピーして、行全部じゃないRangeに張りつけって、正常に動くのか?

すみません、
これに関しては実はこの辺うろ覚えで書いたんで間違いかもしれないです。
会社のPCではUSBメモリその他のメディアが使用禁止なので、
VBE開いて該当部分を手書きでメモにしまして、
さらに家のPCにはエクセルが入ってないので
手書きのメモを元にメモ帳で書いたのをレスとして貼り付けました。
ですので若干おかしなこと書いてる可能性があります。
改めて確認しなおして月曜日以降に報告させていただきます。
勝手ながら今日はこれにて失礼します。
123デフォルトの名無しさん:2011/03/04(金) 07:19:11.15
>>113
遅くなってすいません。ありがとうございました。
124デフォルトの名無しさん:2011/03/04(金) 12:07:45.23
>>118
DoEventsを入れて動くのであれば、完成としてもよいかもしれない

そもそも、最初の質問が『DoEventsにどのような効果があるのか』なので
それについて考えてみた

DoEventsは、制御を一時的にOSに渡すための命令で使う例としては
数時間かかるような処理を、ボタンのクリックで中止させるような場合に
使われる

この場合、メイン処理のLoop中で、ある変数がTrueならば処理を抜ける、
さらにボタンを押すとその変数にTrueをセットするという書き方ができるが
DoEventsを使わないと、『ボタンをクリックした』というイベントが
メイン処理が終了するまでExcelに伝わらない

上の例では、人間が起こしたイベントが処理されないというものだが、
OSやExcel自身が起こしたイベントも処理できないと推測できる

質問者の例でいえば、Excelのでかいデータをスワップさせようとして
上手くいっていないのかもと推測した
125デフォルトの名無しさん:2011/03/04(金) 14:02:01.69
>>121
いやだから、手動でやると、コピー領域と貼り付け領域の形が違うため...
ってエラーになるんだが?
126デフォルトの名無しさん:2011/03/04(金) 14:55:06.80
Private Function hoge(c As Long) As Boolean
 If c > 0 Then
  hoge = True '------(a)
 End If

 If c < False Then
  hoge = False '------(b)
 End If
End Function

たとえばこういうプロシージャがあって、cが正の値だったとき
(a)の所で呼び出し元に戻ると思ってたのですが実際は
If c < False Thenまで処理が行きました
これが普通なんですか?自分はC言語のreturnと同じだと思ってたのですが
127デフォルトの名無しさん:2011/03/04(金) 14:57:30.68
訂正
自分は hoge = True はC言語の return 1; と同じだと思ってたのですが
128デフォルトの名無しさん:2011/03/04(金) 14:58:32.59
訂正
Private Function hoge(c As Long) As Boolean
 If c > 0 Then
  hoge = True '------(a)
 End If

 If c < 0 Then
  hoge = False '------(b)
 End If
End Function
129デフォルトの名無しさん:2011/03/04(金) 15:05:28.90
普通です

いやでしょうが

hoge = True '------(a)
Exit Function

と書いてください
130デフォルトの名無しさん:2011/03/04(金) 15:08:06.20
>>129
そうやるんですか!ありがとうございました!
131デフォルトの名無しさん:2011/03/04(金) 17:14:43.88
c == 0の時どうなるのか気になる・・・
132デフォルトの名無しさん:2011/03/04(金) 17:25:16.96
>>131
False

Booleanのデフォルトの値はFalseだから
133デフォルトの名無しさん:2011/03/04(金) 17:36:24.97
うん、VBAってhoge = c > 0って表記できなかったっけ?
134デフォルトの名無しさん:2011/03/04(金) 19:36:52.82
>>133
普通はそうする罠
Private Function hoge(c As Long) As Boolean
  hoge = c > 0
End Function
これなら>>131みたいな疑問は湧かないし、>>132みたいな知識がなくてもわかる
135デフォルトの名無しさん:2011/03/04(金) 19:37:38.27
>>133
聞く前に自分で試してくれないかねえ
136デフォルトの名無しさん:2011/03/04(金) 19:38:21.10
>>131
End Function

>>133
出来なきゃ困るだろw
137134:2011/03/04(金) 19:40:30.59
>>133
失礼

質問形じゃなくて、解答なのね
138135:2011/03/04(金) 19:41:19.70
ごめん

134でなくて135でした
139デフォルトの名無しさん:2011/03/04(金) 20:49:05.69
ATPVBAEN.XLAM!Histogramで作成したヒストグラムのグラフを
任意の位置、大きさに表示することは可能ですか?
140デフォルトの名無しさん:2011/03/05(土) 00:01:17.85
WorkSheetFunction.matchって#N/Aは返さないんだよな?

on error resume next
val = WorkSheetFunction.match
blnIsFind = iif(err.number=0, true,false)
on error goto 0

みたいな使い方にしないと駄目?
141デフォルトの名無しさん:2011/03/05(土) 16:36:46.74
>133
これって (hoge=c)>0 って解釈されないのかな?
=は比較演算子としてより優先して代入演算子として解釈される?
142デフォルトの名無しさん:2011/03/05(土) 17:20:16.44
試せ

以上
143デフォルトの名無しさん:2011/03/05(土) 17:48:50.84
>>141
>これって (hoge=c)>0 って解釈されないのかな?

されない。

VBA は、C と違って、文を書くところに式は書けないなら hoge = c > 0 の
"=" は、代入演算子にしか解釈されない。
144デフォルトの名無しさん:2011/03/05(土) 21:55:27.65
>>142,143
試した

(Let)a=b=cだとb=cの比較結果をaに代入
if a=b=c then...だとa=bの比較結果とcを比較

代入文だと最初の=は代入演算子なのね
で、比較式として使うと比較演算子として解釈される

比較も代入も同じ記号だけど、文脈で完全に区別されるのね
145デフォルトの名無しさん:2011/03/05(土) 22:37:51.89
ビジュアルプログラミング言語というものがあるようですが
将来的にEXCELもそんな感じにならないものでしょうか?
146デフォルトの名無しさん:2011/03/06(日) 09:33:14.07
そんな余裕があるなら、とっくにVBAから.NETベースに切り替わっていたと思う。
147デフォルトの名無しさん:2011/03/06(日) 21:06:06.11
.NETに移行しやすいVBAの記述法

・BASE 1を使わない
・Variantを使わない
・クラスモジュールを使う
・コレクションとかディクショナリ、FSOを使う
148デフォルトの名無しさん:2011/03/06(日) 22:07:55.91
>BASE 1を使わない
むしろ配列のインデックス0を使わない(作らない)方が分り易い。
Excelが絡む時は、VB.NETでも下限値1の配列を作ることがあるな。
>クラスモジュールを使う
使う事で大分判り易くなる時くらいか。
VBAの実装は中途半端過ぎて、よっぽどでないと使う気が起こらない。
149デフォルトの名無しさん:2011/03/06(日) 22:58:21.00
セルの値がVariant型だからVariant使うのはしょうがないもんね。
150デフォルトの名無しさん:2011/03/07(月) 01:43:06.31
つーかExcel VBAやってる人が
VB.Net移行なんてするの?
VSTOでも使う気?
151デフォルトの名無しさん:2011/03/07(月) 01:52:56.98
そんなもん人によるだろ
152デフォルトの名無しさん:2011/03/07(月) 01:53:52.74
例えばどんな場合?
Excel捨てるの?
153デフォルトの名無しさん:2011/03/07(月) 08:06:23.39
>>149
FSOで取得すりゃ全てString
154デフォルトの名無しさん:2011/03/07(月) 08:32:44.58
その前にVBAをVBにしてくれ
変な制限が多すぎる
155デフォルトの名無しさん:2011/03/07(月) 09:52:03.72
スタイルを削除したいのですが、
vbaで削除をしようとしても削除出来ないスタイルがあります。
削除出来ないスタイルは、スタイル名がハングル文字のみだったり、文字化けしているスタイルなのですが、削除する方法はありますか?
156デフォルトの名無しさん:2011/03/07(月) 11:02:56.93
ファイル名に特定の文字列がある場合処理を分岐したいんですが
If ファイル名 = "特定の文字列*" Then
で引っかからないんですが何故でしょうか
特定の文字列* の所はファイル名そのものにすれば引っかかりますがそれでは意味ないし

どなたかお願いします
157デフォルトの名無しさん:2011/03/07(月) 11:17:25.64
>>156
If 文字列 Like "*ABC*" Then

以下のサイトより参照

ワイルドカードを使った文字列の比較
ttp://www.geocities.jp/masa7251/tips/vba/vba00002.html
158デフォルトの名無しさん:2011/03/07(月) 11:25:01.25
>>157
早いレスでとても助かりました
LIKEとかすっかり忘れてました。本当にありがとうございます。
159デフォルトの名無しさん:2011/03/07(月) 11:50:13.02
>>155
名前で指定できない場合はインデックス番号で指定
160デフォルトの名無しさん:2011/03/07(月) 12:14:19.79
>>159
インデックスを指定して削除をしてみたのですが、
上手くいかないようです。
for each でも削除出来ないようです。

>>155
>名前で指定できない場合はインデックス番号で指定
161デフォルトの名無しさん:2011/03/07(月) 13:15:24.41
>>152
VBAじゃ無くてVB6以前から移行するのはよくあるよ
162デフォルトの名無しさん:2011/03/07(月) 16:16:48.65
質問です
VBEで
セルA1を指定する
つもりで次のように入力し実行すると

Sub test()
Cells("1,2").Select
End Sub

なぜかセルL1が指定されてしまいます
163デフォルトの名無しさん:2011/03/07(月) 17:13:15.10
>>162
Cells(1, 1).Select
または
Range("A1").Select
164デフォルトの名無しさん:2011/03/07(月) 19:13:03.53
>>162>>163で解決だが、Cells("1,2").Selectだと何でL1が選択されるんだ?
数字を色々変えてみるが理由が分からん。
165デフォルトの名無しさん:2011/03/07(月) 19:19:57.51
そうか、カンマが無視されてCells(12).Selectと同じってことだな。
Excel2003でCells("2,5,7").Selectなら多分A2だな。
166162:2011/03/07(月) 21:13:26.55
>>163
ありがとうございます
解決しました
>>162は一部数字が間違っています ("1,2")→("1,1")

>>165
試してみたら確かにA2になりました
端っこまでいって二列目に来たということですか?

もうひとつ質問です
今は無料のホームページを参考にしていますが
VBAを効率よく学習するにはやはり参考書を買ったり
教室に行ったりする方が良いのでしょうか?

167デフォルトの名無しさん:2011/03/07(月) 21:21:23.99
>>166
本を自宅で読むのなら、ホームページを見るのと変わらない
電車の中とか、空いている時間を活用するならそれでもいい

勉強する上で、一番大事なのは質問できる相手がいること
そういう意味では教室へ行くのがいいかもしれない
168デフォルトの名無しさん:2011/03/07(月) 21:35:09.18
>>166
そう端っこまでいって2行目に来たってことだ。
Range("B1:D2")(5).SelectならC2が選択される。

VBAの勉強なら教室行っても無駄だと思うなぁ。
とにかく何か作ってみることだな。
動けばよいって程度なら3か月もすれそれらしきものは作れる。
169デフォルトの名無しさん:2011/03/07(月) 21:49:48.65
下記ようなサンプル探しています。
Sheet1の一覧表から必要な項目だけを抜き出し
Sheet2のような形式の表に必要な項目を入れ込みたいと思います。
その時に
・納期が変わったら改ページ
の条件を付けたいと思いますが
VBAを使いSheet1から必要な項目だけをSheet2の表に入れ込むことは可能でしょうか?
ttp://uproda11.2ch-library.com/11288398.zip.shtml
DLキーは123です
宜しくお願い致します
170デフォルトの名無しさん:2011/03/07(月) 22:25:23.10
>>169
可能です。はい次の方ー
171デフォルトの名無しさん:2011/03/08(火) 18:02:38.53
dim d as new Scripting.Dictionary
は、

for each k in d.keys()


for each k in d.items()


ループさせるときにaddした順序が保たれることは保障されますか?
VBAに限らないとは思いますが。
172デフォルトの名無しさん:2011/03/08(火) 19:44:07.77
>>171
やってみりゃわかるだろ?
保障されるんだよ。
Dictionaryに限らずFor Eachじゃ順番が保障されないなんていうDQNもいるが、いままで順番を外れたのを見たことないわ。
173デフォルトの名無しさん:2011/03/08(火) 20:23:50.42
Microsoftの場合、そこら辺は大抵無難に作ってあるよね。
.NET互換のMonoとかは容赦なく保障しない作りになっているようだけど。
まあ、ドキュメントに記述されていない暗黙の了解があっさり覆されて
痛い目にあったりする事も間々あるから、慎重になる気持ちも解る。
174デフォルトの名無しさん:2011/03/08(火) 20:33:07.38
一応Microsoftの公式見解はFor Eachの順番は保障しませんってことじゃなかったっけ?
実際は順番通りだけどね。
175デフォルトの名無しさん:2011/03/08(火) 22:52:52.89
知恵を拝借
Application.GetSaveAsFilename(initialfilename:="C:\test.txt"...
と指定し実行するとダイアログ窓がでて
ファイル名前後に "(ダブルクォーテーション)が入ってしまう
ファイル名欄に "test.txt" と出てしまう
"(ダブルクォーテーション)を取るにはどうすればいいのでしょうか?
176デフォルトの名無しさん:2011/03/08(火) 23:11:44.61
コードを記述して完成したら F8 で一行ずつ確認して
正常に動くのを確認してから、マクロを実行したらエラーは
出なかったのですが、確認したのと違う動きになりました。

その後何度もF8で一行ずつ確認したのですが、正常に
動きました。なのでコードやセルの設定は間違っていない
と思うのですがこのようなことはあるのでしょうか??
また対処法があれば教えていただけないでしょうか?

分かりにくい文章ですみません。

i = .Range("A1").Value
If i <= 76 Then
.Range("B1:C1").Value = "20"
.Range("D1:F1").Value = "g/L"
Else: .Range("B1:C").Value = "-"
End If

このようなコードなのですが、
i<=76の時に 20 g/L
となるはずが - g/L
となってしまいます。
177デフォルトの名無しさん:2011/03/08(火) 23:32:21.96
>>175
すくなくともこっちで実験したらそうならなかった
環境をちゃんと書け

>>176
g/Lを消し忘れてるだけじゃないのか?
178デフォルトの名無しさん:2011/03/08(火) 23:44:33.23
>>177
いいえ、”20”が入るはずのセルに”-”と
ハイフンが入ってしまうのです。
ハイフンは ELSEの判定の時のはずなのに。
179デフォルトの名無しさん:2011/03/09(水) 00:37:53.49
>>178
いろいろコードが間違ってると思うが、とりあえず確実にELSEに行ってるなら
A1に入ってる値が数字じゃないと思われ
i = .Range("A1").Value のあとで、iの型確認してみ
180デフォルトの名無しさん:2011/03/09(水) 00:45:30.34
iを数値型で宣言してある?
>>179の言うような、評価が正しくされてない可能性がある
クイックビューかなにかで値を確認して初めて数字評価されて
デバッグ中だと正しく比較されるけど
通常の実行時は型の評価が遅延されてうまくいかない、って現象はある

確かめ方は、i <= 76 を i > 76にして、ifとelseの中身を交換してどうなるか見てみることだね
181デフォルトの名無しさん:2011/03/09(水) 00:46:56.27
>>171
が保証される旨の記載ってどこかにないの?
182デフォルトの名無しさん:2011/03/09(水) 01:14:19.92
>>179、180
iはDoubleで宣言しています。
ELSEに行っているのではなく、

If i <= 76 Then
.Range("B1:C1").Value = "20"
.Range("D1:F1").Value = "g/L"

の部分の"D1:F1"セルは"g/L"が表示されるのですが、
"B1:C1"セルのみ"20"が"-"になってしまい、TRUEとELSEの処理が
ごっちゃになっているのです。
183デフォルトの名無しさん:2011/03/09(水) 04:24:20.12
>>182
そもそもRange("B1:C")なんて言う指定はエラーだと思うが
コード晒すなら正確に。あとその前後も晒せ
とくにwithのあたりとか、ループしたりしてないかとか、ifのネスト無いかとか
184デフォルトの名無しさん:2011/03/09(水) 07:32:55.49
>>181
A Dictionary object is the equivalent of a PERL associative array.

WindowsSDKからのコピペだけど、PERLの連想配列と同等と書かれているから、
あくまで、キーと値のペアの配列として保持されていると考えて良いんじゃないかな。
よって、KeysやItemsも追加した順で返されると。
KeysやItemsの説明には、配列に含まれる全ての〜を返す、としか書いてないけど。
185デフォルトの名無しさん:2011/03/09(水) 09:24:41.75
>>182
だからそのifあたりぼ書き方がおかしいかもしんないから検証しろっつってんだろカス
もう勝手にしろ
186デフォルトの名無しさん:2011/03/09(水) 12:35:33.47
>176
Else の後ろのコロンを抜いて、
改行してから次の文をかく。
VBのコロンはただの行ラベル。
187デフォルトの名無しさん:2011/03/09(水) 13:03:40.94
On Error Resume Nextが書いてあり、Elseの綴りが間違ってるに1000億ジンバブエドル。
188187:2011/03/09(水) 13:11:03.79
On Error Resume Nexは関係ねーか。
変数の宣言を強制してないでElseの綴りを間違ったんだな。
189デフォルトの名無しさん:2011/03/09(水) 15:50:13.38
遅くなりましたが、156です。
削除出来ないスタイルは、バイナリを直接編集して、スタイル名を変更することで削除することが、出来ました。
190175:2011/03/09(水) 20:32:54.40
分かりました

InitialFileNameで設定するファイルの拡張子と
FileFilterで設定する拡張子が異なる場合(ファイル名を test.txt にしてfilterを *.xlsにした場合など)
"(ダブルクォーテーション)が付くことが分かりました
スレ汚し失礼しました
191デフォルトの名無しさん:2011/03/09(水) 20:41:52.06
187だがOption Explicitも関係なしか。
Elseの綴りを間違って、ただの行ラベルになってしまったんだな。
綴りを間違わなければ行ラベルにはならんけど、どっちにしても>>186が言うように普通の書き方はにすべきだな。
192デフォルトの名無しさん:2011/03/09(水) 21:56:00.51
>>191
まあ落ち着けよwww
193デフォルトの名無しさん:2011/03/09(水) 22:37:31.24
1ページに10行ある表があり印字データが1〜10件の場合は
そのまま1ページに印字して10件以上のデータがあった場合は
改ページプレビュでデータ件数の最後までを1ページに印字する
設定は可能でしょうか?

もしくは件数に応じて表の行の高さを変更させることは可能でしょうか?
どうかお知恵を貸してください。お願いします。
194デフォルトの名無しさん:2011/03/09(水) 23:24:44.66
182です。

昨日皆さんのアドバイスを頂いてからいろいろ検証してみました。
179さん、180さん、186さん、189さんおっしゃった通りに
すべて見直し、検証した結果上手くいきました。

原因としては他のモジュールで
.Range("B1:C1").Value = "-"
のコードがあり、記述途中での添削ミスでした。

こんな単純なミスを見逃し、みなさんを混乱させて
申し訳ありませんでした。

レスを下さった皆さんありがとうございました。
大変お騒がせいたしました。
195デフォルトの名無しさん:2011/03/09(水) 23:30:47.26
>>193
VBA使わなくても出きるような気がするが.....まあイイか

常に1ページにしたいなら
PageSetup オブジェクトで
 Zoom = False
 FitToPagesWide = 1
 FitToPagesTall = 1
で出来ると思うよ

後 行の高さを変更するには RowHeight プロパティを使う
196193:2011/03/10(木) 01:19:52.34
>>195
ありがとうございます。
手が空いたら実践してみようと思います。
197デフォルトの名無しさん:2011/03/10(木) 23:58:15.65
自分で作成したユーザーフォームのことについて質問です。
現在は開発タブからVBを開いて実行という形をとっていますが
これらの操作をショートカットや他の方法で簡略化することは可能でしょう?
何か解決策ありましたら教えてください。
198デフォルトの名無しさん:2011/03/11(金) 00:18:50.04
>>197
フォームを呼び出すマクロを作れば、マクロには自由にショートカットキーが設定できる
199デフォルトの名無しさん:2011/03/11(金) 00:32:16.35
保護について教えて下さい。
シートを保護する時にロックをしてるセルを選択出来なくなる
する奴あるじゃないですか?
あれをやると時々エクセルの挙動がおかしくなります。

矢印キーが効かなくなったり
アクティブセルの周りに普段なら出る黒い枠線が出なかったりとか。
スクロールロックが掛かってるとかそんなんじゃないです。
ロック有り無し関係なくして、シートイベントで制御した方が良いでしょうか?

前から時々なってて、ぐぐって調べたんですが
特にこれと言って解決策が見つかりません。
これだという絶対的な発生条件も不明です。なったりならなかったりします。
200デフォルトの名無しさん:2011/03/11(金) 01:11:04.04
>>197
一応ショートカットです。
Alt+F8 マクロの実行
とか 
Alt+F11 VBEの起動
とかはどうですか?
201デフォルトの名無しさん:2011/03/11(金) 12:39:01.06
>>199
VBA?
202197:2011/03/11(金) 13:31:31.80
>>198
>>200
ありがとうございます。
VBA奥が深いですね。
203デフォルトの名無しさん:2011/03/12(土) 07:46:57.11
別のPCのエクセル2003で作成したマクロを、別のPCのエクセル2010で動かそうとすると、
「マクロが実行できません。このブックでマクロが使用できないか、
またはすべてのマクロが無効になっている可能性があります。」
と表示されます。エクセル2010で作成したマクロは2010で当然動きます。
なにが理由か分かりません、助けてください。
204デフォルトの名無しさん:2011/03/12(土) 14:18:36.86
>>203
まくろが無効になってるから。
マクロ有効ファイルで保存しなおすか、
オプションでマクロの設定を変更するか、
信頼できる発行元の設定をすればいける。
205デフォルトの名無しさん:2011/03/12(土) 14:21:17.24
無効になってたら2010も無理なんじゃね?
206デフォルトの名無しさん:2011/03/12(土) 14:56:38.84
>>204 信頼できる発行元以外は全て設定しました。
>>205 なぜ無効になるのでしょうか?なんか分かります?
207デフォルトの名無しさん:2011/03/12(土) 15:42:26.87
なんか2010になってそこらへん変わってるな
それで駄目ならこれとかやってみれば。
http://okwave.jp/qa/q6197506.html
208204:2011/03/12(土) 16:57:07.81
>>206
.xlsm形式でブックの保存をし直してみましたか??

209デフォルトの名無しさん:2011/03/12(土) 19:17:14.67
>>207 うん。試してみます。
>>208 はい。マクロ有効のファイルにしましたがダメです・・・。
210デフォルトの名無しさん:2011/03/12(土) 19:26:05.43
>>207 だめでした・・・。
211デフォルトの名無しさん:2011/03/13(日) 21:36:27.84
>>210
なんでかって言われると、マクロを悪用したトラブルが世界中で起きたから、
簡単には使えないように制限をかけたんだよ。

マクロを使うには、まずマクロ有効ブックとして保存しなおしたあと、
そのファイルを保存したフォルダを「信頼できる場所」に登録しなきゃいけない。
212デフォルトの名無しさん:2011/03/13(日) 22:06:13.43
>>211 有効ブックにして信頼できる場所にしています・・・。
213デフォルトの名無しさん:2011/03/14(月) 03:17:11.77
>>212
もしかして64bit版Excelだったりしない?
32bitのマクロはそのままだと使えない機能があるんだけど
214デフォルトの名無しさん:2011/03/18(金) 16:53:15.33
public const が良く分かりません

Public test as Range
Public const test = range("A1")

sub a()

test.value = 1

end sub

このように使いたいのですがうまくできません
どうすればいいでしょうか
215デフォルトの名無しさん:2011/03/18(金) 17:00:54.87
うまくできません って言われてもな

エラーが出るのか処理が思った通りに行かないのか
エラーが出るならそのメッセージを、
思った通りに行かないのなら現在どうなっていてどういうふうになってほしいのか

そういう情報を書け
216トリプルクリック:2011/03/18(金) 19:08:15.10
>>214
こうか?

Sub a()
Dim rangeA1 As Range

Set rangeA1 = Range("A1")
rangeA1.Value = 1

End Sub
217デフォルトの名無しさん:2011/03/18(金) 23:43:20.20
BMPのピクセル情報を取得して1ピクセル=1セルとして扱って
エクセルで画像を再現できると聞いたのですが詳しく教えてくれませんか?
VBAでそういうことできるらしいのですがまったくわかりません
誰かわかりやすい解説サイトのURl貼るか解説してくれませんか?
218デフォルトの名無しさん:2011/03/19(土) 00:12:19.73
>>217
別に難しいことじゃないだろ、そんぐらい独学でやれよ

BMPのピクセル情報を取得する方法を調べる
セルの背景色を設定する方法を調べる

分ったら、とりあえずBMPのピクセル情報を一つ一つ調べて、それに基づいて
セルの背景を設定していく

ただそれだけだ
219217:2011/03/19(土) 10:03:18.56
その調べるってのがわかんないんですけど…
馬鹿ですかあなた?
220デフォルトの名無しさん:2011/03/19(土) 12:20:02.65
VBAでADOを使ってデータをCSVから読み込む時、
金額列が一行目に5000、100行目に99999999999
という感じであるとRecordSetがintegerとして型を扱うのか、
100行目のデータがnullになってしまいます。

RecordSetの型認識を明示的に行う方法ってあるでしょうか。
order by 金額 descとすればいけるかと思いましたが、
金額列が複数あるので、その方法では解決しなさそうです。
221デフォルトの名無しさん:2011/03/19(土) 12:41:47.61
いっそのこと、Getstringメソッドで文字列として読み込んで後で数値に変換するとか
222デフォルトの名無しさん:2011/03/19(土) 13:18:54.47
2,147,483,647
99,999,999,999
vbaのlong型だと、何があっても不思議じゃない数字だね。
223デフォルトの名無しさん:2011/03/19(土) 14:10:12.68
>>220
せめてプロパイダ何使ったかぐらい書け
Jetならschema.ini書けば行けるんじゃなかろうか
224デフォルトの名無しさん:2011/03/19(土) 21:45:36.13
>>218
ありがとう
調べても急にプログラミング言語が云々とか出てきて
具体的にどういうことをしてそうなるのかがわからなかったんだ
それがわかっただけでもマジ助かったわ
サンクス
225デフォルトの名無しさん:2011/03/19(土) 23:58:51.18
私はVBA初心者です。質問させていただきます。エクセルで、キーボード入力で
遊べる簡単なゲームを作りました。一応、ゲーム中は問題なく遊べるのですが、
ゲーム終了直後に多くのセルに文字が入力されてしまいます。ゲーム中に押した
「z」や「→」などの入力が、ゲーム終了直後にシートに反映されてしまっている
ようです(おそらく)。それらの文字を毎回消すのは面倒なので、どのように
すれば文字だらけにならないで済むか教えていただきたいです。
 
Declare Function GetAsyncKeyState Lib "User32.dll" (ByVal vKey As Long) As Long

sub ゲーム() 
   Do while ゲーム継続条件
      If GetAsyncKeyState(40) <> 0 Then
           ・
           ・
           ・     
      end if
   Loop
一応、こんな流れです。
226デフォルトの名無しさん:2011/03/20(日) 01:16:26.80
>>225
最後に全データを消せばいいのでは
Cells.Clear
227デフォルトの名無しさん:2011/03/20(日) 01:42:35.95
>>226
 レスありがとうございます。

 そのシートには、ゲームの途中経過や記録など、消えてほしくないデータもたくさん
あるので、全データを消すわけにはいきません。また、一応最後にcells.clearを書いて
見たところ、他のデータはすべて消えましたが、その後に「z」などが入力されてしまい
ました><
228デフォルトの名無しさん:2011/03/20(日) 02:10:21.02
チェンジイベントで消せば
229デフォルトの名無しさん:2011/03/20(日) 02:52:57.32
>>228
 レスありがとうございます。

 チェンジイベントで消すという発想はなかったです!ゲーム終了直後にセルに文字が入力
されることに変わりはないので、セルが高速で選択されまくるのは少し気になりますが、
それらを手作業で消す必要がなくなったので問題はありません。ありがとうございました!
230デフォルトの名無しさん:2011/03/20(日) 07:47:58.79
エクセルのマクロで斜めの波線(ジグザグ線?)は引けないでしょうか?
A1セルの左上からC3セルの右下まで波線を引いたり、
A1セルの左上からA3セルの右下まで波線を引けると助かります。
231デフォルトの名無しさん:2011/03/20(日) 11:36:39.78
>>230
Excelのバージョンは?
232デフォルトの名無しさん:2011/03/20(日) 15:08:58.53
前スレで2003のエクセルマクロが2010で動かないのを質問した者ですが、
オリジナルページではマクロが動くことが分かりました。
使用するときはこのオリジナルページの新規作成ボタンを押して、
新たなエクセルファイルを作成するのですが、この新作成したマクロの
パスが新規作成ファイルのパスになっており、全てのパスをオリジナルに
設定しなおさなくてはなりません。設定せずに済むなにか良い方法はないでしょうか?
233デフォルトの名無しさん:2011/03/20(日) 16:11:11.10
>232
いまいちわからない。オリジナルページってなんだ?
あとパスを設定?書き換える?にしても、
なに用のパスを変更するかわからないと手出できない。

とりあえず、そのマクロを作った人に聞いたほうがいいんじゃないか?

234デフォルトの名無しさん:2011/03/20(日) 17:15:47.83
>>231
2003です。
235デフォルトの名無しさん:2011/03/20(日) 20:43:10.88
>>234
' ほい。できたよ
' セルを選択してから実行すると
Sub 選択範囲に斜めの波線を引く()
  p = 1.4 ' ピッチ この数字に比例して波が大きくなる
  With Selection
    w = .Width
    h = .Height
    x = .Left
    y = .Top + h / 2
    l = Sqr(w * w + h * h)
    With ActiveSheet.Shapes.BuildFreeform(msoEditingAuto, x, y)
      For i = 1 To l / p
        x = x + 2
        y = y + 2 * Sgn(i Mod 4 - 1.5)
        .AddNodes msoSegmentCurve, msoEditingAuto, x, y
      Next
      .ConvertToShape.Select
    End With
    With Selection.ShapeRange
      .Width = l
      .Height = .Height / 2 * p
      .IncrementTop 2
      .IncrementLeft (w - l) / 2
      .IncrementRotation Atn(h / w) * 180 / 3.1415927
    End With
    .Select
  End With
End Sub
236235:2011/03/21(月) 03:18:30.50
一カ所修正
下から7行目、破線の位置を決めてる部分だけど
画面上で見る場合はこの方がピッタリになる

      .IncrementTop 2.3 - p * 1.1

印刷時はまた違ってくるだろうけど、今すぐには確認できん
237デフォルトの名無しさん:2011/03/21(月) 07:50:28.08
>>230
線の外に文字でも入力するの?
そうじゃなきゃセルを結合すれば簡単
238デフォルトの名無しさん:2011/03/21(月) 16:17:48.75
>>237
どうやるの?
罫線だと波線は選べないよね
239デフォルトの名無しさん:2011/03/21(月) 19:47:08.57
>>237
そうか破線じゃできないな。
点線と勘違いしたよ。

>>235-236
A1:B10だとおかしくなるね。
240デフォルトの名無しさん:2011/03/22(火) 00:21:24.81
できあがった波線をマウスで左に移動しようとしても、A列の端まで持っていけないね
面白い現象だ
241デフォルトの名無しさん:2011/03/22(火) 04:13:57.49
>>229
落書き用のシートを作ればいいんじゃ?
242デフォルトの名無しさん:2011/03/23(水) 13:08:07.89
一つの音源を再生するのはできるんですが
一つの音源の音の高さを変えて再生することって可能ですか?
243デフォルトの名無しさん:2011/03/23(水) 18:01:16.51
転職用のアピール材料として、アプリを構築した。そんで、提案書とサルでも分かるような仕様書も作った。
転職の際、同じことした御方みえますか?
244デフォルトの名無しさん:2011/03/24(木) 11:47:08.99
beep音って同時に複数流せる?
245 忍法帖【Lv=13,xxxPT】 :2011/03/24(木) 15:51:04.28
マウスホイールでアクティブセルの値を上下することはできますか?
246デフォルトの名無しさん:2011/03/25(金) 00:24:23.64
>>245
ホイールイベントをフックするぐらいしか思いつかん
247デフォルトの名無しさん:2011/03/25(金) 12:52:21.32
空白のセルではなく、セル内の空白行、例えばA1に
あいう
(空白行)
えおか
という文字があった場合、その空白行を消して
あいう
えおか
というように詰める事は可能でしょうか?
分かる方いましたら教えてください。お願いします。
248デフォルトの名無しさん:2011/03/25(金) 16:48:35.11
>>247
サンプル書いた
Sub Sample()
Worksheets("Sheet1").Columns("A").Replace What:=Chr(10) & Chr(10), Replacement:=Chr(10)
End Sub
249247:2011/03/25(金) 20:24:54.73
>>248
お答えくださってありがとうございます。
再度質問よろしいでしょうか?
Chr(10)がラインフィード文字というのは分かりましたが
何故Chr(10) & Chr(10)が空白行の検索ということになるのか
そしてReplacement:=Chr(10)に置換することによりどうして空白行が無くなるのか
いまいちわかりません。
それと、Cells(1,1)というようにして記述したい場合どのようになりますか?
よろしくお願いします。
250デフォルトの名無しさん:2011/03/25(金) 21:05:59.77
>>249
改行2個で空白行になるから、1個なら単なる改行になる。

A1のみならReplace関数でもいい。
With Cells(1, 1)
  .Value = Replace(.Value, vbLf & vbLf, vbLf)
End With

A列を置換なら
Range("A:A").Replace vbLf & vbLf, vbLf
251デフォルトの名無しさん:2011/03/26(土) 07:13:00.18
>>242>>244
MIDIデバイスをいじるといいぜ

昔自分用に作ったランダムに音を出すブック
http://www.death-note.biz/up/o/19433.xls
252デフォルトの名無しさん:2011/03/26(土) 07:20:50.44
おたずねします。
グラフエリア上にツールバーからコンボボックスを作りました。

@[コントロールの書式設定]でリストの入力範囲を設定し、
A[マクロの登録]で、VBエディッタにコードを作成できたのですが、

コンボボックスでクリックされた値をAのサブプロシージャ-で取得する
方法がわかりません。ヒントでよいので、お願いします。
253デフォルトの名無しさん:2011/03/26(土) 10:41:35.15
追伸:
つまり、グラフエリア上に作成したコンボボックスのコードとして記述するための名前がわからないのですが、、、
254デフォルトの名無しさん:2011/03/26(土) 14:00:52.64
シートセルをVariantで配列に入れた後、その配列をRange変数に入れる方法ってないですか?
Application.WorksheetFunction.StDevとかに使うためにやりたいです
255デフォルトの名無しさん:2011/03/26(土) 14:33:21.31
>>254
普通に出来るだろ
256デフォルトの名無しさん:2011/03/26(土) 14:34:23.40
だからその普通がしりてーんだよボケカス
257デフォルトの名無しさん:2011/03/26(土) 14:51:21.56
>>254
サンプル書いた
Sub Sample()
Dim WS As Variant
Dim R As Range
Set WS = ActiveSheet
Set R = WS.Cells
End Sub
258254:2011/03/26(土) 15:06:42.44
すいません>>256は自分ではない別の人なので

>>255>>257
ありがとうございました!
259デフォルトの名無しさん:2011/03/26(土) 17:50:35.81
>>243

> 転職用のアピール材料として、アプリを構築した。そんで、提案書とサルでも分かるような仕様書も作った。
> 転職の際、同じことした御方みえますか?

あるよ
260デフォルトの名無しさん:2011/03/26(土) 20:39:43.48
>>243
運悪くコードオタクとかがその会社にいたら、中身見られて汚いコードだから不合格とか言われるかもw
Selectだらけのど下手でもプロとしてやってる奴いたりするから会社次第とは思うが。
261デフォルトの名無しさん:2011/03/26(土) 21:49:10.81
俺は恥ずかしくてそんな事出来ない。
新卒だったら考えるけど
262デフォルトの名無しさん:2011/03/26(土) 22:40:16.83
>>261
お前のコードはそんなに恥ずかしいのか?
263デフォルトの名無しさん:2011/03/26(土) 23:05:05.69
コードじゃなくて、そういう幼稚なアピールの仕方が恥ずかしいのでは?
264デフォルトの名無しさん:2011/03/26(土) 23:41:37.57
ならどうやってアピールする?
265デフォルトの名無しさん:2011/03/26(土) 23:43:30.52
それは自分で考えるべきだ
266デフォルトの名無しさん:2011/03/27(日) 10:55:16.31
他人と同じ事やったんじゃアピール弱いもんな
267デフォルトの名無しさん:2011/03/27(日) 12:23:49.91
デザイナーとかだと作品を持ってくるのは当たり前みたいだが。
プログラマの能力を見るにはコードを見るのが一番だけど、
持ってこさせないのは面接官がコードを読めないんだろうな。
268デフォルトの名無しさん:2011/03/27(日) 14:35:32.50
面接するのは人事の人間であってプログラマが見るわけじゃない(一般的には)



269デフォルトの名無しさん:2011/03/27(日) 14:44:35.26
>>267
そんなのは当たり前だが、プログラマがVBAってのがダメダメすぎw
つーかVBAじゃまともに能力計れないし

小学生のソフトボール投げが、大人になると砲丸や槍になるように
VBAで能力計れるのは、精々中学生1年生まで
270デフォルトの名無しさん:2011/03/27(日) 14:53:09.07
少しは評価してやれよ
VBAは便利だぞ
271デフォルトの名無しさん:2011/03/27(日) 15:02:09.60
VBA自体は評価してるし、便利なのも認める

しかしVBAでアピールしようとする奴は、評価に値しない
272デフォルトの名無しさん:2011/03/27(日) 15:16:38.45
転職先がプログラマだとはどこにも書いてない
構築したアプリがVBAだとはどこにも書いてない

まあ、スレ違いだからこれ以上はよそでやってくれ
273デフォルトの名無しさん:2011/03/27(日) 15:26:43.86
> 転職先がプログラマだとはどこにも書いてない
そこはどうだろうと関係ない部分だけど?

> 構築したアプリがVBAだとはどこにも書いてない
ここはVBAスレなんだから、VBA以外でアピールする話をVBAスレでしてるなら
まともな判断能力が欠如してるってことで、それこそ就職どころじゃないw
274デフォルトの名無しさん:2011/03/27(日) 20:07:30.07
エクセルマクロ初心者です。誰か教えてください。
以下のマクロがあったとします。
【例@】----------
Sub テスト1()
   test1-1行目
   test1-2,3…n行目
End Sub
Sub テスト2()
   test2-1行目
   test2-2,3…n行目
End Sub
Sub 一括処理()
   テスト1
   テスト2
End Sub
----------
Sub 一括処理()を実行した場合、『test1-1行目、test1-2,3…n行目、test2-1行目、test2-2,3…n行目』という順番で実行されますよね?
Sub 一括処理()で例Aのようなプログラム以外に『test1-2,3…n行目、test2-2,3…n行目』のみを実行させる方法はありますか?テスト1、2にIF文を付けたりして試してみたのですが自分の実力ではダメでした。
以下のようにプログラムすれば簡単なのですが…
・実際のマクロは行数がものすごく多い。
・テスト1、テスト2、一括処理のそれぞれで実行させたい。
・例Aのようにプログラムするとテスト1、テスト2で変更がかかったときにミスにつながる。
【例A】----------
Sub 一括処理()
   test1-2,3…n行目
   test2-2,3…n行目
End Sub
----------
良い方法を教えてください。お願いします。
275デフォルトの名無しさん:2011/03/27(日) 20:19:40.09
>>274
引数(ひきすう)を使うといいよ
こんな感じで、何行目から始めるか指定する

Sub テスト1(x)
   test1-x…n行目
End Sub
Sub テスト2(y)
   test2-y…n行目
End Sub
Sub 一括処理()
   StartLine = 1
   テスト1(StartLine)
   テスト2(StartLine)
End Sub

一括処理の中の最初の行を「StartLine = 2」にするだけで、処理の範囲を変えることができる
276デフォルトの名無しさん:2011/03/27(日) 20:24:31.26
すいませんよくわかりません
もうちょっと分かりやすくお願いします。
初心者なんで
277デフォルトの名無しさん:2011/03/27(日) 21:23:18.20
「初心者」が免罪符になるって?
278デフォルトの名無しさん:2011/03/27(日) 21:28:29.64
はぁ、もういいです
279デフォルトの名無しさん:2011/03/27(日) 22:19:56.33
何かスレッド荒れてきたな。
態度でかい奴ばかり
280デフォルトの名無しさん:2011/03/27(日) 22:30:06.84
上から目線で見下してる回答者も増えたよな
281デフォルトの名無しさん:2011/03/28(月) 00:16:17.14
ほんとにそうですね。

例えば、自己PRとしてアプリ提出することが何故いけないの?相手に売り込むための、プレゼンの一環だと思うし。

例えば、初心者だからと前置きしていて不遜な態度をとっていないのにもかかわらず、上から目線とか余裕ないですよね。
282デフォルトの名無しさん:2011/03/28(月) 00:27:17.74
いけないことだなんて誰も言ってないのに被害妄想が強すぎだな
なんでそんなに余裕がないの?
283デフォルトの名無しさん:2011/03/28(月) 06:45:07.89
面接官が率直に思うだろうこと

企画系の募集じゃない場合
(ここでプレゼンとか何様だよ)

面接官がプログラマーの場合
(うわVBかよ)

面接官がプログラマーじゃない場合
(これ採用の評価基準にしろと?じゃめんどいから不採用で)


アプリ提出が前提でよっぽど自信作じゃない限り危険
284デフォルトの名無しさん:2011/03/28(月) 10:08:05.00
否定するおまえは、ビジネスライクなまともなアプリ作ったことないだろ。あ、そもそも作る能力ないか。かわいそうに。
285デフォルトの名無しさん:2011/03/28(月) 10:17:38.05
負け犬の遠吠え?

VBAスレでビジネスライクなまともなアプリとか言ってもカッコワルイだけだし
VBAスレなのにVBA以外での話だなんて言い訳しだしたらもっとカッコワルイw
286デフォルトの名無しさん:2011/03/28(月) 10:47:27.91
VBAけなす奴は一体、何ののためにVBAという言語つかってるわけ?
287デフォルトの名無しさん:2011/03/28(月) 11:26:09.69
Officeの標準マクロ言語だから使ってるだけで
あえてVBAを選択して使ってるわけじゃないし

中にはVBAを簡易開発環境代わりにしてなんでもVBAでやる奴も居るけど
俺はOfficeアプリが必要な場合以外はVBAなんて使わないし
288デフォルトの名無しさん:2011/03/28(月) 12:45:29.11
言語の優劣とかまだ言ってるやつがいるのか
Windowsのプログラミングはライブラリで決まる
何から呼び出しても結果は一緒

あと、なんかもう開発環境をわざわざインストールするのがめんどい
Officeは最初から入ってるし
最近のマシンは処理速度も十分
VBAを嫌ってるのは知識の古い老害だけ
289デフォルトの名無しさん:2011/03/28(月) 12:59:45.38
C,C++,C#,javaとかそこそこ使えるようになるとVBAを見下して
俺はすごい、レベル高いって思いたくなっちゃうんだよな

まあ、動物的本能というか感情の問題だな
290デフォルトの名無しさん:2011/03/28(月) 13:21:41.55
生産性が一番高い言語はExcelVBA
データを共有しないスタンドアロンアプリではExcelVBAが最強
291デフォルトの名無しさん:2011/03/28(月) 13:25:48.49
>>283
プログラマ募集でソース付きで作品を提出させればいい判断材料になりそうだけどな
292デフォルトの名無しさん:2011/03/28(月) 13:29:16.85
VBAしか使えない子がキレちゃったねぇ
滑稽極まりないw
293デフォルトの名無しさん:2011/03/28(月) 13:41:50.90

> Officeは最初から入ってるし

> Officeは最初から入ってるし

> Officeは最初から入ってるし

何時からOS標準になったんだ?
294デフォルトの名無しさん:2011/03/28(月) 15:02:55.38
ここまで全部俺の自演
295デフォルトの名無しさん:2011/03/28(月) 15:17:53.07
まともに呼べないライブラリが多いのもVBAの弱み
296デフォルトの名無しさん:2011/03/28(月) 15:31:03.12
APIリファレンス
297デフォルトの名無しさん:2011/03/28(月) 15:42:53.29
なんだ、やっぱり解ってないのか
298デフォルトの名無しさん:2011/03/28(月) 16:37:39.07
VBA勉強したいけど2003と2010で互換性低かったりとかだったら不安
299デフォルトの名無しさん:2011/03/28(月) 17:21:33.69
>>298
99%は一緒だから安心しろ
300デフォルトの名無しさん:2011/03/28(月) 18:51:04.92
>>290
言語じゃねーよ
301デフォルトの名無しさん:2011/03/28(月) 19:56:33.06
302デフォルトの名無しさん:2011/03/28(月) 20:23:54.55
>>299
サンクス
303デフォルトの名無しさん:2011/03/28(月) 21:48:00.87
自分だけ使うもの作るとき、クラス使おうか悩んで最終的に構造体に逃げる俺
モジュールすら公開しないのに、わざわざ使う気力が湧かないわ
304デフォルトの名無しさん:2011/03/29(火) 00:24:55.97
クラスは難しいよな。VBA極めるくらいの気がなきゃ、下手に手を出さないのが得策かも
305デフォルトの名無しさん:2011/03/29(火) 01:18:24.75
そういえばVBAにもクラスがあるな。
現場で使ってるのを見たことがあるけどその時は
クラスとか全然知らなかったから全く分からなかった。

JAVAとか勉強した後にこのサイト見るとそんなに難しくなさそうだ
http://codezine.jp/article/detail/499

VBAしかやったことがない人にはクラスは難しそうに見えるけど
JAVAを勉強すればそんなに難しくない事に気がつく。
306デフォルトの名無しさん:2011/03/29(火) 01:24:01.89
VBA(とVB6)のクラスは独特すぎて他言語環境に慣れてる人には辛いかも
307デフォルトの名無しさん:2011/03/29(火) 04:40:54.10
クラスはコントロール大量に作るぐらいしか役に立たない
構造体はapiの引数にしかたなく使う感じ
どっちも配列使うのに制限があって使い勝手が悪い
308デフォルトの名無しさん:2011/03/29(火) 06:48:07.29
クラス作ると見やすくなる
俺の場合はそれだけだな
309デフォルトの名無しさん:2011/03/29(火) 07:01:51.83
俺は連想配列にぶち込むオブジェクトとしてクラス使うことが多いかな
構造体と似た、ほぼグローバル変数のみのクラスだが、
代入できる値の範囲を制限したり、値の代入に伴って行う簡単な処理を置いたり
特定の値が入った場合にRaiseEventでイベント起こしてやったり
307も言ってる仮想コントロール配列も、結局はコレだしね
310 忍法帖【Lv=2,xxxP】 :2011/03/29(火) 07:25:48.04
!ninja
311 忍法帖【Lv=15,xxxPT】 :2011/03/29(火) 09:18:56.22
!ninja
312デフォルトの名無しさん:2011/03/29(火) 10:36:10.36
エクセルで散布図グラフを作成した時に
近似曲線の追加からグラフに傾きと切片の式を追加できるとおもうんですが
この式が表示されるテキストボックス(データラベル?)の位置を取得
したいと考えています。

その際、この式の位置やサイズを取得するときのコントロールオブジェクトを
教えてください。
313デフォルトの名無しさん:2011/03/29(火) 16:02:41.54
使用ver 2007

A1セルに数字を入力し、B1セルに数に応じた背景色を反映させたいのですがどうすれば良いでしょうか
2003だと条件書式で3つまでは入力できたのですが、2007は条件追加ボタンが見当たらず・・・

20001〜青
15001〜20000水色
10001〜15000緑
5001〜10000黄色
0〜5000赤
314デフォルトの名無しさん:2011/03/29(火) 16:08:25.84
自己解決しますた
315デフォルトの名無しさん:2011/03/29(火) 18:00:09.65
上記条件付書式のコピーについてもうひとつ質問です

Z1に入力した数字次第(○○以上○○未満の場合)で、W1セル背景が5段階に変色するという書式をAND関数を使って設定しています
以降入力数字に対する変色は同条件で、Z2に入力したものをV1に反映、Z3に入力したものをU1に反映と、縦の入力データを横左方向に出力、といった書式を一括でコピーしたいのですが方法はあるでしょうか

現状W1をコピーすると、V1にもZ1からデータをひっぱってくる数式がコピーされてしまいます

W1セルに対して
 Z1<5001 のとき背景赤色
 AND(Z$1>=5001,Z$1<10001) のとき背景黄色といった感じで記入してます

$の位置が悪いか不要ですかね
316デフォルトの名無しさん:2011/03/29(火) 18:03:45.25
VBAで設定するなら、$がどうとかはあまり関係ない

つーか、ここはExcelスレではなくVBAスレなんだが
おまえはそれが解って来ているのか?
317デフォルトの名無しさん:2011/03/29(火) 18:10:31.69
エクセル質問で検索するとここが出てきたんでそりゃ失礼!
318デフォルトの名無しさん:2011/03/29(火) 19:32:25.08
Excel2007

ループで処理実行中の間、マウスカーソルを砂時計が回っている奴に変えたいのですが、
どうすればよろしいんでしょう?
319デフォルトの名無しさん:2011/03/29(火) 19:34:27.89
>>316
細かい事言うな
320デフォルトの名無しさん:2011/03/29(火) 20:04:38.14
>>318
マウスカーソルの変更はVBAではなくVBの分野。(>>3参照)
スレ違い。
321デフォルトの名無しさん:2011/03/29(火) 20:24:15.49
>>318
Application.Cursor = xlWait     '砂時計
'ループ処理
Application.Cursor = xlDefault  '通常
322デフォルトの名無しさん:2011/03/29(火) 20:29:02.84
>>320


>>321

ありがと
323デフォルトの名無しさん:2011/03/29(火) 20:37:03.65
>>319
本人納得して移動してるのに、他人が細かい事言うな
324303:2011/03/29(火) 21:30:38.26
>>307 >>309のように、カスタムコントロール(ラッパー?)で
コントロール配列を実装するのがいちばん使いでがありそうな感じだね

構造体はWin32APIとかで必須だけど、VBScriptだと使えないから
泣く泣くクラスで実装してる人も多いんだろうか
わざわざクラス使ってるVBS見たことないですわ

325309:2011/03/29(火) 21:45:28.88
俺はVBSでもクラス使いまくりだ
> 連想配列にぶち込むオブジェクトとしてクラス使う
は、VBAでもVBSでも変わらないからな
ぶち込む先がVBA.CollectionかScripting.Dictionaryかの違いで

あとはVBAでは標準モジュール毎にPrivateメンバを持てるけど
WSFでインクルードする場合は、ファイル毎にPrivateメンバを持てないので
Privateメンバを持たせたい場合は必然的にクラス使うことになる
326デフォルトの名無しさん:2011/03/29(火) 21:57:12.95
>>321
俺もそれだと思ったんだが、俺のExcel2010じゃ砂時計にならないんだよな。
丸いのがぐるぐる回ってる。
砂時計はどうやって出すんだろ?
327デフォルトの名無しさん:2011/03/29(火) 23:07:16.51
>>325
VBSで入力補完が出来るエディタってある?
328デフォルトの名無しさん:2011/03/29(火) 23:11:26.42
いくつかあるけどVBSはスレ違い。
329デフォルトの名無しさん:2011/03/29(火) 23:38:26.78
>>326
APIでアイコンセットを切り替え
330デフォルトの名無しさん:2011/03/30(水) 09:33:22.55
プログラム未経験です。
仕事で必要なため、勉強したいが、
最初に読む書籍でオススメがあれば、
教えてください。
バージョンはExcel 2003です。
331デフォルトの名無しさん:2011/03/30(水) 09:51:56.85
>>330
先ずはこの3冊がおすすめ。2007でもいいかも。
かんたんプログラミング Excel2003 VBA 基礎編
かんたんプログラミング Excel2003 VBA 応用編
かんたんプログラミング Excel2003 VBA コントロール・関数編
332デフォルトの名無しさん:2011/03/30(水) 17:03:17.22
> 499 名前:デフォルトの名無しさん   [sage]  投稿日:2009/03/30(月) 23:56:12
>    できる大辞典 Excel VBA
>    がオススメ
>
>    大村あつしは知識はあるが根本的にバカなので
>    こいつの書いた本は素人にはオススメしない
>    バカな内容に引きずられないだけの基礎スキルを持っていて
>    知識だけ上乗せしたい中級者以降なら構わないが

かんたんプログラミング Excel2003 VBAシリーズは大村あつし

333デフォルトの名無しさん:2011/03/30(水) 21:49:48.50
>>330
プログラム未経験なら
ExcelVBAより、CやJavaから始めたほうが、
学びやすい

ExcelVBAを1年間学ぶより、
Javaを11ヶ月学んで1ヶ月ExcelVBAを学ぶほうが
はるかにプログラマとしての実力がつくだろう
334デフォルトの名無しさん:2011/03/30(水) 22:03:22.88
だからどうしたって
335デフォルトの名無しさん:2011/03/30(水) 22:05:42.34
>>330
ハードウェア(PCアーキテクチャ)に多少なりとも造詣があるならC
それほどでも無ければJAVA
Windowsしか解らんのであればC#
336デフォルトの名無しさん:2011/03/30(水) 22:28:37.87
>仕事で必要なため
ExcelVBAが仕事で必要という事ではないのか?
337デフォルトの名無しさん:2011/03/30(水) 22:44:23.32
ExcelVBAじゃなければならないケースなんてそんなないだろ

338デフォルトの名無しさん:2011/03/30(水) 22:57:10.13
プログラムが目的ならそんなにはないだろうけど
Excelを使うのがメインならExcelVBA以外でどうする気だね?
339デフォルトの名無しさん:2011/03/30(水) 23:08:25.58
エクセルメインの会社なんて沢山あるだろ
340デフォルトの名無しさん:2011/03/30(水) 23:09:54.98
Excel自体がActiveXアプリなので、WSH等からの操作が可能
つまり、JScriptはもちろんのこと、Perl、Ruby、Pythonなどでも
VBAと同等とは言えないが、かなりの操作が可能だよ

まあ俺は別言語が使いたいわけじゃないから、外部から弄る場合もVBSだが
341デフォルトの名無しさん:2011/03/30(水) 23:17:09.38
俺もVBAから入ったからVBSだな
342デフォルトの名無しさん:2011/03/30(水) 23:18:09.83
エクセルで既に動いてる奴を修正するパターンでも
別ので作り直すの?
343デフォルトの名無しさん:2011/03/30(水) 23:23:22.79
作り直すのが目的じゃないんで、滅多にやらないが
既に開いてる奴を外部から操作することもあるよ

まあExcelの操作できる言語はVBAのみじゃないってだけの話だし
344デフォルトの名無しさん:2011/03/30(水) 23:46:48.37
C#からExcelを弄ると苦痛
引数省略できねぇえぇぇ
345デフォルトの名無しさん:2011/03/31(木) 02:08:31.03
C#だって原則は省略できないだろ
346デフォルトの名無しさん:2011/03/31(木) 11:29:59.92
計算を手動にしてるんですが、VBAで再計算を行わせるように出来ないですか?
Excel2003です。お願いします
347デフォルトの名無しさん:2011/03/31(木) 11:51:43.54
ヘルプ検索すればすぐ出てくるし
手動での再計算操作をマクロの記録にとっても解るし
なんでこのレベルのことを自分で調べられないの?
348デフォルトの名無しさん:2011/03/31(木) 20:04:40.56
VBAのコードを書いていると、「コンパイルエラー メモリが足りません。」とのエラーが出るようになりました。
(実行時のエラーではなく、記述している最中のエラーです。)
ヘルプを見ると「メモリが不足しています。(Error 7)」というエラーのようです。
ヘルプに記載されている対処は行ってみたものの、改善されませんでした。
どのようにすればこの問題は解決できるのでしょうか?
Excel2007です。よろしくお願いします。
349デフォルトの名無しさん:2011/03/31(木) 20:23:08.73
ハードウェア環境を省略するような質問に答えてくれる親切な人がいるとは思えない
350348:2011/03/31(木) 20:31:16.72
>>349
すみません。ハードウェア環境は以下の通りです。
WinXPProSP3
CPU i7 2.80GHz
メモリ 2.96 GB
仮想メモリのページングファイル 2046 - 4092 MB
他の人のPCで起動しようとしても同じエラーが出ました。
351デフォルトの名無しさん:2011/03/31(木) 21:12:32.06
コード書けよ。俺たちはエスパーじゃねーから
352348:2011/03/31(木) 21:18:50.73
>>351
すみません。業務で作成したコードのため、公開することができませんでした。

自己解決しました。
ttp://hpcgi1.nifty.com/MADIA/VBBBS2/wwwlng.cgi?print+200604/06040032.txt
にあるように、新規でエクセルファイルを作成し、全コピーをすることで問題を解消することができました。

ただし、気になる点が1つだけあります。
全てのシート及びコードをコピーしたはずなのに、(数人で確認しました。)
新しいファイルが657KBに対し、エラーのあるファイルは17644KBでした。
これが原因だったのかもしれませんが、詳細は不明です。
353デフォルトの名無しさん:2011/03/31(木) 22:39:26.82
>352
たぶん、どれかのシートの最下行(Excel2007なら数百万行だっけ)あたりになにかゴミデータでもあるんじゃないか?
354デフォルトの名無しさん:2011/04/01(金) 00:50:47.68
>>345
Excelのオブジェクトは省略パラメータだらけだって事だよ

Excel.Workbook oWb =

mExcelApp.Workbooks.Open(

str_filename,

Type.Missing, Type.Missing, Type.Missing, Type.Missing,
Type.Missing, Type.Missing, Type.Missing, Type.Missing,
Type.Missing, Type.Missing, Type.Missing, Type.Missing,
Type.Missing, Type.Missing);

こんな感じになる
355348:2011/04/01(金) 09:42:16.41
>>353
返信が遅くなりました。
Ctrl+A->Ctrl+C->Ctrl+P の繰り返しでコピーしたので
ごみデータがあればそれも一緒にコピーされる気がしますが・・・。

ともあれ、問題は解決しました。
新規作成中のコードもうまく動くようになりました。
ご回答下さった皆様、ありがとうございました。
356デフォルトの名無しさん:2011/04/01(金) 09:48:14.24
×Ctrl+P
◎Ctrl+V
357デフォルトの名無しさん:2011/04/01(金) 10:14:53.51
ユーザー定義関数について教えてください。
個人用マクロブックにユーザー定義関数を書いているんですが
実際にそのマクロを使用するワークシート内で関数を実行しようとする場合
=個人用マクロブック!関数名
という風にユーザー定義関数の指定を個人用マクロブックの指定も含めて
行わなければname?となってしまうんですが、個人用マクロブックの指定を
省略することができるような設定方法などないでしょうか。
358デフォルトの名無しさん:2011/04/01(金) 10:21:24.50
標準モジュールにPublic Functionで書いてる?
359デフォルトの名無しさん:2011/04/01(金) 12:28:23.64
オートシェイプ内の文字列の色を変更したいんですけど、プロパティとかメソッドがよく判りません。

もう少し用途を具体的に言うと、図形の塗り潰し色を変更するマクロで、塗り潰し色に合わせて文字色も変更したいのです。
デフォルトの文字色は白のため、塗り潰し色を白にすると文字が読めなくて困っています。

.selection.shaperangeからいけるかと思ったのですが、該当するものが見当たらず……
OSはvista、エクセルのバージョンは2007です。
360デフォルトの名無しさん:2011/04/01(金) 12:31:43.52
レスありがとうございます。
Publicをつけていなかったのでつけてみたんですがやはりマクロブックの
指定をしないとname?になってしまいます。
標準モジュールには記述しています。
361デフォルトの名無しさん:2011/04/01(金) 13:55:00.59
2010でマクロの挙動が変わってしまいました。

Auto_OpenでExcelの起動と同時にマクロを走らせているのですが、
2007では起動と同時にワークシートも表示されていたのが
2010ではマクロが終了するまでシートが表示されません
なんとかなりませんか?
362デフォルトの名無しさん:2011/04/01(金) 15:19:27.73
>>360

アドインにすればいいと思うが。。
さうすれば他のPCでも使える。


363デフォルトの名無しさん:2011/04/01(金) 16:56:53.55
現在複数のエクセルファイルで、同一のコードを使用するために、
各エクセルファイルそれぞれのに同一のコードをコピペしたり、
エクセルファイル自体をコピーしてコードをそのまま持ってきて使用しています。

現状で、そのファイルが10個以上となっていますが、
vbaのコードに仕様を変更したり修正したりすると、それらのファイルのすべてそれぞれで
同様にコードを書きなおさないとなりません。

全選択のコピペで済む話ですが、かっこ良い仕様とは言えませんね。

なので、DLLみたいな感じで、コード自体は一つのファイルとして、
各エクセルファイルでそれを参照するようにすれば、もとのコードファイルを書き換えるだけで済むような仕様にしたいのですが、
そういう場合はどのようにすればよいのでしょうか?
364デフォルトの名無しさん:2011/04/01(金) 17:05:09.10
個人用マクロブック
365デフォルトの名無しさん:2011/04/01(金) 17:09:29.77
分かりにくい長文になってしまいましたが、
要するに、別ファイルに記述されているvbaコードを使えるかどうかです。

ちなみに BeforeDoubleClick等のイベントプロシージャも使用しています。
366デフォルトの名無しさん:2011/04/01(金) 17:17:20.93
だから個人用マクロブック

もしかしたら個人用マクロブックでは出来ないとか勘違いしてるのかも知れないけど
イベントも含めてちゃんと出来るから
367デフォルトの名無しさん:2011/04/01(金) 17:30:11.45
>>366
自己解決ですが、参照設定でコードが書かれたxlsファイルを直接指定しておけばグッドそうです。
ありがとうございました><

>>366
個人用マクロブックだとそれらとは関係ないエクセルファイルを使用する時もいちいち読みこまれるのがカッコ悪いと思います。
368デフォルトの名無しさん:2011/04/01(金) 17:59:41.21
あぁ、この子勘違いしてるんだね
369デフォルトの名無しさん:2011/04/01(金) 20:43:03.14
かっこ悪いと思います!
人に聞くのは
370デフォルトの名無しさん:2011/04/01(金) 20:48:16.27
選択した図形にくっついてるコネクタの情報ってどうやったらわかる?

→■

上の状況で■を選択してマクロを実行、いろいろした最後に、→を繋ぎ直す処理をしたい。
くっついてる最初の時点で名前を取っといて、最後にendconnect selectionすればいいと思うだけど。
371デフォルトの名無しさん:2011/04/01(金) 21:57:43.94
>>363
かっこいい…しびれた……
372デフォルトの名無しさん:2011/04/02(土) 14:15:20.95
>>370
自己解決しました。
373質問:2011/04/02(土) 15:19:09.76
"検索シート"でコンボボックスを作り、コンボボックスのボタンをクリックしたら
自動的に"カテゴリ"シートにある最新データを表示できるようにしたいのですが
うまくいきません。

どうも◆の部分で"カテゴリ"シートに切り替わっていないようなんですが、
なぜ"カテゴリ"シートが選択されないのかわからず困っています。
どこがおかしいのでしょうか?

Private Sub ComboBox1_DropButtonClick()
Dim i As Integer

Application.ScreenUpdating = False

Worksheets("カテゴリ").Select

If Range("A2").Value = "" Then '◆
i = 3
Else
i = Range("A1").End(xlDown).Rows
End If

Worksheets("カテゴリ").Names.Add Name:="カテゴリ1", RefersTo:=Range("A2:A" & i)

Worksheets("Sheet1").Select

Application.ScreenUpdating = True

End Sub
374デフォルトの名無しさん:2011/04/02(土) 15:19:21.87
>>368
何か勘違いしていたでしょうか?

もしかして、個人用マクロブックの中のマクロで、開いたファイル中で呼び出すことがないマクロに関しては読み込まれないんですか?
375デフォルトの名無しさん:2011/04/02(土) 15:40:54.59
>>373
"カテゴリ"シートに切り替えても
Rangeで取得されるのは、そのコードが書かれている親だよ
VBEのプロジェクトエクスプローラ見れば、どこに書いているか解る
なので
Worksheets("カテゴリ").Range("A2").Value '(With使っても良し)
とするか、どうしても切り替えたいなら
Worksheets("カテゴリ").Activate
ActiveSheet.Range("A2").Value
としな

>>374
もう出てこなくていいよ
君のレベルじゃ話にならないから
376373:2011/04/02(土) 15:47:12.88
>>375
できました おかげで先に進むことができます
ありがとうございました
377デフォルトの名無しさん:2011/04/02(土) 22:40:38.13
クラスって今まで使ったことないけどあれってどういうときに使うの?
378デフォルトの名無しさん:2011/04/02(土) 22:44:44.35
簡単に言うと、クラスモジュールで作成したプログラムによって、標準モジュールなどで、独自のメソッドやプロパティが使えます。
379デフォルトの名無しさん:2011/04/02(土) 22:50:35.56
俺は昔、やりたいことがあって方法を調べてたら、クラスを使う手法に行き着いた
>>377もそうやって必然性に迫られるまでは、クラスなんか使わなくていいよ
380デフォルトの名無しさん:2011/04/02(土) 23:16:00.88
オフィス田中の田中亨が出してるSE出版のリファレンスに最近ハマッている。

リファレンスという側面以外に学習教材としての側面も大いに持ち合わせていてかなり良い!

381デフォルトの名無しさん:2011/04/03(日) 00:24:47.36
今のとこ、クラスじゃなきゃできないってことは
VBA環境の右クリックに独自イベント処理を追加したとき、くらいかなぁ

こんなかんじ
Private WithEvents cmmndBrEvents1 As CommandBarEvents

Private Sub cmmndBrEvents1_Click(ByVal CommandBarControl As Object, handled As Boolean, CancelDefault As Boolean)
 ・・・
End Sub

ネタ元はこれね
Excelプロフェッショナルエンジニアテクニック
ttp://www.amazon.co.jp/dp/4904412028/
382デフォルトの名無しさん:2011/04/03(日) 17:14:30.22
エクセルのVBAではないのですが
たくさん作ったのですが、1つをチェックするとほかのチェックボックスの
チェックが消えるようにして、チェックできるのが常に一つにしたいのですが、
どうしたらいいでしょうか?
383デフォルトの名無しさん:2011/04/03(日) 17:45:07.90
>エクセルのVBAではないのですが

この時点で既に板違いなんでどうでもいいんだが、何で作ったかも書かないという
384デフォルトの名無しさん:2011/04/03(日) 17:46:58.80
そういうときは、チェックボックスではなく
オプションボタン(ラジオボタン)を使うんだよ、坊や
385デフォルトの名無しさん:2011/04/03(日) 18:13:59.91
>>383-384 ありがとうございます!!ちょっと試作してみます!!
みなさん、やさしいですね。ありがとうございます!!
386デフォルトの名無しさん:2011/04/03(日) 18:20:40.62
>>383 >>384 できましたー!! ありがとうござます!! また質問させていただきます!!
387デフォルトの名無しさん:2011/04/03(日) 22:15:50.29
A1 B1 C1に値が入っていて、
D1が =SUM(A1:C1)となっていた場合に、
F1にD1の値のみコピーをしたいんだけど、
A1 B1 C1に数値を入力するたびに、
F1にD1の値のみコピーってできる?
エクセル2007 VBAのコードを教えて。

特に、「A1 B1 C1に数値を入力するたびに」のコードの解説もよろ。



388デフォルトの名無しさん:2011/04/03(日) 22:25:34.32
>>387
ワークシートのChangeイベントで出来る

この説明で解らないなら、基礎を勉強して出直せ
ここは丸投げでコード書いて貰うスレではなく、要点だけ教えて貰えば、
あとは自分でコード書ける人がヒントを貰いに来るスレなので
389デフォルトの名無しさん:2011/04/03(日) 22:56:21.79
>>382>>387は釣りだよ
この種のクソ虫が最近増えてきたな
390387:2011/04/03(日) 23:02:50.15
すまんくそ蒸しでw
本当に困っているvba初心者なんだ.
サンプルコード教えてw


391デフォルトの名無しさん:2011/04/03(日) 23:14:18.17
>>390
sub サンプルコード()
 do
  if msgbox("あなたは糞虫ですか?", vbyesno) = vbyes Then
   msgbox "やはり糞虫だったんですねw"
   exit do
  end if
 loop
end sub
392387:2011/04/03(日) 23:23:04.84
>>391
アフォかおまえ
おれはくそ蒸しであって糞虫ちゃうちゅうねんw
こいつじゃあ話にならん。
コードかける人かもーんw
393コードかける人:2011/04/03(日) 23:32:04.10

C G Am Em F C Dm/F G

コード書いたよ
大逆循環な
394デフォルトの名無しさん:2011/04/03(日) 23:36:23.20
>>393
なんの曲だよw
395デフォルトの名無しさん:2011/04/03(日) 23:40:12.94
>>387
普通に数式で、F1セルに「=D1」とかじゃあダメなのか?
396デフォルトの名無しさん:2011/04/03(日) 23:43:12.39
397デフォルトの名無しさん:2011/04/04(月) 00:13:17.03
>>396
あーそういやそんなコード理論あったなぁ
つーか進行的に普通すぎて名前なんか出てこないぞw
398デフォルトの名無しさん:2011/04/04(月) 01:08:21.43
>>387

' ワークシートに変更があった場合
Private Sub Worksheet_Change(ByVal Target As Range)
' 変更された行が1行目なら
If Target.Cells.Row = 1 Then
' 変更された列が1列目〜3列目の間なら
If 1 <= Target.Cells.Column And Target.Cells.Column <= 3 Then
' 1行目の6列目の値に1行目の4列目の値を代入
Cells(1, 6).Value = Cells(1, 4).Value
End If
End If
End Sub
399387:2011/04/04(月) 02:00:59.90
>>398
ありがとうございます。
ここから、Copyメソッドや、PasteSpecialメソッドが続くと思うのですが、
よくわかりません。どうしてもエラーが出てしまいます。
400デフォルトの名無しさん:2011/04/04(月) 02:14:46.11
>>399
横レスだけど、>>398は、標準モジュールじゃなくて
ワークシートモジュールに書くんだよ
CopyメソッドとかPastSpecialメソッドとか関係ないよ
401デフォルトの名無しさん:2011/04/04(月) 02:43:22.07
忠告しとこうか、質問スレで無意味な回答するくらいならスルーするんだな




するくらいなら
スルー
する



んだな!
402387:2011/04/04(月) 02:55:56.78
>>400
ワークシートモジュールに書いてます^^;

>>A1 B1 C1に値が入っていて、
>>D1がA1+B1+C1場合に、
>>F1にD1の値のみコピー(形式を選択してコピー)をしたいんだけど、
>>A1 B1 C1に数値を入力するたびに、
>>F1にD1の値のみコピー(形式を選択してコピー)ってできるでしょうか?

' ワークシートに変更があった場合
Private Sub Worksheet_Change(ByVal Target As Range)
' 変更された行が1行目なら
If Target.Cells.Row = 1 Then
' 変更された列が1列目〜3列目の間なら
If 1 <= Target.Cells.Column And Target.Cells.Column <= 3 Then

Cells(1, 4).Value = Cells(1, 1).Value + Cells(1, 2).Value + Cells(1, 3).Value
Cells(1, 4).Value.Copy
Cells(1, 6).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
End If
End If
End Sub

どこが誤りなのでしょうか?
403387:2011/04/04(月) 03:05:15.99
×形式を選択してコピー
○形式を選択して貼り付け
でした。すみません。
404デフォルトの名無しさん:2011/04/04(月) 06:23:27.58
>>402
CopyやPasteSpecialは関係ない
>>398のままでいい
>>387でD1セルに「=SUM(A1:C1)」となっている
と書いてあるのを前提として
405デフォルトの名無しさん:2011/04/04(月) 19:04:57.44
だんだんと壮大なことになってきてるなw
答えてる方も釣りかw
406デフォルトの名無しさん:2011/04/04(月) 19:06:21.05
あー。わかった!
>>387のエクセルの自動計算がオフになってるだけじゃないのか?
407デフォルトの名無しさん:2011/04/04(月) 20:34:41.64
>>406
>エクセルの自動計算がオフ

何のこと?どこにチェック項目がある?
408デフォルトの名無しさん:2011/04/04(月) 21:03:13.46
少しはググれ
409デフォルトの名無しさん:2011/04/04(月) 22:32:47.27
>>402
Cells(1, 4).Value = Cells(1, 1).Value + Cells(1, 2).Value + Cells(1, 3).Value
が思いつくのに、
Cells(1, 6).Value = Cells(1, 4).Value
が思いつかないのは不思議だ

いっそ、プロシージャの中身、全部消して
上の2文だけにしたら?
410デフォルトの名無しさん:2011/04/04(月) 22:45:36.59
まあ、どこが間違ってるって話だから
× Cells(1, 4).Value.Copy
○ Cells(1, 4).Copy
411387:2011/04/04(月) 23:44:22.94
>>410
ありがとうございます。自己解決してましたがw

ところで、このプログラムを実行すると、
Cells(1, 4)がコピー元の選択状態になってうざいのですが、
PasteSpecialメソッドを実行した後、
この状態を解消するメソッドってあります?
412デフォルトの名無しさん:2011/04/04(月) 23:47:39.17
選択解除とかじゃなくて、なんで素直にみんなが言ってるように
Cells(1, 6).Value = Cells(1, 4).Value
ってやらんのだね?
そこまでコピペにこだわる特別な理由でもあるのか?
413387:2011/04/04(月) 23:59:20.91
>>412
実際、仕事で使っているエクセルには>>398さんのように、
Cells(1, 6).Value = Cells(1, 4).Valueの代入で、
プログラミングしております。皆様ありがとうございます。

コピペはもう必要ないのですが、
初め、CopyメソッドとPasteSpecialメソッドが必要と考えていたので、
この使い方もできれば習得したいと思いまして。。。
414デフォルトの名無しさん:2011/04/05(火) 00:30:23.15
>>411
Application.CutCopyMode = False
415387:2011/04/05(火) 00:36:20.38
>>414
おお、ありがとうございます。
ヘルプで調べればよいのですが、
VBEのヘルプがなぜか

このページはご利用いただけません
お探しのページはご利用いただけません。以下のことを試してみてください。
ツールバーの [更新] をクリックする
ツールバーの [戻る] をクリックした後、目的のページへのリンクをもう一度クリックする
コンピュータに保存されたオフラインのコンテンツを表示する

となってしまい、調べられないのです。
ううう。なぜだ?
416387:2011/04/05(火) 00:43:38.46
VBAをいじる前に
http://www.trickpalace.net/windows/tips/excel.open.window.htm
により、エクセルを多重起動に設定したのが
もしかしていけなかったのか?
417デフォルトの名無しさん:2011/04/05(火) 07:03:42.39
>>415
そうとう知能の低いクソ虫だな
その画面から「オフラインのコンテンツ」で調べるんだよ

あと2chで書き込む前に一度ググれ
例えば「vba ヘルプ オフライン」とか入力して検索してみろ

お前の知能ではVBAは向いてないから以後は関わらないしろ
418デフォルトの名無しさん:2011/04/05(火) 07:10:56.44
Inputboxでセル範囲を入力してそれをFor Nextで
一つずつ下げるのを繰り返したいのですがエラー(1004)に
なります。
どこが間違っているかご指摘してもらえないでしょうか。

Dim i,d As Integer

d = InputBox("抽出する日数を入力してください", "日数")
If d = "" Then Exit Sub

For i = 0 To 10
☆ ActiveSheet.Range(Cells(2, 4), Cells(2, d)).Offset(i, 0).Select
Next
☆のところでエラーになります。


419デフォルトの名無しさん:2011/04/05(火) 07:39:47.18
>>418
☆以前に
If d = "" Then Exit Sub
でエラーだろ
整数型と文字列の比較演算してるんだから

変数dに列番号の有効範囲値(2003以前なら1〜256、2007移行なら1〜16384)が
入っていれば☆自体はエラーにならないよ

Ifでエラーにならずに☆でエラーになるなら、おそらく実行時に変数dにAs Integerを付けてなかったんだろう
変数の型指定無し、つまりVariant型だと、InputBoxに数値の入力しても、それは数値ではなく数字文字列扱い
つまりCells(2, "10")みたいなことをしているのと同じなのでエラーになる

まあ簡単に言うと「d = ""」を「d = 0」にすれば良し

InputBoxでキャンセルした場合に返される値は""ではなくEmptyなので、これが数値型に代入されれば0になる
あと、その書き方だとiはInteger型にならないぞ
Dim i As Integer, d As Integer
420デフォルトの名無しさん:2011/04/05(火) 07:44:02.64
またまた壮大な釣りが…
421デフォルトの名無しさん:2011/04/05(火) 07:55:14.89
>>418
d = Val(InputBox("抽出する日数を入力してください", "日数"))
If d = 0 Then Exit Sub

シートのセルが結合されてない?
422デフォルトの名無しさん:2011/04/05(火) 07:58:03.67
>>419
それだけだとInputBoxに数値以外の物を入力した時にエラーで止まる
423デフォルトの名無しさん:2011/04/05(火) 08:11:56.65
VBAや昔のVBでは、
Dim i,d As Integer
でIntegerになるのはdだけだぞ
424418:2011/04/05(火) 08:19:28.82
>>419
ご指摘ありがとうございます。
また、夜試してみます。
>>421
セルは結合してないです。
そんなやり方もあるんですね。勉強になります!
425デフォルトの名無しさん:2011/04/05(火) 09:00:11.06
>>422
それは419の回答の問題ではなく、418に最初からある問題だから、419に言うのは筋違いかと。
426デフォルトの名無しさん:2011/04/05(火) 10:12:24.28
そもそもその宣言だとdはval型だろ
427デフォルトの名無しさん:2011/04/05(火) 10:17:16.65
その宣言ってどの宣言?
iがval型なのはあるが、dがval型なのは見あたらないんだが
428デフォルトの名無しさん:2011/04/05(火) 12:33:36.35
ああ、間違えたiか
dがintだな
自動初期化だとdに0が入るから、if文はスルーされる
セル(2,0)が参照されたエラーだな
429デフォルトの名無しさん:2011/04/05(火) 12:49:23.14
恥ずかしい奴
430デフォルトの名無しさん:2011/04/05(火) 13:33:13.16
If chk_日付.Value = True Then
Else: txt_日付.Value = ""
End If

If chk_金額.Value = True Then
Else: cmb_金額.Value = ""
End If

If chk_担当.Value = True Then
Else: txt_担当.Value = ""
End If

あと5項目ほど続くのですが、もっとコンパクトな記述方法はないでしょうか?

Arrayを使おうとおもったけど、うまくいきませんでした。
431デフォルトの名無しさん:2011/04/05(火) 13:39:25.56
>>430
疑似コントロール配列を使う
or
Controlsコレクションを使う
432デフォルトの名無しさん:2011/04/05(火) 14:42:23.50
>>429

///


>>430
1.コントロール情報を配列に格納して回す
2.判定と処理が複数回あるなら別コードに書いて呼び出す
3.全部のコントロールを対象にして後で修正しないならfor〜each使う
433デフォルトの名無しさん:2011/04/05(火) 14:49:46.73
Else: cmb_金額.Value = ""

Else: txt_金額.Value = ""
の間違いでない限り、まとめるのは無理
あと、False〜ThenじゃなくてTrue〜Elseになってるのが気持ち悪い
Elseのあと改行せずに : を書いてるのが気になる
いちいち= Trueを書くのも無駄っぽい
434デフォルトの名無しさん:2011/04/05(火) 14:59:37.65
> Else: cmb_金額.Value = ""
> が
> Else: txt_金額.Value = ""
> の間違いでない限り、まとめるのは無理
無理じゃないよ

VB6のコントロール配列だと、コントロール種は揃えなきゃならないけど
VB6だろうとVBAだろうと、クラスとコレクションで作る疑似コントロール配列なら
コントロール種が揃ってなくてもまとめることは可能
435デフォルトの名無しさん:2011/04/05(火) 15:38:17.73
最近、的外れな指摘して恥かくのが流行ってるのか?
>>426とか>>428とか>>433とか
436デフォルトの名無しさん:2011/04/05(火) 15:38:27.81
>>433
見やすさを考慮するとどういった
記述になるでしょうか?
437デフォルトの名無しさん:2011/04/05(火) 16:37:31.93
435
遅れてるなあ超流行ってるよ知らないの?
438デフォルトの名無しさん:2011/04/05(火) 16:43:22.49
納得した俺に、どこが恥ずかしい回答なのか教えてplz
439デフォルトの名無しさん:2011/04/05(火) 16:56:21.71
>>438
どれの恥ずかしさを晒して欲しいの?
恥ずかしい回答、いっぱいあるのでw
440デフォルトの名無しさん:2011/04/05(火) 17:13:06.27
さっきの3つをお願いします
441デフォルトの名無しさん:2011/04/05(火) 19:13:40.86
A1に"L3"と入力されていて、L3に文字を入力したいです
VBAでINDIRECT関数を使うにはどうしたらいいですか?
442デフォルトの名無しさん:2011/04/05(火) 19:39:13.70
>>441
Range(Range("A1").Value).Value = "hage"
443デフォルトの名無しさん:2011/04/05(火) 19:57:08.90
>>442
ありがとうございます
444デフォルトの名無しさん: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

以上のように、ひとつずつユーザーフォームのプロシージャに
記述するしかないのでしょうか?
445デフォルトの名無しさん:2011/04/05(火) 20:22:24.18
いいえ
446デフォルトの名無しさん:2011/04/05(火) 21:03:32.72
>>440
さっきの3つは何処が恥ずかしいか晒されてるだろ
447デフォルトの名無しさん:2011/04/05(火) 21:35:00.21
>>445
どうするのでしょうか?
448デフォルトの名無しさん:2011/04/05(火) 21:40:30.55
>>447
少し前に似た話と>>444にも使える解決策が出てるからログ嫁
449デフォルトの名無しさん:2011/04/05(火) 22:09:00.79
〉〉446
どこにだろう
450418:2011/04/05(火) 22:35:10.96
皆さんに指摘されたことを試してみたけどやはり

ActiveSheet.Range(Cells(2, 4), Cells(2, d)).Offset(i, 0).Select
のところで実行時エラー1004になります。
ActiveSheet.Range(Cells(2, 4), Cells(2, 10)).Select

でも試してみたのですがやはり1004エラーになりました。

同じマクロで
For i = r To 10
ActiveSheet.Columns(i).ClearContents
Next
と不要な列の内容を削除するコードは正常に動いています。

どこがいけないのでしょうか??

451デフォルトの名無しさん:2011/04/05(火) 22:36:16.98
>>449
今大流行の的外れで恥ずかしい回答の実践見せてやってんだよそんくらい判れよ
452デフォルトの名無しさん:2011/04/05(火) 22:57:19.31
>>450
釣りかもしれんけどあえて エスパーしてみる

そのコードはシートモジュールに書いてない?
例えば
Sheet1のシートモジュールにコードを書いていて
Sheet2をActiveにした状態でそのコードを実行してるとか?
453デフォルトの名無しさん:2011/04/05(火) 23:00:42.51
>>450
いまひとつ何がしたいか分からないけど、
私の環境ではInputBoxで「10」を入力した場合、
Range(D2:J2)が最初に選択されて
Range(D12:J12)まで一行ずつずれていく動作になっているよ
454デフォルトの名無しさん:2011/04/05(火) 23:06:21.43
>>450
こんな感じになってる?
あと考えられるのは、少し前のExcelでInputBoxに257以上を指定してるとかだけど。

Private Sub xxx()
  Dim i As Integer
  Dim d As Integer
 
  d = InputBox("抽出する日数を入力してください", "日数")
  If d = 0 Then Exit Sub
  
  For i = 0 To 10
  ActiveSheet.Range(Cells(2, 4), Cells(2, d)).Offset(i, 0).Select
  Next
End Sub
455デフォルトの名無しさん:2011/04/05(火) 23:07:18.83
>>450
ActiveSheet.Range(Cells(2, 4), Cells(2, 10)).Select
が1004エラーになるというのは、
コード以外の問題じゃないのか?

イミディエイトウィンドウに書いても実行できないの?
456デフォルトの名無しさん:2011/04/05(火) 23:09:35.15
>>452
その通りでした。
標準モジュールに記述し直したら動きました。

For i = r To 10
ActiveSheet.Columns(i).ClearContents
Next

↑の部分が正常に動いていたので見落としていました。

勉強不足を痛感します。
ありがとうございました。
457デフォルトの名無しさん:2011/04/05(火) 23:24:46.02
>>453、454、455
書き込む前にリロードしていませんでした。
標準モジュールに記述したら、無事動きました。
dでセル範囲を指定して、iで下方向に検索しようと思い
前段階として、セルの選択ができるか試したかったのです。

レス下さった皆さんありがとうございました。
458452:2011/04/05(火) 23:39:31.48
>>457
余計なお世話かもしれないけれど
Rangeオブジェクト(RangeとかCellsとかその他)を扱う時は
ケースバイケースだけど
シートを明示した方が今回のような凡ミスは防げると個人的には思う
(過去にも 同様なエラーで質問された方が いた気がする)

ActiveSheet.Range(ActiveSheet.Cells(2, 4), ActiveSheet.Cells(2, 10)).Select
とか
With ActiveSheet
.Range(.Cells(2, 4), .Cells(2, 10)).Select
End With
とかならシートモジュールでも問題なかったハズ
459デフォルトの名無しさん:2011/04/05(火) 23:44:18.40
>>444
クラスモジュール使ったらできたよ

でも、3組程度の個数で、enabled の切り替え程度の単純な処理内容なら、
>>444のコードのようにひとつずつ記述したほうがいいように思う
460デフォルトの名無しさん:2011/04/06(水) 00:12:20.49
>>458
なるほど。ありがとうございます。
今後の参考にさせていただきます。
461デフォルトの名無しさん:2011/04/06(水) 15:58:02.08
Incrementを使って図形をアニメーション移動させることが出来ますが、これって直線移動しか出来ないですか?
応用して曲線移動させることは可能ですか? Excel2003です。
462デフォルトの名無しさん:2011/04/06(水) 16:10:10.30
可能です。(厳密には曲線移動ではないけど、視覚上は十分曲線移動に見える)
463デフォルトの名無しさん:2011/04/06(水) 17:13:21.68
>>462
どうやるか教えてほしいんですが…
もしかして直線で細かくつなぐとか?
464デフォルトの名無しさん:2011/04/06(水) 19:59:25.66
正解
465デフォルトの名無しさん:2011/04/06(水) 20:13:00.65
なるほど、どうも
466デフォルトの名無しさん:2011/04/07(木) 00:14:23.73
独学でやってるんで、一般的な意見が聞きたいです。
入力用ユーザーフォームの実際の処理は
標準モジュールに記述するものなんですか?

それと、標準モジュールはいくつかつくって、
処理内容ごとにわけたりしますか¥?

プロシージャが増えるほど視認性が悪くなってきたもので。
467デフォルトの名無しさん:2011/04/07(木) 00:40:06.57
>>466
プログラミングの作法は宗教みたいなもんで統一されてないし、
VBAにはとくにガイドラインもなかったと思う
468デフォルトの名無しさん:2011/04/07(木) 00:52:27.55
>>467
ピュアオーディオ宗教みたいな感じですか。
自分が見やすかったり、使いやすければ
とくに問題なし、いったところのようですね。

僕は

dim aaa , bbb , ccc as integer



aaa = 1 : ccc = 3
bbb = 2  ddd = 4

とかまとめたくなってしまいます。
469デフォルトの名無しさん:2011/04/07(木) 00:53:04.14
>>468
コロンが抜けてました・・・
470デフォルトの名無しさん:2011/04/07(木) 01:27:37.25
vbaでよくやる間違いに
dim aaa , bbb , ccc as integer
ってやっちゃうのがある
上でも言われてるけど、それでintegerになるのcccだけだから
471デフォルトの名無しさん:2011/04/07(木) 07:35:23.63
逆に、VB.NETだとその書き方で全部にIntegerが適用されるから
ややこしいんだよな。
472デフォルトの名無しさん:2011/04/07(木) 08:13:38.60
別にややこしく無いじゃん
今後はともかく現状ではExcelVBAにVB6準拠のとVB.NET準拠のがあるわけではなく
全てVB6準拠で統一されているんだから
473デフォルトの名無しさん:2011/04/07(木) 23:04:05.17
xmlhttp で取得したhtmlを
タグで解析するにはどうすればいい?
例えば10個目のtdタグ内容をinnertextで
抜きだすとか
474デフォルトの名無しさん:2011/04/07(木) 23:16:40.61
.NET移行を視野に入れた作法なら、フォームモジュールに画面処理を書いて、
ビジネスロジック部分はクラスにして管理って感じかねぇ
モジュールに入れるのは汎用関数ぐらいにして
VBAでもそういう意識を持てば、独学でも業務で通用するセンスを磨けるよ
475デフォルトの名無しさん:2011/04/07(木) 23:19:37.75
はやくVBAも.NETに統一してほしい
.NET環境使わないのはもったいない
476デフォルトの名無しさん:2011/04/08(金) 00:24:35.68
VBAは利用者(プログラマー)の数が他の言語より圧倒的に多くてレベルも様々だから
言語仕様を大幅に変えようとすると大混乱が起こるだろうな
477デフォルトの名無しさん: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

うまくテキストボックスの中の値をセルに入れる方法はありませんでしょうか?
478デフォルトの名無しさん:2011/04/08(金) 13:08:28.93
>>477
Controls
479デフォルトの名無しさん:2011/04/08(金) 13:24:53.74
>>478
ありがとうございます!助かりました。
480デフォルトの名無しさん:2011/04/08(金) 17:02:29.82

A B C D  E
0 0 44 55 66    A1が0の場合C3の値をA1に入れる
0 0 44 55 66    A1が1の場合D3の値をA1に入れる
0 1 44 55 66    A1が2の場合E3の値をA1に入れる
1 1 44 55 66          : 
1 1 44 55 66          :
1 1 44 55 66          : 
2 1 44 55 66    A1が100の場合
2 2 44 55 66

このようにして100まで分岐させたいのですが、どうすればいいでしょうか?
Excel2000です。
481デフォルトの名無しさん:2011/04/08(金) 17:54:49.93
>>480
Dim a As Integer
If IsNumeric(Cells(1, 1).Value) Then
    a = CInt(Cells(1, 1).Value)
Else
    a = -1
End If
Select Case a
    Case 0 To 100
        Cells(1, 1).Value = Cells(3, a + 3).Value
End Select

邪魔くさいんで解説はしない
正常に動いてないようならお前の説明が悪い
482480:2011/04/08(金) 19:15:02.31
ちゃんと動きました
ありがとうございます
483デフォルトの名無しさん:2011/04/08(金) 22:42:30.45
何故おしえたがりは考え方ではなく、コードを提示したがるのか
484デフォルトの名無しさん:2011/04/08(金) 22:56:57.43
日本語文章で説明すると、日本語理解できないバカの場合に再質問責めで大変なことになるが
コード出しておけば、コード読めないバカでもとりあえずコピペで動き、大人しく帰ってくれるから
485デフォルトの名無しさん:2011/04/08(金) 23:00:24.84
>>483
楽だからだろ
考え方はお前が教えてやれよ
486デフォルトの名無しさん:2011/04/09(土) 00:37:04.26
Excel VBAから、Accessを呼び出したあとお、クローズ処理の書き方を教えてください。

Sub Main()
Dim Acc As Object 'New Access.Application
On Error GoTo Err
Set Acc = CreateObject("Access.Application")
'''何らかの処理
'既存mdbがオープンされていたらクローズ
If *****************Then '←★ここの条件が書けません。
Call Acc.CloseCurrentDatabase
End If
'Accessアプリケーションのクローズ
If TypeName(Acc) = "Application" Then
Call Acc.Quit
End If
'Accessオブジェクトの開放
If Not (Acc Is Nothing) Then
Set Acc = Noting
End If
Final:
Exit Sub
Err:
Debug.Print Err.Description: MagBox (Err.Description)
Resume Final
End Sub
487デフォルトの名無しさん:2011/04/09(土) 00:52:15.12
>>486
激しくスレ違い>>3★3,4
488デフォルトの名無しさん:2011/04/09(土) 00:59:53.95
アクセスオブジェクトをクリエイトして操作しているんだよ!
489デフォルトの名無しさん:2011/04/09(土) 01:26:44.86
まずは>>3★3,4読め

エクセルオブジェクトを操作するのがExcelVBAであって
アクセスのそれはスレ違い

逆にアクセスのVBAでエクセルオブジェクトを読んで操作する話なら
ここで質問して良し
490デフォルトの名無しさん:2011/04/09(土) 02:44:50.12
outlookもダメなのかい?
491デフォルトの名無しさん:2011/04/09(土) 03:49:17.00
うん
492デフォルトの名無しさん:2011/04/09(土) 10:46:41.61
>>483
お前は俺か?w
俺も常々そう思ってるが、この程度ならコードだけでもしょうがねーなぁ。
IsNumericよりVarType使ったほうがいいと思うが。
493デフォルトの名無しさん:2011/04/09(土) 11:13:40.96
VarTypeは数値に見える文字列で素人がはまる
右寄せにしてたら区別が付かない
494デフォルトの名無しさん:2011/04/09(土) 11:34:47.37
「数値だったら」なら普通はVarTypeだな。
IsNumericは「数値に変換できるものなら」だから"1D1"とかでもTrueになる。
495デフォルトの名無しさん:2011/04/09(土) 11:38:57.68
つーか教室での指導や部下の教育なら考え方や意味から教えるべきだが
ここはそれらとは違う、何の利害関係にもない赤の他人同士だってことを忘れてないか?

それ解っている上で>>483を『行動として示す(補足説明を行う)』なら単なるお人好しだが
口先でちょっかい出すだけだと、単なるバカってことにしかならないねw
496デフォルトの名無しさん:2011/04/09(土) 11:47:07.19
VarTypeにもIsNumericにも落とし穴がある

不特定多数が使うことを想定して作るなら、どちらを使うにしても落とし穴への例外処理が必要
自分だけが使うなら、想定さてる値と落とし穴が被らない方を使えば良し

どちらの場合でも、「普通は〜」なんて一概に言う奴は考えが浅い
497デフォルトの名無しさん:2011/04/09(土) 11:58:33.65
適材適所、臨機応変ってことですね。
498デフォルトの名無しさん:2011/04/09(土) 12:00:11.86
素人は想定外のミスを色々やってくれちゃうからなあ
数字を全角で入れたり「1500*1.05」みたいに計算式を入れたり
スペースいっぱい入れて消したつもりになってたり(表示されない部分にデータが残ってる)
ゼロとオーを間違えたり3桁ごとのコンマを手打ちで入れたり

あらゆるケースを想定してたらコードをどんだけ書いても足りないぜ
499デフォルトの名無しさん:2011/04/09(土) 12:01:42.76
481=483=484本人じゃねーの?
わかってて書いてるっぽいし。
俺は説明するのに1行ごとにコメント書くやつ見ると頭どつきたくなるわ。
よいコードはコメントは最小限でもわかる。
500デフォルトの名無しさん:2011/04/09(土) 12:02:26.93
あらゆるケースを想定できない奴には商用ソフトなんて作れないぜ
501デフォルトの名無しさん:2011/04/09(土) 12:05:11.19
>>496の考えの深さを見てみたいもんだぜw
普段は抜けだらけのコード書いてるのは想像できる。
502デフォルトの名無しさん:2011/04/09(土) 12:08:26.18
>>500
それは言えてるが、こういう掲示板での回答じゃgdgd長いコードは書いちゃいかんよな。
503デフォルトの名無しさん:2011/04/09(土) 12:11:03.54
>>501 ←こういうのなんて言うんだっけ

ほら、なんたら犬の遠吠えとかなんとか
504デフォルトの名無しさん:2011/04/09(土) 12:14:24.30
うん、お前は誰にも負けんよ。
よっ!大統領w
505デフォルトの名無しさん:2011/04/09(土) 12:19:12.34
強がっちゃって可愛いなぁ
506デフォルトの名無しさん:2011/04/09(土) 12:23:09.02
>>505
あんまり相手にするな。
507デフォルトの名無しさん:2011/04/09(土) 12:31:39.00
あー、一人4役は疲れる
508デフォルトの名無しさん:2011/04/09(土) 12:44:18.81
そういえば某所に「普通」に敏感な素人がいたなぁ。
509デフォルトの名無しさん:2011/04/09(土) 12:52:45.15
あー、一人507役は疲れる
>>1から>>507までは俺1人で書いたw


510デフォルトの名無しさん:2011/04/09(土) 13:48:32.52
>>498
そういうのはデータチェック用のモジュールを1個作っといて使い回せばいいんだよ
何かあったらどんどん追記してけばいい
怪しいデータや判定不能な物を発見したらメッセージ表示するだけの簡単なやつを
511デフォルトの名無しさん:2011/04/09(土) 16:19:41.68
>>486
ldb有る無しで判定
512デフォルトの名無しさん:2011/04/09(土) 19:48:00.49
OS:XP Excel2003

A.xls B.csv があります。

Bの入力補助としてAを使いたいのですが、
AからBを開いて、
BのセルをダブルクリックするとAのフォームが開く、
という動作は可能でしょうか?

個人用マクロブックを使えば出来そうな気がしますが、
可能なら使わないで処理をしたいと考えています。
513デフォルトの名無しさん:2011/04/09(土) 20:04:54.61
>>512
俺はできないと思う
csvファイルはイベントも使えないしマクロも保存できないと思うから。
B.csvがB.xlsならできるだろうが
514デフォルトの名無しさん:2011/04/09(土) 20:16:16.08
AからBを開いてBにマクロを登録、みたいなことはできそうな
515デフォルトの名無しさん:2011/04/09(土) 21:17:06.86
>512
やりたい事はこんな事?

フォームを開かせる処理は作ってないけど
B.csvのセルをダブルクリックした時のアドレスを表示するようにしてみた

A.xlsの 標準モジュール
  Sub テスト()
    Dim CSV As Workbook
    Set CSV = Workbooks.Open(FileName:="C:\TEMP\B.csv") 'CSVを開く
    Set ThisWorkbook.CSVEv = CSV
  End Sub

A.xlsの ThisWorkbookモジュール
  Public WithEvents CSVEv As Workbook
  Private Sub CSVEv_SheetBeforeDoubleClick(ByVal Sh As Object, _
            ByVal Target As Excel.Range, _
            Cancel As Boolean)
    'イベント時の処理
    MsgBox Target.Address
  End Sub
516デフォルトの名無しさん:2011/04/09(土) 21:44:55.91
そういえば昔tsvで>>515みたいなことやったな
フォームよりはコンテキストメニュー拡張しての入力補助だったが

まあVB6でCSV・TSVエディタ自作してからは、わざわざExcel使うことも無くなったけど
517デフォルトの名無しさん:2011/04/10(日) 16:35:48.88
お知恵をお貸し下さい。

Excel2007 VBA でファイルフォーマットを指定してワークブック保存しようとしているのですが、2007 形式(xml 形式)にできません。
97-2003 形式になってしまいます。
エクスプローラー> ファイルのプロパティで、「Excel 97-2003 ワークシート (.xls)」となっています。

ある方のブログにあった以下のソースでも試したのですが、97-2003 形式になってしまいます。
Private Const xlExcel8 As Integer = 56
Private Sub main()
Dim fullFileName As String
fullFileName = "E:\_Temp\test"
If Application.Version < 12 Then
Workbooks(1).SaveAs Filename:=fullFileName, FileFormat:=xlExcel9795
Else
Workbooks(1).SaveAs Filename:=fullFileName, FileFormat:=xlExcel8
End If
End Sub

ブレイクポイントを設定したところ、Else の方を実行していました。

なお、Excel オプションでは、「Excel ブック (*.xlsx)」を選択しています。
(Excel オプション> 保存> ファイルの保存形式)

518デフォルトの名無しさん:2011/04/10(日) 17:29:49.75
>>517
97-2003形式      FileFormat:=xlExcel8
2007以降    .     FileFormat:=xlOpenXMLWorkbook
2007以降マクロ有効 FileFormat:=xlOpenXMLWorkbookMacroEnabled

ちなみにxlOpenXMLWorkbookMacroEnabledは56じゃなくて52だよ
519デフォルトの名無しさん:2011/04/10(日) 17:55:29.39
>>517
く、釣り? or 釣りバカ?
そのブログにそのコードの使い道が書いてあったはずだ


520デフォルトの名無しさん:2011/04/10(日) 18:02:35.78
>>518
こんなに早く回答して頂きまして、ありがとうございます!
97-2003形式、2007以降、2007以降マクロ有効、全てのファイルフォーマットで保存できることを確認しました。
また、56 ではなく、52 である事も教えて頂いて、ありがとうございます。


521デフォルトの名無しさん:2011/04/10(日) 18:15:53.48
VBAで板取計算ができないかと考えています。


やりたいことは
1 母材の縦横サイズを入力
2 部材の縦横サイズと必要数を数種類入力
3 部材毎に縦横回転可否の条件入力
4 最適取り数とレイアウト図を表示

です。

3と4の間で、悩んでます。

ナップザック問題等でも
有名な、難解な問題ですが、
宜しくお願いします。
522デフォルトの名無しさん:2011/04/10(日) 19:32:08.34
クラスを作る
クラスに最小サイズのグリッドを規定して、母材サイズBool型の2次元配列を作る
配列をFalseで初期化する
ループ噛まして配列にマッチングさせていく
マッチング処理でFalseの数と生成パターンをメンバー変数に入れる
以下パターンの数だけループさせて、保持してるFalseがメンバー変数より少なかったら、
メンバー変数を更新する

最後に母材配列をプロパティで取り出して終わり

じゃダメか?
523デフォルトの名無しさん:2011/04/10(日) 21:49:02.38
「歩留まり ナップサック問題」でググルとまぁ、
Excelでもいろいろできるが難しそうだな
524デフォルトの名無しさん:2011/04/11(月) 14:20:09.98
やりたいのはACCESSで、なんですけど、VBAスレが見つからないので、
スレチながら教えてくだしあ。

時間のかかる処理(そんなに重くないもの)をバックグラウンドで動作させるには、どうしたらよいでしょう?

例えばExcelで、フォームを表示して入力可能にしつつ、
その間にネットワークフォルダの特定のファイルパスを裏で収集して、
順次フォームのリストに追加するような感じです。
525512:2011/04/11(月) 20:27:46.75
>>515
>>515さんのコードを基に、目的の物が作れそうです。
ありがとうございました。

その他、レスを頂いた皆さんもありがとうございました。
526デフォルトの名無しさん:2011/04/11(月) 21:09:36.82
522です
今日も色々と探したんですけど
やぱ難しいですね
最適化よりも
部材を順番に
目一杯割り付けていって
残材にも、
順番に目一杯割り付けていく感じなら
どうにかなりますかね?

527デフォルトの名無しさん:2011/04/11(月) 22:27:50.00
>>489
え、そうなの?

>>486
ExcelVba的な回答であれば、mdbオープン時にフラグセット

>>524
擬似バックグラウンドなら
メインモジュールで恒常ループを発生させる
時間なり処理に応じて処理を分岐して呼び出す

非同期処理なら外部アプリケーションなりバッチ処理なり

擬似マルチスレッドならモジュール分けて別個非同期で処理汁

VBAでマルチスレッドは原則できない
モジュール内でVBSコードをビルドして独立外部処理を作り上げた上で自分を制御させるとか裏技が必要じゃね
528デフォルトの名無しさん:2011/04/13(水) 12:29:51.80
セルの指定に[ ]を使うことができる事を知って使おうと思ったのですが、
変数の内容でセルを指定したい場合、どのように使えばいいのでしょうか

例えばA列、変数hoge行目のセルをselectしたいとします。

Sub Macro1()
Dim hoge
hoge = 3
[a & hoge & ].Select
End Sub

だとダメでした。
結果が↓と同じになるようにしたいです。

Sub Macro1()
[a3].Select
End Sub

よろしくお願いします。
529デフォルトの名無しさん:2011/04/13(水) 13:36:23.38
[ ]は、変数使う必要が無い場合に限った簡略記述です
変数使いたい場合はRangeやCells使ってください
530デフォルトの名無しさん:2011/04/13(水) 14:24:43.11
>>529
そうでしたか、残念です。ありがとうございました
531524:2011/04/13(水) 15:24:53.35
>>527
thxです。
うーん、VBA不便すぐる…orz
532デフォルトの名無しさん:2011/04/13(水) 18:47:05.01
良い機会だから.NETに移行して、そっから制御しる
533デフォルトの名無しさん:2011/04/13(水) 20:29:02.79
VBA.NETでないの?
534デフォルトの名無しさん:2011/04/13(水) 20:46:51.47
dotnetでもそれなりのテクニックが必要じゃなかったっけ
535デフォルトの名無しさん:2011/04/14(木) 19:29:32.08
vbaからoutlookのメールを作成するツールを作成中です。
メールの形式はリッチテキストです。

http://www.red.oit-net.jp/tatsuya/vb/Outlook.htm
ここに書かれているような内容でメールを作っているのですが、
↓のように添付ファイルを文中に入れたいのですが、
Attachments.Addすると添付ファイルが本文の最後に挿入されてしまいます。
どうしたら文中に添付ファイルを挿入出来るでしょうか?

■メール本文
---------------------------------------------
hogehoge
【添付ファイル】
piyopiyo
---------------------------------------------
536デフォルトの名無しさん:2011/04/14(木) 20:26:34.74
Addメソッドに添付ファイルの挿入位置を示す引数がある、はず。
537526:2011/04/15(金) 06:18:32.76

長方形詰め込み問題としても
有名な難解問題だけど
誰かヒントを下さい



538デフォルトの名無しさん:2011/04/15(金) 07:45:12.84
ヒントはもう出てるし、そもそもスレ違い
539デフォルトの名無しさん:2011/04/15(金) 11:54:11.68
オプションボタンの使い方で教えてください。
エクセルが起動している間、前回フォームで設定した値を保持しておきたいんですが
(次にフォームを開いたときに前回の場所を覚えている。エクセルを終了した場合は初期値に帰る)
やはりstaticな変数などを用意して前回の値を保存するなどの方法をとる必要がありますでしょうか。
楽をできる方法があるようでしたら教えてください。
540デフォルトの名無しさん:2011/04/15(金) 12:31:07.63
staticな変数というか、モジュールレベル変数に値を保持しておく方法が
一番楽で一番一般的な方法だけど、それに何の問題があるの?

直接コントロールの初期プロパティを書き換える方法もあるけど
遙かに面倒な上に、この場合Excelの終了を跨いで設定が保持されちゃうので
起動か終了時に初期値に戻すコードまで必要になるし
541デフォルトの名無しさん:2011/04/15(金) 13:44:28.62
設定データ用シート作ってそこ使えば
542デフォルトの名無しさん:2011/04/16(土) 06:33:42.56
うんこのしかたをおしえてください
543デフォルトの名無しさん:2011/04/16(土) 08:35:23.84
ぶりぶり
544526:2011/04/16(土) 20:40:46.70
>>538
貴方の様なレスは不要です。w
545デフォルトの名無しさん:2011/04/18(月) 07:50:50.47
マクロで5000個ぐらいのファイルを順番に読み取り専用で開いてデータを取得して閉じるという作業をしています。
これまで問題なく動いていたのですが、excel 2007に変えてから途中で止まるようになってしまいました。
ファイルを閉じてもメモリが解放されず、途中でメモリがいっぱい(2G積んでいます)になることが原因のようなのですが、解決策がわかるかたいらっしゃいますか?
546545:2011/04/18(月) 07:53:07.14
(続き)
ファイルを閉じるたびに、
Set bk=nothing や
Bk. Saved =true
を入れてみても変わりませんでした。(bkは開いたファイルへの参照を示すオブジェクト変数です)
547デフォルトの名無しさん:2011/04/18(月) 10:16:01.19
>>545
変えたのはExcelだけ?Windowsは変わってない?
データファイルはExcel形式?テキスト?
548545:2011/04/18(月) 12:47:25.79
>547
レスありがとうございます。
OS はかわらず、XP pro SP 3です。
正常に動いていた時のexcel は2003で、大量に開くファイルも97-2003形式で保存されたexcel ファイルです。
タスクマネージャーで監視しているとファイルを開くたびに、使用メモリが増えていっています。
549デフォルトの名無しさん:2011/04/18(月) 14:31:58.20
>>548
2007でひたすらオープンとクローズ繰り返してみたけど
メモリ使用量に変化は見られない
オープンクローズのせいじゃなくて、プログラム上どっかに問題があると思うんだが....

ただ前にも同じような話あって、そんときはDoEvents入れたら動いたって
試しにやってみては?

それが再現するミニマムコードあればいいんだけどなぁ
XPはまさか64ビット版じゃないよな?
550デフォルトの名無しさん:2011/04/18(月) 15:04:03.15
このスレの>>86から、2007で大量のファイルを開こうとするとマクロが止まるってのがあるね
それと同じ症状かな?

>>549
同じファイルを何度も開くんじゃなくて、別々のファイルを開かないと症状が出ない可能性もあるし、
開くだけでなくデータを読み込まないとメモリを消費しないのかもしれない
551デフォルトの名無しさん:2011/04/18(月) 16:08:44.44
552デフォルトの名無しさん:2011/04/18(月) 16:09:19.20
携帯より失礼します。 <br> >>545 <br> とりあえず、Win32APIのSleep関数を入れるとCPU使用率が下がります。 <br> 1msecで良いです。 <br> お試しください。 <br>
553デフォルトの名無しさん:2011/04/18(月) 17:50:07.47
スレをまとめてみた

ttp://www47.atwiki.jp/excelvba/

見やすくしたり丁寧にまとめたりするのは誰かがやってくれるはず
17以前の過去ログいただけるとありがたいです〜
554545:2011/04/19(火) 00:00:43.87
>>549,550
DoEventsを入れてみましたが変わりませんでした。
で、気になって手作業での開く閉じるを、一回ずつ開くファイルを変えて何度も繰り返してみたところ、なんと、やっぱりメモリ使用量が増えていました。
一つ一つのファイルは128KBほどですが、開く時に3MBほど使用量が増えて、閉じた時には1MB しか解放されていません。
これはもうexcel 2007の仕様ということなんでしょうか。
他に同じ現象が出る方いませんか?
555デフォルトの名無しさん:2011/04/19(火) 00:13:30.73
>>554
どっかでWorkbookオブジェクトその他が暗黙的に生成されて開かれてるとか、
それがきちんとNothingにされてない(というかできない)んじゃないの?
556デフォルトの名無しさん:2011/04/19(火) 03:22:18.68
>>554
Windowsの仕様として、空いたメモリがすぐには解放されないってのがある
普通は15秒ぐらいの時間差で解放されていく
ファイルを閉じたあと、しばらく見てるとどう?
557デフォルトの名無しさん:2011/04/19(火) 03:33:24.10
>>554
すくなくともうちの環境では問題ない
手作業ってのは普通にエクセルファイルのダブルクリックか?

どうもエクセル以外に問題がある気がする
とりあえずディスプレイのドライバー最新にしてみるとか
ディスクトップ検索周り停止してみるとかしてみたら?
558デフォルトの名無しさん:2011/04/19(火) 13:55:33.25
円盤の上の何を検索するんだろ
559デフォルトの名無しさん:2011/04/19(火) 14:33:52.89
EXCEL2003

A1 = RSS|’N225’!現在値
A2 = ユーザー関数(パラメータ)

ワークシート内のセルから ユーザー関数を呼び出して使っています。
楽天RSSでRSS受信が発生するたびに、A2の再計算がおこなわれてしまいます。
一つだけなら問題ありませんが、実際は数百箇所もあり、再計算に3秒ほどかかっています。

ツールメニューから再計算を手動にすると、A1のRSS受信も止まってしまいます。
RSS受信しながら、ユーザー関数の再計算を止める都合のいい方法はないでしょうか?

お知恵を貸してください
560デフォルトの名無しさん:2011/04/19(火) 15:28:13.42
データの大半は円盤に記録されてますがな
561デフォルトの名無しさん:2011/04/19(火) 21:43:01.48
>>554
ADOでsqlなげるのはどう?オープンしなくてもデータもってこれなかったっけ?
562デフォルトの名無しさん:2011/04/20(水) 19:18:17.55
データファイルを開かないと上手くSQLでデータが取ってこれない時があった>>ADO&Excelの組み合わせ

それにExcelデータファイルをひらいてADOを使うとメモリリークが発生する
ActiveX データ オブジェクト (ADO) を使用して、開いている Excel ワークシートを照会するときメモリ リークに発生します
ttp://support.microsoft.com/kb/319998/ja
5631/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
5642/2:2011/04/21(木) 12:39:20.58
----

Const Const_User_Form_Str_ as String = "UserFormTest"

----

Sub Form_Load_Test2()
' ユーザーフォームUserFormTestを定数C_U_F_Str_に格納し、ロードします。
Dim Ufm_str_ As Object
Dim I_COUNT_ As Long

Set Ufm_str_ = VBA.UserForms.Add(Const_User_Form_Str_)
I_COUNT_ = 0

For I_COUNT_ = 0 To UserForms.Count - 1
Debug.Print I_COUNT_ & "/" & UserForms(I_COUNT_).Name
Next

Set Ufm_Str_ = Nothing

End Sub

**実行結果**

0/UserFormTest
1/UserFormTest
565デフォルトの名無しさん:2011/04/21(木) 14:03:57.69
>>563-564
どちらも二重ロードはしてないよ

但し、>>564の方は、Unloadせずに2回実行すればロード数は2に、3回なら3になる

これは、
Load ユーザーフォーム
だと、既にロードされている場合は新たにロードせず、ロード数は0→1にはなるが1→2にはならないけど

UserForms.Add(ユーザーフォーム名)
だと、既にロードされていても新たにロードし、ロード数は0→1→2→3と実行する度に増えていくだけのこと

Form_Load_Test を実行するとロード数は1、再度
Form_Load_Test を実行してもロード数は1のまま、この後
Form_Load_Test2 を実行するとロード数は1+1=2、再度   ※
Form_Load_Test2 を実行するとロード数は2+1=3

おそらく>>564の結果は ※ の部分なんだろうな

ロード数0の状態から
Form_Load_Test2 を実行するならロード数は0+1=1
Form_Load_Test2 そのもので二重ロードされてるわけじゃないから、0→2にはならない

というわけで、不要な物をきちんとUnloadしてやれば>>564のコードで
ユーザーフォームを変数に格納出来てるし、二重ロードにもなってないので問題なし
566デフォルトの名無しさん:2011/04/21(木) 15:01:46.85
ありがと、でもすまん勘違いしてた

変数読み込みでもアンロード漏れでもなく
イニシャライズするときに別モジュールに制御を渡して、そこからフォームを参照してた
フォームをロードする前に再度メモリに読み込みかけるから、結果二重になったみたい

でも単純にフォームを開いた時、ロードされるのは一個だな
vba.add()で開いた時には二重ロードしとる
5671/2:2011/04/21(木) 20:34:09.35
Excel2007
ワークシートのデータを固定長のテキストファイルで出力したいと考えています。
で、実行結果がこうなっていて、B列のデータのところが長さがバラバラな状態
になっているんで、この長さを揃えるにはどうしたらいいんでしょうか?

Sub TST()
Dim i As Integer
Dim strRec As String
Dim num As Integer
num = FreeFile
Open ThisWorkbook.Path & "\" & "test.txt" For Append As #num
i = 1
Do Until Cells(i, 1) = ""
If Cells(i, 1) = "" Then
Exit Do
End If
strRec = Format(Cells(i, 1), "00000") & " " & _
(Cells(i, 2) & Space(50 - LenB(Cells(i, 2))))
Write #num, strRec
i = i + 1
Loop
Close #num
End Sub

A B
1 1 12だだ
2 2 ああああ
3 3 ぐぐ2
4 4 tst
5 5 hhhhhhh
5682/2:2011/04/21(木) 20:36:20.24
結果

"00001 12だだ "
"00002 ああああ "
"00003 ぐぐ2 "
"00004 tst "
"00005 hhhhhhh "

569デフォルトの名無しさん:2011/04/21(木) 21:21:43.57
>>567-568
>>3★3,4
570デフォルトの名無しさん:2011/04/21(木) 21:33:04.04
571デフォルトの名無しさん:2011/04/21(木) 21:33:18.67
大本の原因がVBA特有の挙動だから良いんじゃね?
572デフォルトの名無しさん:2011/04/21(木) 23:46:58.59
>>570
ありがとう、そこのを見て勉強します

>>569
573デフォルトの名無しさん:2011/04/22(金) 00:47:49.02
>>567
うまく行かなかったら、どこでうまく行かないのかを
探すようにしてください。

今回なら
strRecが思い通りの固定長の文字列になっているかどうか
574てすと:2011/04/22(金) 19:01:14.26
"00001 12だだ "
575てすと:2011/04/22(金) 19:03:21.59
一瞬、568が再現しないと思ってビビったが、思った通りで安心
576デフォルトの名無しさん:2011/04/22(金) 19:29:53.97
埋め込みグラフをマクロで作成したいのですが上手くいきません
環境はエクセル2000です。
ActiveSheet.ChartObjects.Add(10, 20, 250, 120)
chartObj.Chart.SetSourceData ActiveSheet.Range("B2:B6")
577デフォルトの名無しさん:2011/04/22(金) 22:44:55.95
初心者に毛が生えた程度のカスでも分かるVBAを勉強出来るおすすめのサイトはありませんか?

過去スレ、現行スレ見ても全く理解できませんでした
578デフォルトの名無しさん:2011/04/22(金) 22:56:05.76
俺が教えてやんよ
579デフォルトの名無しさん:2011/04/22(金) 23:34:40.33
>>576
こうじゃない?

Dim chartObj As ChartObject
Set chartObj = ActiveSheet.ChartObjects.Add(10, 20, 250, 120)
chartObj.Chart.SetSourceData ActiveSheet.Range("B2:B6")
580デフォルトの名無しさん:2011/04/22(金) 23:36:24.77
俺はだんだん毛が抜けてきた
そろそろ初心者に戻るのか
581デフォルトの名無しさん:2011/04/23(土) 15:30:00.87
対象はWindowsXP+エクセル2003です。
グループ化されたものも含め、Shapesのテキスト一覧取得マクロを作っています。

問題のエクセルはここからDLできます。
http://www1.axfc.net/uploader/Sc/
Sc_227075.xls

シート1 だと全て取得できますが、シート2だと一部のテキスト(FFF と FFF2)が
取得できません。
ちなみに、EEE と書いてあるシエイプを削除するとうまくいきます。

原因や解決方法がわかったら教えてください。
582デフォルトの名無しさん:2011/04/23(土) 17:02:06.47
>>579
その方法でも出来ませんでした
元のデータがActiveSheetなのがいけないんでしょうか?
そこでマクロを記録して弄ってみたんですが

Dim G As Object   ’ChartObjectでもだめ
For G = 1 To 100
Charts.Add
ActiveChart.ChartType = xlLineMarkers
ActiveChart.SetSourceData Source:=Sheets("G").Range("A1:A100")
ActiveChart.Location Where:=xlLocationAsObject, Name:="G"
Next G

やっぱり上手くいきませんorz
583デフォルトの名無しさん:2011/04/23(土) 17:27:59.16
>>581
グループ化してるシェイプに対してループが回ってないようだから、
グループ化されてるシェイプを判定したら再帰処理するように書き換えたら
あとは処理しきったらExit ForなりGotoなりでループ抜けりゃいいよ
584デフォルトの名無しさん:2011/04/24(日) 09:48:33.13
VBAからoutlookのメールを作成する際に、
http://www.moug.net/faq/viewtopic.php?t=56305
上記のやり方でほぼ出来たのですが、
一点、BodyFormatプロパティにリッチテキスト形式を指定してメール作成した際、
フォントの色を設定したいのですが方法が分かりません。
↓を見ても、それらしいものが分かりませんでした。
http://msdn.microsoft.com/en-us/library/bb176688%28v=office.12%29.aspx

585584:2011/04/24(日) 09:51:57.80
ちなみにHTMLbodyを使うかと思いいろいろ試しましたが、
↓これだとhtmlで書いた書式が失われ、
HTMLBody = ""
BodyFormat = olFormatRichText

↓これだとリッチテキストではなくHTML形式に勝手に変更されてしまい駄目でした。
BodyFormat = olFormatRichText
HTMLBody = ""
586デフォルトの名無しさん:2011/04/25(月) 17:55:28.31
EXCEL 2000 (E) +XP SP3 :
下記の@で '1004' Method of 'Range' of '_worksheet' failed
となります。
mSht.Range(""" & rStrAr(i) & """).Copy Destination:=tmpSht.Cells(1, 1)
でもだめでした。:お助けを。
-----
Public Const AA As String = "A416:G602"
Public Const BB As String = "A604:M811"
Public Const CC As String = "A813:G821"
Option Base 1
587デフォルトの名無しさん:2011/04/25(月) 18:00:06.67
WinXP,Office2003です。
IsMissing(v)が真となるVariantの即値または組み込み定数はありますか?
この値を返す関数を作るのは簡単ですが、残念ながら関数の返値を用いて
定数を定義することはできないみたいですね。
588586つづき:2011/04/25(月) 18:19:31.22
Sub F()
Dim rAr(3) As String, nAr(3) As String
rAr(1) = AA: rAr(2) = BB: rAr(3) = CC: nAr(1) = "A": nAr(2) = "B": nAr(3) = "C"
Set mSht = ActiveCell.Parent: mT = mSht.Name
For i = 1 To 3
Set tSht = Sheets.Add
tSht.Name = mT + nAr(i)
Set tR = mSht.Range(rAr(i)) '---@
tR.Copy Destination:=tSht.Cells(1, 1)
Next i  :End Sub
589デフォルトの名無しさん:2011/04/25(月) 18:31:22.07
通常モジュールに書いてワークシート選択してから実行すればいいんじゃね
590デフォルトの名無しさん:2011/04/25(月) 19:04:20.51
>>586
XP+Excel2003(もちろん日本語版)で試したけど正常に動いた
シート名に日本語使ってる?
591586:2011/04/25(月) 19:22:06.05
>>590
シート名英字でした
動きますか。。。(E)はだめです。
なにか言い換え、迂回策はないでしょうか?
592デフォルトの名無しさん:2011/04/25(月) 22:01:12.90
質問です。
excel2003で作成したvbaプログラムをWin7×excel2010の互換モードで動作させてますが、
元シートから新シートへ書式コピー後、新シートの一部の行の高さや行番号の表示がおかしいです。
具体的には一部の行が
「行高さを409ピクセルまで広げたら縦真ん中に行番号と値がある」状態です。つまり動作直後の表示では行番号と値がまるきし見えないのです。(表示は意図した行高さのため)
互換モードを解除すると問題なく動作します。
また、複数のブックに見られたので同じ条件で発生するのかと思いきやそれぞれ微妙に違う条件で発生し、
上記条件を取っ払ってみたんですが発生します。新シートへコピー後、一度でも保存したり行番号が見えなくなっている行を手動で「高さを自動調整」すると高さが正常に戻ります。
コピー直後のセルのROWHEGHTは意図した通りで正常です
これは互換モードの不具合なのでしょうか。
自分はvba初心者なんですが、互換モードにはよくあることなんでしょうか
593デフォルトの名無しさん:2011/04/25(月) 22:42:31.74
2003から2007での移行で互換モードにちょこちょこ不具合あるらしいが

検索した感じだとここらへんか
http://park.geocities.jp/tryvba/excel2007question.html

コード晒せないならなんとも言えん。
594デフォルトの名無しさん:2011/04/25(月) 23:15:26.53
>>593
ありがとうございます!助かります〜でもこのサイトのコードにはひっかかりませんでした。
「元シートをセレクトして範囲をコピー後、新シートに貼り付け」している数行で起こっていることです。
コードは出せませんがマクロで出力されるようなコードです。(もちろん一部分のことです)
効率が悪いと思い一行に書き直しても現象は変わらずでした。
私的には行を表示させるための自動計算が互換モードのある条件の時にすっぱ抜けているようにしか見えません。(が、発生条件に照らし合わせるとコピー範囲の大きさやデータサイズの関係がある?行高さの計算関数内で値が落ちてる?気もします)
とりあえず暫定対処方法は見つけたのですが、
悔しいですね…
互換モードは止めたほうがいいほどToo BUGGYなんでしょうか?
595デフォルトの名無しさん:2011/04/26(火) 03:50:18.36
俺、5年前には、VBAなんて5年後誰もやってないだろうなと思ってたが、まだまだ廃れる勢いじゃないなと思った。
勉強し直します。
596 忍法帖【Lv=1,xxxP】 :2011/04/26(火) 23:37:22.31
エクセルがあるかぎりvbaは変わらなそうだね
597デフォルトの名無しさん:2011/04/26(火) 23:48:41.13
>>595-596
COBOLみたいな感じで長く細く続くんですかね。
顧客にはエクセルで済ませたら安そうだからみたいな人が多いように感じました。うちの庶務でもいじれるみたいな。
598デフォルトの名無しさん:2011/04/27(水) 08:06:04.03
>>597
敷居が低いのがひとつの特徴だからね。
マの人にとっては大変な言語だよね。予算と期限的な意味で。
庶務レベルでもいじれるのと製品レベルで仕上げるのはまったく違うのにね。。。
599デフォルトの名無しさん:2011/04/27(水) 08:14:17.11
時々庶務ですげえセンスのある人が居て
関数等を駆使して「こんなことVBA使わないでできるの!?」
みたいなのも見かけるがね。

クエリとマクロで組み上げた巨大なmdbをシステム化してくれとか
600デフォルトの名無しさん:2011/04/27(水) 08:30:10.04
それメンテナンスが大変そうだなあ
601デフォルトの名無しさん:2011/04/27(水) 12:39:44.11
優秀な人が一人でがんばるのはいいけど、退社したあとにみんな困るパターン

本当に優秀なマはあとでメンテしやすいようにモジュール化をきちんとやって
コメントもしっかり入れて、ドキュメントやヘルプまで残すもんだ
使う言語がどうとか処理効率とかミリ秒の違いばっかり気にしてるうちはまだヒヨッコ
602デフォルトの名無しさん:2011/04/27(水) 12:57:41.75
速度は確かに最優先課題じゃねーな。
ようは美しいかどうかだ。
汚いのものは総じて遅いから問題なだけ。
603デフォルトの名無しさん:2011/04/27(水) 13:16:47.24
その美しいとか汚いとかが、独りよがりだったりするから問題なわけw
604デフォルトの名無しさん:2011/04/27(水) 13:21:55.95
処理効率を考えるのはコンパイラの役割だが
VBAの時点で処理効率考えるのは無意味
605デフォルトの名無しさん:2011/04/27(水) 13:25:20.40
jsk(汚い=可読性が悪い)だよな。
プロでもそこらへんにゴロゴロしてる。

606デフォルトの名無しさん:2011/04/27(水) 13:29:59.48
美しいコード書く人に聞きたいんだがw
一般的に汚いってのは、インデントグgchgch、Select多用、行番号使いすぎ
その他どんなのがあるの?
607デフォルトの名無しさん:2011/04/27(水) 13:37:22.77
>>606
行番号使いすぎってなんだ?
俺が入れるとしたらコメント多杉だな。
608デフォルトの名無しさん:2011/04/27(水) 14:03:30.37
俺の意思でVBAを選んだわけじゃない
与えられた条件で仕事をこなすのがプロ
609デフォルトの名無しさん:2011/04/27(水) 14:09:51.77
「読みやすい」と「美しい」は別

読みやすく書くには一定の法則を守り、それが首尾一貫しているかどうかで、訓練すれば誰でも出来ること
インデントがどうのってのはこっちの話

美しく書くには才能やセンスが必要
610デフォルトの名無しさん:2011/04/27(水) 14:11:46.59
コメントってコードだったんだ・・・・・!?
コメントを変えると挙動はどう変わるんだろう・・・・・w
611デフォルトの名無しさん:2011/04/27(水) 14:16:49.88
コメントは言語によって意味があるか無いかが変わるが
VBAのコメントには意味が無いというのが定説
612デフォルトの名無しさん:2011/04/27(水) 14:23:10.08
「動けばいい」書きっぱなしのプログラムばっか書いてる素人にとっては、コメントはどうでもいいんだろうね

プログラムの性能ってのは計算速度だけじゃなくて、仕様変更や拡張が柔軟にできるかどうかってのも重要な要素
それにはコメントは必要不可欠
つまりコメントの書かれてないコードはプロにとっては「性能が悪い」物になる
613デフォルトの名無しさん:2011/04/27(水) 14:30:07.94
コメントの仕様・ルールを厳密に整備していない
VBAは、ダメ言語
614デフォルトの名無しさん:2011/04/27(水) 14:33:12.06
ダメ言語を上手く使うのがウデの見せ所
ダメ言語をダメだダメだと糾弾するだけで上手く使えない奴は
良い言語使わせたところで、どうせ並以下のことしか出来やしない件w
615デフォルトの名無しさん:2011/04/27(水) 14:38:46.84
コメントの仕様が厳密じゃない言語の方が多いだろ
こっちは選べないんだよ
それともなんだ?いちいちコンパイラを自腹を切って買うのか?
業務用だと値段も高いから大変世界だぞ
616デフォルトの名無しさん:2011/04/27(水) 15:36:29.93
コメントは後の保守性とエラーコーディングと再利用に貢献する
狭義のプログラムとしては価値がないが、広義のプロジェクトを延命させリフレッシュさせるための有用なコード
書く人間がどこを意識するかで意味が異なるから一概に何が正しいとかはないが、他人に引き継ぐならコメントなり説明なりコーディングルールなりはあるといいな
617デフォルトの名無しさん:2011/04/27(水) 17:40:04.88
処理効率を考えるなら言語じゃなくアルゴリズムを考えるものだと思っていたが、最近は「アルゴリズムって何?」って程度の人でもなんとかなること多いよなぁ。
不一致クエリーなんてアルゴリズム知らなくても使えるし。
618デフォルトの名無しさん:2011/04/27(水) 20:20:19.60
ダメなのは>>613自身だろ

ちゃんとクラスモジュール使ってきちんと書けば、.NETに近いシンプルな記述が出来る
インターフェース継承ができるから、大概のことは実現できる

センスが欠如してるのを、言語のせいにするやつってのは例外なくカスだ
619デフォルトの名無しさん:2011/04/27(水) 20:26:08.23
と言っても可読性で一番不味いのは構造化例外が使えないところか
デリゲート使えないからイベントも作れないし
そこは見て見ぬふりだ
620デフォルトの名無しさん:2011/04/27(水) 21:05:10.34
美しいプログラム、わかりやすいプログラムに共通するのが
モジュールわけや定数名、オブジェクト名が直感的に理解できるつくりだと思っています。
本当に直感的に理解できるプログラムはコメントはいらない、コメントがいらないようなコードを書きなさいとばっちゃに言われました
621デフォルトの名無しさん:2011/04/27(水) 21:12:14.13
だな。
コメントを全否定はしないが、すべてにコメントつけるやつはなんだかなぁと思う。
i = i + 1にまでコメントついてるの見たときはあきれたよ。
622デフォルトの名無しさん:2011/04/27(水) 21:18:16.18
> 直感的に理解できる
は殆ど本人の独りよがりで、他人には直感的に理解できない件w

つーか、>>620-621なんで別人のフリしてるの?
623デフォルトの名無しさん:2011/04/27(水) 21:20:13.28
また妄想がひどいのがいるねぇ。
いつものことだが。
624デフォルトの名無しさん:2011/04/27(水) 21:20:47.84
行コメントがいる場合ってそれほどないですよね。
コードを直感的に書ける人=センスのある人なのかなと。

コードの統一感だって結局は直感的に理解しやすくなるからってことでしょうし。
625デフォルトの名無しさん:2011/04/27(水) 21:21:50.74
業務で使う話をしてるのに、直感とか定量化できないものを根拠にされても
アホの世迷い言にしか聞こえないわ

本人だけ理解しているオナニーを改めて、ちゃんと世間並みのコーディング
規約を調べて、自ら定めたそれに従えって
626デフォルトの名無しさん:2011/04/27(水) 21:27:03.48
>>622
スルーするとこだけど、なんでそんなに直感的って言葉に否定的なのかは知りたい。
627デフォルトの名無しさん:2011/04/27(水) 21:28:10.98
君が馬鹿だと直感したんじゃねえの?
628デフォルトの名無しさん:2011/04/27(水) 21:32:22.90
>>625
大きなプロジェクトは大抵コーディングもクラス設計にもきちんとした規約を作るし、もちろん従うよ。
そのせいもあって業務側で直感的なクラス設計が出来なくなるパターンもあるけど…
629デフォルトの名無しさん:2011/04/27(水) 21:35:01.02
VBAで大きなプロジェクト(笑)になるぐらいなら、C#なり別の言語にした方が良いかと思われます
630デフォルトの名無しさん:2011/04/27(水) 21:41:30.04
>>629
いや、他言語をやってたのでそれはよくわかってる。
逆にVBAは全然私は詳しくないんだが、VBAには無理ってことなの?
それならまあ…いやそれでも関数くらいなら関数宣言時のコメントあれば行コメントいらんべさ
631デフォルトの名無しさん:2011/04/27(水) 21:42:55.64
会社でコーディング規約を大事にするのは結構だが、Q&Aの掲示板では全部コメント書いたら見づらくてしょうがない。
632デフォルトの名無しさん:2011/04/28(木) 09:26:08.97
最近C言語やアルゴリズムの本などいっぱい出してる人とんと見かけなくなったな。
VBAに関してはちょっとあれだったが、C言語とかではお世話になった。
VBAのできからして別人かも知れないけど。
633デフォルトの名無しさん:2011/04/28(木) 09:54:35.32
>>632
誰のこと?
634デフォルトの名無しさん:2011/04/28(木) 11:10:28.63
最近はそもそも新しいソフトウェアの導入が難しい会社ってのは多い
CSHARPで作ったら規約違反だから使えないとかね
その点VBAは「これエクセルですから」って言えるし、社員自身の拡張メンテ自由度が高い

まあ簡易なプロジェクトメインだが
635デフォルトの名無しさん:2011/04/28(木) 12:12:38.76
小さくてもVBAでプロジェクトはないだろう
せいぜい「事務仕事がちょっと楽になる」程度にしとかないと、あとが大変だぞ

コンパイラの利用を認めさせるか、素人で非効率なことやってないでプロに外注
636デフォルトの名無しさん:2011/04/28(木) 13:12:45.36
プロに外注なのに、EXCELでVBAでって指定のあるプロジェクトは
ごく稀というほどでもなく存在するぞ
637デフォルトの名無しさん:2011/04/28(木) 15:23:40.06
union じゃなくて、十字にクロスするRangeをとりだす
メソッドが思い出せない。
intersection?
638デフォルトの名無しさん:2011/04/28(木) 15:37:06.24
Application.Intersectかな?

つーかVBEには自動補完あるんだから>>637まで解ってれば
自力で簡単に正解に行き着きそうなもんだが
639デフォルトの名無しさん:2011/04/28(木) 16:39:23.60
自動メンバ表示切ってたりして。
640デフォルトの名無しさん:2011/04/28(木) 22:29:50.50
>>633
本を出してる人のコード見たら全然別人だったわ。
ちょっとあれなのは本出してる人とは別の人ね。
よかったよ。
641デフォルトの名無しさん:2011/04/29(金) 19:03:11.36
入力フォームを作成しているのですが
個数や単価、合計を入力するところを
表にしたいのですが、
フレームなんかを使って擬似的にするしかないですか?

フォームのデザインって難しいですね。
642デフォルトの名無しさん:2011/04/29(金) 19:30:34.08
使ったことがないけど
その他のコントロールから
Microsoft Office Spreadsheet コントロールを使うとか
643デフォルトの名無しさん:2011/04/29(金) 22:34:49.98
>>641
普通にエクセルのセルじゃダメなの?
644デフォルトの名無しさん:2011/04/30(土) 03:11:09.21
>>641
ExcelのフォームにOLEでExcel埋め込めないんだっけ?
以前VB6.0でなら試したことあるけど。
645デフォルトの名無しさん:2011/04/30(土) 03:33:03.96
それが>>642でしょ
646デフォルトの名無しさん:2011/04/30(土) 06:38:39.86
あれはWeb用だったような・・・
関数とか使えたっけ?
647642:2011/04/30(土) 07:01:49.21
>>646
全っ然知らん w
648デフォルトの名無しさん:2011/04/30(土) 10:21:40.83
Web用って何を指して言ってるのか分からないから答え様が無い
649デフォルトの名無しさん:2011/04/30(土) 11:05:51.28
セルに入力してサブフォームに貼り付けてやれば楽だと思ったり
650デフォルトの名無しさん:2011/04/30(土) 11:06:01.70
2007で拡張子.xlsのVBAを使って他のブック(.xls)のパスワードを解除する命令が無視されて、画面上でパスワードの入力を求められる(2回も)ようになりました。
 [更新プログラム MS11-021 KB2464583」をアンインストールすると処理できるようになりました。更新プログラムのバグ?VBAの仕様変更?情報をお持ちの方がいらっしゃいましたら、教えていただけないでしょうか?
651デフォルトの名無しさん:2011/04/30(土) 11:16:14.85
652デフォルトの名無しさん:2011/05/01(日) 05:33:06.22
コメント『'』じゃないやつ多様してて解りにくいコードがあったの思い出した。あれワザとなのかな?
653デフォルトの名無しさん:2011/05/01(日) 06:52:41.51
Remのこと?
654デフォルトの名無しさん:2011/05/01(日) 08:22:42.78
「'」と書くと必要バイト数が増えるじゃないか!

というのが昔のBasicだとあったけど絶対関係無いよなw
655デフォルトの名無しさん:2011/05/01(日) 12:10:14.48
他人と違うとこ見せたいだけだよ
どっちにしてもコメントは多すぎると可読性は悪くなる
俺はコメントの多いソースは消してから読むから別に困らないが
656デフォルトの名無しさん:2011/05/01(日) 12:44:41.35
> 俺はコメントの多いソースは消してから読むから別に困らないが
バカっぽいw

つーかプログラミングにおける可読性の評価基準は、コメント以外って定義だから
コメントの量によって可読性が左右されることは無いんだよね
そもそも「コメントが多いと可読性が〜」なんてのは「モニタが小さいと可読性が〜」ってのと
同レベルの話
657デフォルトの名無しさん:2011/05/01(日) 14:15:34.70
変更が重なってコメントと処理が
食い違ってるってのでもない限り気にならん。

コメント多いと嫌なのは処理の変更後コメント修正
忘れるやつが多いからなんじゃないかな。
658デフォルトの名無しさん:2011/05/01(日) 16:18:04.83
>>656
条件がいっぱいあってごちゃごちゃした判定式とか分岐とか、
コメントがあれば丹念にコード読む必要なくなるじゃん
659デフォルトの名無しさん:2011/05/01(日) 18:18:54.71
コメントねぇ・・・。意外に簡単な様で難しい議題だね。
PGを作る時点で可読性を高めるか処理速度を優先するかにも関わって来るから一概に
言えないんだよねぇ。例えば、Long型の変数BとCが同じならBoolean型変数のAにTrueを、同じで無ければAにFalseを
設定する様なPGを作るとするじゃない?で、それが結構重い処理で何回も行うループの中に必要だったと。
例えば、
Dim A As Boolean
Dim B As Long
Dim C As Long
の後、
A = False
If B=C Then
A = True
End IF
か、
A = B = C
みたいな2つの方法を思いついちゃって、流石にA = B = C は分かり辛いから、A = (B = C)にしましたと。
まず、どっちの方法を選びますかと言う問題と、コメントはどうしますかと言う問題があるんだよね。
多分人によって回答は違うと思うけど、センスの問題になって来ると思う。
660デフォルトの名無しさん:2011/05/01(日) 18:38:09.61
userformのテキストボックスから、改行含むデータを一行ずつ取得する方法がわかりません
いろいろ調べてプロパティやlinesなど手を出してみたのですが・・・
どなたかご教授願えないでしょうか?
661デフォルトの名無しさん:2011/05/01(日) 18:43:37.89
>>660
テキストボックスから纏めて取って来たデータをVBCrlfでパースすりゃいいんじゃないの?
言ってる意味違う?
662デフォルトの名無しさん:2011/05/01(日) 18:49:09.07
>>661
返信ありがとうございます
本当に無知で申し訳ありません、VBCrlfでパースの意味を詳しく教えていただけないでしょうか?
663デフォルトの名無しさん: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に突っ込んでやって、
あとは配列から何番目の行のデータを取ってくるかって、
こんな意味で書いたんだけど、違っているかな?
664デフォルトの名無しさん:2011/05/01(日) 19:04:38.31
あぁ、
Call MsgBox(sTextValue(I)
のケツの括弧が無い・・・

ごめん、Call MsgBox(sTextValue(I))ね。
665デフォルトの名無しさん:2011/05/01(日) 19:27:26.33
因みにMe.Text1が読み込むテキストボックスコントロールのつもりで
書いたんだけどCellと違うから、Me.Text1.Textとか
Me.Text1.Valueとかやらんとエラーで落ちるかもしんないね。

明後日Office2010買う予定だから
それまで待っててくれればもっとキチンと答えられると思うけど・・・
666デフォルトの名無しさん:2011/05/02(月) 09:44:50.29
msgboxをcallで呼ぶだと?
無くもないがなぜにだ
667デフォルトの名無しさん:2011/05/02(月) 10:16:11.93
気分。
MsgBoxに限らず、戻り値の無い関数やメソッドはそれを呼び出している事を
明示的に表す為にそう記述する癖が付いている。
668デフォルトの名無しさん:2011/05/02(月) 11:23:18.74
組み込みでもcall呼ぶのか……



アリだな
669デフォルトの名無しさん:2011/05/02(月) 12:47:11.94
ん?組み込みでも?
これがまだVBAの話だから組み込みだからとか、自作関数だからとか、
考え的に分けているのかもしれないけど、いずれVB.Netとかをやる様になったら同じ名前を付けてその引数の数や型で見分けて
違うメソッドを実行する場合もあるからね。
組み込みだからとか違うからとか言う区分けはここでの説明には不適切だと思うよ。
670デフォルトの名無しさん:2011/05/02(月) 14:06:48.55
.NETならオーバーロードがあるんだから意味なくね?
自作関数や自前クラスとかならまぁ意義はあるけど
671デフォルトの名無しさん:2011/05/02(月) 14:28:11.95
>>670
そのオーバーロードの事言ってるんだけど
672デフォルトの名無しさん:2011/05/02(月) 14:37:04.24
俺は自作の刻だけcallしてたが、その使い方は確かにアリだな
参考にしまう


自作関数の戻り値を変数に入れる時call使えないから一貫性がなくてもやもやしてたんだ
673デフォルトの名無しさん:2011/05/02(月) 15:04:34.16
むかしのVBで、callをつけないとエラーになる時期があった
今はいらない。互換性のために残されてるだけ
674デフォルトの名無しさん:2011/05/02(月) 17:49:52.02
アクティブなセルを画面中央にスクロールさせるにはどうしたらよいでしょうか?

マウスでクルクルや、スクロールバーをウニウニさせるのが面倒なので
マクロにしてキーボードショートカットにしたいです。
675デフォルトの名無しさん:2011/05/02(月) 20:20:53.82
>>674
アクティブなセルが端の場合はどうする?
676674:2011/05/02(月) 21:19:32.13
>>675
そっか、A1とか左上の方のセルにいる場合は無視ですね。
画面に表示されている範囲を取得する方法がわからないのです。
677デフォルトの名無しさん:2011/05/02(月) 21:31:03.89
>>676
つActiveWindow.VisibleRange

マクロのポイントで正確の"Visible/可視"範囲を返す
ttp://support.microsoft.com/kb/149241/ja
678デフォルトの名無しさん:2011/05/02(月) 21:40:09.16
EXCELのワークシート上に配置したコマンドボタンのウインドウハンドルを
取得する方法がありましたら教えてください。

※別ファイルのEXCELマクロからボタンをSENDMESSAGEで押下したいためです。
679デフォルトの名無しさん:2011/05/02(月) 21:59:13.08
>>676
ActiveWindow.ScrollRow = 5
ActiveWindow.ScrollColumn = 5

これでE5が左上に来る
5の数字のところを変数に変えてうまく指定してSelectionChangeと組み合わせる
680デフォルトの名無しさん:2011/05/02(月) 22:37:16.40
>>679
こうか?

r = ActiveCell.Row
c = ActiveCell.Column
rf = 1
cf =1
or = 10
oc = 5
if r - or > 0 Then rf = r - or
if c -oc > 0 Then cf = c - oc
ActiveWindow.ScrollRow = rf
ActiveWindow.ScrollColumn = cf
681デフォルトの名無しさん:2011/05/02(月) 22:44:08.76
>>680
動かねーぞ
682デフォルトの名無しさん:2011/05/02(月) 22:59:40.73
動かねーぞ
683デフォルトの名無しさん:2011/05/02(月) 23:02:51.35
動かねーぞ
684デフォルトの名無しさん:2011/05/02(月) 23:20:34.87
動かねーぞ
685デフォルトの名無しさん:2011/05/02(月) 23:39:33.28
動かねーぞ
686デフォルトの名無しさん:2011/05/03(火) 00:04:29.53
質問なんだが。たとえば任意で列(A列とC列)を全選択して、
指定した条件に一致したセルにだけ処理を施すというのはできるんだろうか?
A列を全選択→指定条件に一致するセルがあったらそのセルの背景色を変える、
というのはできたけど、A列と離れてるC列に同じ処理を同時に施すことは
できなかったので。
687デフォルトの名無しさん:2011/05/03(火) 00:07:38.00
>>686
条件付けがVBAで拾える範囲なら出来る
セルになんらかのデータがあるとか、法則性があるとか。
セルあるデータに規則性があるなら、VBAでなくて条件付書式使うべきかな
688デフォルトの名無しさん:2011/05/03(火) 00:09:31.57
>>686
Union(Columns("A"), Columns("C").select
689デフォルトの名無しさん:2011/05/03(火) 00:12:43.56
>>688
訂正
Union(Columns("A"), Columns("C")).Select
690デフォルトの名無しさん:2011/05/03(火) 00:17:57.89
>>688
>>689
しねごみくず
691デフォルトの名無しさん:2011/05/03(火) 00:26:43.79
>>686
色塗りゃいいってんなら、任意の列に条件付き書式設定しとけばわざわざVBAで
設定する必要もないべさ
692デフォルトの名無しさん:2011/05/03(火) 00:34:00.08
ああ、>>687が既にそう言ってるのね。
数式で賄え無いならユーザー関数作って補えばいいべさ。
693デフォルトの名無しさん:2011/05/03(火) 00:46:12.78
今度はこっちから質問ですわ。
Boolean型のTrueとFalseをInteger型やLong型に置き換えるとそれぞれ-1と0になるよね。
あれって全てのビットを立たせてある状態と全てのビットを立たせてないと言う状態を表す為に
あんな数値になってるって事で認識合ってる?
694デフォルトの名無しさん:2011/05/03(火) 00:48:10.81
>>687-689>>691-692
レスありがとう。背景色つけるってのは例みたいなもんだから、
個人的には計算式ぶちこんだりセル結合したりと、もう少し手を加えたいと思ってるんだ。
だから条件付け書式は使えないかもしれない。
VBAかじり始めたばかりなのでunionは使ったことなかった。明日試してみることにするよ。
ありがとう優しい人達。
695デフォルトの名無しさん:2011/05/03(火) 01:05:06.53
>>693
それでOK。
昔のBASICでの真偽値の表し方を継承しているとも言えるけど、
結局はそういう目的だったろうし。
696デフォルトの名無しさん:2011/05/03(火) 01:05:36.56
>>678
センドメッセージを使うと言う事はAPIを使って他のEXCELファイルのボタン押下処理を実行したいって事?

残念ながらボタンのウィンドウハンドルの捕まえ方は知りません。
代用の方法としてApplication.Runで他ブックのボタン押下時の処理を呼び出してみてはいかが?
697デフォルトの名無しさん:2011/05/03(火) 01:07:02.89
>>695
あざーす。これでちょっとモヤってたのがスッキリしました。
698デフォルトの名無しさん:2011/05/03(火) 01:08:43.26
>>693
TrueとFalseがVBA内の定数じゃないの?
699デフォルトの名無しさん:2011/05/03(火) 01:12:50.33
>>698
そう。だけど中身ひっくり返してみると実はって所の質問だったんですわ。
700デフォルトの名無しさん:2011/05/03(火) 03:02:01.24
>>696
返信ありがとうございます。
マクロにパスワードがかかった別EXCELのボタンを押下しようとしています。
701デフォルトの名無しさん:2011/05/03(火) 03:04:06.37
>>696
OLEObjectsを使用してボタンをアクティブ後、SendKeysでボタン押下はできたのですが、
何度か試してみるとタイミングにより押下できていない場合がありました。
SendKeysでの押下だと確実性がないため、ウインドウハンドルを取得してSendMessageで押下しようとしています。
702デフォルトの名無しさん:2011/05/03(火) 04:08:53.89
パブリックにしたいってこと?
703デフォルトの名無しさん:2011/05/03(火) 05:11:05.71
> OLEObjectsを使用してボタンをアクティブ後
まで出来ていて、なんで>>700のような発言が出るかねぇ?

マクロの表示にパスワードが掛かってようと、ボタンオブジェクトの取得まで出来ているなら
コントロールツールのボタンなら.Nameを調べて「ブック名!シート名.Name_Click」
フォームツールのボタンなら.OnAction調べて「ブック名!OnAction」
これをApplication.Runすれば良いだけじゃん
704デフォルトの名無しさん:2011/05/03(火) 07:12:15.52
(Excel 2003)質問です。
自ブックの終了処理イベントで、
自ブックが使用しているExcelアプリケーション内に、
他のExcelファイルを複数開いた場合の対処を行いたい。
以下コードで困っている事は、終了時確認メッセージが2回出てしまい、
複数開いているファイルに対しても閉じる(Yes/No/Cancel)挙動をみせる。
任意以外のメッセージが出ないようにして、閉じるようにできますか?

Option Explicit
Private Sub Workbook_BeforeClose(Cancel As Boolean)
If MsgBox("終了しますか?", vbYesNo + vbQuestion + vbDefaultButton2) = vbNo Then
Cancel = True '終了させないようフラグを立てる。
Exit Sub
End If
'自ブック以外(2件以上)ブックが存在する場合
If 1 < Me.Parent.Workbooks.Count Then
'Excelアプリケーション自体は終了せず
'自ブックだけ保存せずクローズする。
Call Me.Close(SaveChanges:=False)
'自ブックのみ存在時
Else
'Excelアプリケーション自体を終了する。
Call Excel.Application.Quit
End If
End Sub
705デフォルトの名無しさん:2011/05/03(火) 08:12:46.67
>>704
> 複数開いているファイルに対しても閉じる(Yes/No/Cancel)挙動をみせる。
この認識がまず間違い

自ブックに対する閉じる処理を2回やってるから、確認メッセージも2回出るだけで
> 複数開いているファイルに対して
閉じる挙動が出ているわけじゃない

2回というのは、まずは手動でのClose(閉じる)処理、そして2回目はコードでのMe.Close
Closeを任意で2回やってるんだから、BeforeCloseイベントも2回呼ばれて、
BeforeCloseイベントに書かれた確認メッセージも2回出る、つまり
君自身が任意で行った(書いた)Close処理の回数だけ確認メッセージが出るという当然の結果

Closeを1回にすれば、当然確認メッセージも1回しか出ないし、2回目のClose(Me.Close)の前に
フラグ立てて、BeforeCloseイベントの最初にフラグ立ってたらExit Subする処理を入れるとかすれば
2回目のCloseでは確認メッセージが出る前にイベントを抜けるから、2回目の確認メッセージは出ない
706デフォルトの名無しさん:2011/05/03(火) 12:34:30.27
Excel2002、winXPSP3
CPU:Athlon64 3500、メモリ:1G

15000行×35列のシート8枚について、それぞれ同一処理を行うマクロを作りました。
しかし、6枚目あたりから処理時間が長くなり、8枚目でリソース不足のメッセージが出ます。
現状でファイルサイズは101MBです。

こういう場合、シート数、データ数を減らす以外でどのようなことをすれば、
リソース不足が発生しなくなるのでしょうか。
707デフォルトの名無しさん:2011/05/03(火) 12:49:03.92
>>706
その処理をプロシージャに書いて8回呼び出す
708デフォルトの名無しさん:2011/05/03(火) 14:31:11.59
>>694
Rangeでもできる
Range("A:A,C:C,E:E,3:3,O5").Select
Unionが有効なのは変数を使って動的に範囲を指定したいときに楽にできる
709デフォルトの名無しさん:2011/05/03(火) 17:05:34.65
>>706
どんな処理を行ってるかによりけり。
今分かってる状況だけで言うとメモリを増設したらとしか言えない。
710デフォルトの名無しさん:2011/05/03(火) 20:59:35.92
ISNUMERICとisnumberって結果は同じ?
711デフォルトの名無しさん:2011/05/03(火) 21:09:27.61
712デフォルトの名無しさん:2011/05/03(火) 21:13:39.79
>>711
ありがとう
713デフォルトの名無しさん:2011/05/03(火) 21:19:55.42
別物
isnumeric(゙4E2゙)
isnumber(゙4E2゙)
では結果が異なる
isnumericは文字列で渡されたデータでも数値変換してから判定する
714デフォルトの名無しさん:2011/05/03(火) 23:14:58.65
>>703
返信ありがとうございます。

実行後の結果を保存する都合上、オブジェクトを開いてからApplication.Runするサンプルを組んでみました。
ワークブック、ワークシート側共に「マクロが見つからないというエラーが発生してしまいます。」
呼び出し方が悪いなどありましたら、ご指摘願えませんでしょうか。

Dim xx As Excel.Workbook
Dim sh As Excel.Worksheet
Set xx = Workbooks.Open(Application.ThisWorkbook.Path & "\a.xls")
Set sh = xx.Sheets("S1")

xx.Application.Run "S1.cmdExecuteA_Click" ←見つからないというエラー
sh.Application.Run "cmdExecuteA_Click"  ←見つからないというエラー
715デフォルトの名無しさん:2011/05/03(火) 23:46:24.22
>>714
Application.Run xx.Name & "!S1.cmdExecuteA_Click"
Application.Run xx.Name & "!" & sh.Name & ".cmdExecuteA_Click"

Applicationオブジェクトをボタンの置かれているブックやシートのオブジェクトから呼ぶ場合でも
ちゃんとブック名から指定しないとダメだぞ

つーか>>703にも「ブック名!」を付けろって書いてあるのに、なんで勝手に外すんだ?
Runのヘルプにも、一番最初に
> このメソッドの引数では、名前を使用できません。引数には、位置のパスで必ず指定してください。
って書いてあるのに・・・
716デフォルトの名無しさん:2011/05/04(水) 00:27:43.19
>>715

返信ありがとうございました。

ブック名付きでエラー出たので、外して検証していたソースを載せてしまいました。

以下で解決しました。ありがとうございます。
「ブック名!シート名.Name_Click」
 ↓
「ブック名!シートオブジェクト名.Name_Click」
717デフォルトの名無しさん:2011/05/04(水) 13:53:01.79
質問。選択した列の一部のセルの番地だけを取得して
メッセージとして表示するのはどうしたらできるかな。
たとえばC列を全選択していたとして、メッセージボックスには
「C1:C12」とだけ表示したいんだが。そういうのって無理かな。
718デフォルトの名無しさん:2011/05/04(水) 15:19:39.08
一部ってどういう規則なの?
選択した列の1〜12行目ってこと?

ちゃんと日本語で、エスパーじゃない人にも伝わるように書いてよ
719デフォルトの名無しさん:2011/05/04(水) 15:30:28.54
>>718
そう。まさにそれ。>選択した列の1〜12行目
717の3行目から読んでもらえたら分かりやすいかも
しれない。
あと攻撃的な文章やめて。傷つくから。
720デフォルトの名無しさん:2011/05/04(水) 16:18:53.31
>>719
できるよ
721デフォルトの名無しさん:2011/05/04(水) 16:41:57.73
>>719
Dim c as String
c = Split(Activecell.Address,"$")(1)
Msgbox c & "1:" & c & ":12"
722デフォルトの名無しさん:2011/05/04(水) 17:48:18.56
このような理由から、 C#では クラス内部から見るとメソッドのように振る舞い、
クラス利用側から見るとメンバー変数のように振舞う プロパティという機能を
ご用意しました。
723デフォルトの名無しさん:2011/05/04(水) 17:57:11.19
うっひょー
OFFICE2010買ってきたー!!

>>719
取り敢えず複数行、列が全選択されたもので無くても対応したやつ。
複数シートや複数ブックに対応した奴は自分で考えてね。
Option Explicit

Sub SelectRngConv()
Dim oRng As Range '変換した範囲を設定するRangeオブジェクト
Dim sFromRangeAdd() As String '範囲を格納する配列変数
Dim sToRangeAdd As String '変換後範囲アドレスを格納する変数
Dim I As Long 'ループ用
Dim lRTop As Long '指定する行位置(上)
Dim lRBtm As Long '指定する行位置(下)
lRTop = 1
lRBtm = 12

'範囲毎にアドレスを配列に格納する。
sFromRangeAdd = Split(ActiveWindow.RangeSelection.Address, ",")
724デフォルトの名無しさん:2011/05/04(水) 17:58:15.26
>>273の続き

'範囲毎にアドレスを変換し、結合してsToRangeAddに設定。
For I = 0 To UBound(sFromRangeAdd)
With Range(sFromRangeAdd(I))
Set oRng = Range(Cells(lRTop, .Column), Cells(lRBtm, .Column + .Columns.Count - 1))
sToRangeAdd = sToRangeAdd & """" & oRng.Address & """" & ","
End With
Next

'最後のカンマを削除する。
sToRangeAdd = Left(sToRangeAdd, Len(sToRangeAdd) - 1)

'相対参照にしたいならこのコメントを戻してね
'sToRangeAdd = Replace(sToRangeAdd, "$", "")

'アドレスをメッセージボックスで出力。
Call MsgBox(sToRangeAdd)

End Sub
725デフォルトの名無しさん:2011/05/04(水) 18:00:12.66
複数行に対応したって書いちゃったけど、複数列の間違いだわさ。
ごめんね。
726デフォルトの名無しさん:2011/05/04(水) 18:00:56.23
>>719
こういうやりかたも
MsgBox Intersect(Selection.EntireColumn, Range("1:12")).Address
727デフォルトの名無しさん:2011/05/04(水) 18:05:28.70
>>719
1行限定
MsgBox Selection.Cells(1).Resize(12).Address(0, 0)

複数行対応
MsgBox Application.Intersect(Selection, Range("1:12")).Address(0, 0)

あと、傷つきたくなかったら、ちゃんとやりたいことを説明できるようになろうな。
「選択した列の1〜12行目」と書いてくれれば解るが、>>717では
「選択した列の1行目〜値が入ってる一番下のセルまで」という希望である可能性も捨てきれない曖昧な説明だ。
(つまり、12というのが固定なのか可変なのかが、>>717の段階では確定していない)
728デフォルトの名無しさん:2011/05/04(水) 18:11:30.55
>>726
こんな命令あったのか。知らんかったorz
729デフォルトの名無しさん:2011/05/04(水) 18:17:24.09
>>722
どこの誤爆かはしらんけど、VBAでもゲッタ、セッタは使えるぞ。
730デフォルトの名無しさん:2011/05/04(水) 19:28:39.90
>>721
カス
>>723
>>724
マヌケ
>>727
クズ
731デフォルトの名無しさん:2011/05/04(水) 19:40:01.12
うむ、確かにちょっと間抜けだったと自分でも思うが面と向かって言われるとちょっとキツイな。
まだまだ精進が足りないな。
732デフォルトの名無しさん:2011/05/04(水) 23:06:45.62
EXCEL2003 のユーザーフォームで
特定の文字が?になってしまいます。

DBへ保存したいので、?になってしまって困っています。
うまく出力できる方法はありますでしょうか?

<?になる文字.>
小? -> 小?
本? -> 本?

Private Sub TextBox1_Change()
Dim mytxt As String
TextBox1.Value = TextBox1.Value ’ここでは変化ない
mytxt = TextBox1.Value
TextBox1.Value = mytxt ’これも変化ない
TextBox1 = StrConv(TextBox1, vbWide) '?になってしまう
Exit Sub
733732:2011/05/04(水) 23:09:28.48
記入した文字も?になってしまっている。。。
聞きようがないな。。
734デフォルトの名無しさん:2011/05/04(水) 23:10:11.72
使っているフォントを変えろ
735デフォルトの名無しさん:2011/05/04(水) 23:13:45.54
>>734
本当か?
736732:2011/05/04(水) 23:27:09.62
>734
フォントはMSゴシックでした。


<追加で調査>

人名で文字は、小松なんだけど、松が違ってる。
木 へんに 八 と 口 が縦に並んでる文字

IME再変換したら、 しょう と読めるらしい。
んで、UNICODEと書いてありました。。。

737デフォルトの名無しさん:2011/05/04(水) 23:53:55.98
>>736
unicodeだとエラーが出るなら
unicodeからシステム既定のコードに変えてから実行
738デフォルトの名無しさん:2011/05/05(木) 00:14:19.30
>>736
ひょっとして環境依存文字とか言うオチだったりして
739デフォルトの名無しさん:2011/05/05(木) 00:26:07.76
>>736
調べてみたら同じようなことで悩んでた人がいるみたいだった。
http://www.accessclub.jp/bbs2/0069/beginter22056.html
740デフォルトの名無しさん:2011/05/05(木) 01:02:09.78
>>736
俺の環境だと何の問題もない
741デフォルトの名無しさん:2011/05/05(木) 09:45:53.39
> 737
> 738
> 739
> 740

とりあえず、> 739 さんの教えてくれたサイトの
ユーザ関数入れたら表示されました。

ありがとうございました。
742sage:2011/05/05(木) 12:16:37.83

http://jizen.kuronekoyamato.co.jp/jizen/servlet/crjz.b.NQ0010?id=000000000000

Webクエリで上記URLの「05/05」と「投函完了」という文字列を
引用しようとしたら、
引用できず、

--------------------------------------------------
お問い合わせ伝票番号
※半角数字でご入力下さい。 日付 配達状況
 1件目



 2件目




 3件目

--------------------------------------------------
という文字列のみ 引用できました。
Webクエリをマクロに組み込んで上記の文字列を取り出すマクロを
作成しようと思ったのですが、うまく上記の文字列を取得する
良い方法は無いでしょうか?
743デフォルトの名無しさん:2011/05/06(金) 11:23:13.98
そんな機能があったことすら知らんかった

おしえたがりのみなさん、よろしくね!
744デフォルトの名無しさん:2011/05/06(金) 11:53:21.29
cgiで書いてるのって、Webクエリだと取れないの多くね?
俺はどうせVBA使うなら、MSXML2.XMLHTTPとかで処理しちゃうけど
その話はExcelの話ではなくHTTPの話で、スレ違いになっちゃうんだよな>>3★3,4
745デフォルトの名無しさん:2011/05/06(金) 15:17:48.16
VBAの文字列って、文字のまま大小比較するとUNICODEベースで比較されちゃうんだよな
Ascで文字コードを取得するとShift-JISになのに
だから

If "亜" < "上" Then
If Asc("亜") < Asc("上") Then

の結果が正反対になる
746デフォルトの名無しさん:2011/05/06(金) 18:18:43.53
この状況で、VBAプログラマーへの転職成功の見込みなど、自由な意見を聞きたい。
手厳しい意見は、もちろんもけっこう。
747デフォルトの名無しさん:2011/05/06(金) 18:28:31.72
誰か以下について意見願う!

自分は、転職希望者である。
そこでだ!もし、VBAプログラマーの求人があったら応募したいと思う。もっとも、VBAプログラマーの求人自体はかなり少ないが。

とりあえず、自分のスペックはこんな感じだ。
31歳四大卒で、VBAプログラミングで高度な販売管理アプリケーションなどが作れる。
しかし、これまでプログラミングの仕事をしたことはなく、もちろんIT企業経験もない。
いわゆる実務経験なしだ。

この状況で、VBAプログラマーへの転職成功の見込みなど、自由な意見を聞きたい。
手厳しい意見は、もちろんけっこう。
よろしくお願い致す!
748デフォルトの名無しさん:2011/05/06(金) 18:37:29.29
俺の環境だと頭のイカレた福島○穂が職場にしつこくイタ電してくるので何の問題もない
749デフォルトの名無しさん:2011/05/06(金) 18:49:49.02
そもそもVBAプログラマって専門で求人があるの?
独立ならまあわからんでもない

いろいろ書いたが整理めんどいんで他の人にきいてくれ
750デフォルトの名無しさん:2011/05/06(金) 18:53:18.40
>>749
ある
751デフォルトの名無しさん:2011/05/06(金) 19:32:47.53
>>747
IT業界の経験がないのに高度な販売管理アプリケーションが作れるのか。
そもそも、何をもってして高度と言っているのかが分からない。仕様書とか自分で作れるの?
今からIT業界でやりたいならオブジェクト指向型言語や関数型言語の方が先々困らなくて
済むと思うけど、まず何でVBAを選択しようと思ったのか聞きたい。
752デフォルトの名無しさん:2011/05/06(金) 19:45:31.70
>>747
ちなみに俺は同様にIT関連の業務の経験無しで27歳からソフト開発の職についたよ。

それまでの経験は、独学でのWebアプリとしてのPerlのみ。
自作掲示板から始まってテキスト型データベース、HTTPやSMTPもPerlから叩けて、
JavaScriptを介した自動処理やら、Perlに関してはかなり使いこなせてたと思う。

で、入った先で最初にやったのがPHPでの開発。Perlを充分に使いこなせていたからか、PHPはすんなりと利用できた。
FileLockやwebアプリに有りがちな処理ロックの知識も充分だったし。
そしてPostgreSQLを利用してのデータベースを構築した。もちろんSQLは初めて使用したが。

それで覚えがいいということで、VBは未経験だったがVB開発の応援メンバーとして配置され、
ここでも即VBを使いこなせるようになってそのまましばらくはVBでの開発をしていた。

でもWindowsアプリを造るにつれ、VBを覚えるとかCを覚えるとかというのは日本語を読み書きできる、程度の基本事項であり、
特にデータベース系はwinアプリとしてはシステムに深く係らないので誰でもできる簡単なコードなのだと思ったよ。

その後VCでDirectXを扱うジョブに入ったらいきなりわけわかんなくなったw
753デフォルトの名無しさん:2011/05/06(金) 19:49:56.33
夢を壊して悪いけど
754デフォルトの名無しさん:2011/05/06(金) 21:22:42.23
GUI 恐るべし >>752
755デフォルトの名無しさん:2011/05/06(金) 22:27:26.60
>>747
IT産業以外のところで便利屋さんになった方が幸せな気がする

あるいは自分で会社作って、頑張るという手もある

需要は確かにあるけど、むしろ必要なのは営業力かもね
756デフォルトの名無しさん:2011/05/06(金) 22:42:45.82
折角現実逃避してんのに蒸し返すなバカ
757デフォルトの名無しさん:2011/05/07(土) 12:13:57.32
今日もテレビ番組にいろいろ書いたが
758デフォルトの名無しさん:2011/05/07(土) 15:26:59.18
自作のユーザーフォームに入力、実行、閉じる。という操作をしていますが、ユーザーフォームを閉じても変数に値を保持し続けさせるということは可能でしょうか?
よろしくお願いします。
759デフォルトの名無しさん:2011/05/07(土) 15:28:04.32
可能
760デフォルトの名無しさん:2011/05/07(土) 15:43:24.48
閉じずに隠せばいいんじゃね?
761デフォルトの名無しさん:2011/05/07(土) 17:02:35.28
俺の環境だと子供がいない
762758:2011/05/07(土) 17:10:52.62
答えていただきありがとうございます。隠すのは考えたのですが、ここの方ならもっとスタイリッシュな方法があるかと思いまして。何かヒントあれば教えてください。
763デフォルトの名無しさん:2011/05/07(土) 17:52:51.85
>>762
標準モジュールの変数に保持しておく方法と、
変数保持用のクラスを作ってそっちに保持しておく方法の2つを
いまパッと思いついたけど、どっちも似たようなもんだべさ。
どっちでもゲッタとセッタ作っとくと綺麗に見えるべさ。
764デフォルトの名無しさん:2011/05/07(土) 18:39:39.63
標準モジュールを使う方法だと、たとえばUserForm1とUserForm2と言う二つのフォームを作ったとして、
UserForm1にはCommandButton1と言うボタン、UserForm2にはTextBox1と言うテキストボックスと、
CommandButton1と言うボタンを設置しましたと。ついでにModule1という標準モジュールを作っておいて
ここで、UserForm1には

Option Explicit
Private Sub CommandButton1_Click()
Call UserForm2.Show
End Sub

UserForm2には

Option Explicit
Private Sub UserForm_Initialize()
Me.TextBox1 = Module1.GetTextVal
End Sub

Private Sub CommandButton1_Click()
Call Module1.SetTextVal(Me.TextBox1)
Call Unload(Me)
End Sub

と記述してやると。

続く
765デフォルトの名無しさん:2011/05/07(土) 18:41:15.85
>>764の続き

Module1には

Option Explicit
Dim M_sTextVal As String

Public Function GetTextVal() As String
GetTextVal = M_sTextVal
End Function

Public Sub SetTextVal(IN_sTextVal)
M_sTextVal = IN_sTextVal
End Sub

と記述しといてUserForm1から実行してCommandButton1を押下してUserForm2に遷移したあと、
TextBox1になんか書いて、UserForm2のCommandButton1を押下して閉じても、
UserForm1のCommandButton1を押下して再度開くと、UserForm2のTextBox1に
閉じる前の内容が設定されているでしょ?これが標準モジュールを使ったやり方ね。
766デフォルトの名無しさん:2011/05/07(土) 18:49:46.46
おっと、Public Sub SetTextVal(IN_sTextVal)の所は引数がString型と言う事を
明示的に書いといた方がいいね。
Public Sub SetTextVal(IN_sTextVal As String)ね
767デフォルトの名無しさん:2011/05/07(土) 18:50:49.83
質問させてください。
Set で変数にブックを指定したいのですが、エラーが出ます。
1つは
Dim 転記元 As Workbook, 転記先 As Workbook

OpenFileName = Application.GetOpenFilename("Microsoft Excelブック,*.SLK")
If OpenFileName <> "False" Then
Set 転記先 = Workbooks.Open(OpenFileName)
Else
MsgBox "キャンセルされました", 16
Exit Sub
End If
として転記元に指定し、

2つ目は
If Dir("C:\Documents and Settings\EW45449\デスクトップ\SGC 進捗\メッキSGCリスト" & Format(Date, "yymmdd") & ".xls ") = "" Then
MsgBox "本日のメッキSGCリストがありません" & vbCrLf & "SGCリストの作成を実行してください", 68, "エラー"
  Exit Sub
Else
Workbooks.Open Filename:="C:\Documents and Settings\EW45449\デスクトップ\SGC 進捗\メッキSGCリスト" & Format(Date, "yymmdd") & ".xls "
  Set 転記元 = ActiveWorkbook 
 End If

としたのですが、

転記先.Worksheets("テスト").Active

転記元.worlsheets("リスト").Active
実行時エラー’438’: となります、どのように修正したらよろしいでしょうか?
768デフォルトの名無しさん:2011/05/07(土) 19:17:24.85
>>767
先と元のブックごっちゃになってね?
どっちかのブックに「テスト」「リスト」の名前があるシートが無いんでしょ
769デフォルトの名無しさん:2011/05/07(土) 19:25:33.14
>>767
まず、転記元.worlsheetsじゃでないべさ。

転記先.Worksheets("テスト").Activate
転記元.Worksheets("リスト").Activate

でやってみ。

それとActivateは何かしたら切り替わるから
あまり使わない方がいいと思うよ。
770デフォルトの名無しさん:2011/05/07(土) 19:41:31.12
>>768さん
シート名は確認しました。

>>769さん
やってみましたが、
転記先.Worksheets("テスト").Active
でエラーとなります。
転記元を指定するいい方法はありますか??
771デフォルトの名無しさん:2011/05/07(土) 19:44:53.95
>>770
おっちょこちょいさん。

「転記先.Worksheets("テスト").Active」じゃなくて
「転記先.Worksheets("テスト").Activate」だわさ。

Activeの部分をもう一度Activateに変えてやってみ?

それでダメならまた考えるわさ。
772デフォルトの名無しさん:2011/05/07(土) 19:56:12.09
>>771
失礼しました!
ご指摘の通りActivateにしたら上手く動きました。
ありがとうございました!
773772: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行ずつ挿入はできているのですが、オートフィルタの結果がコピーされません、
どこをどのように修正したらよろしいでしょうか?
774デフォルトの名無しさん:2011/05/07(土) 21:00:28.61
>>773
まだろくすっぽコード見たわけじゃないんだけど、
転記元.Worksheets("リスト").Range("W2:AD4").Copy Destination:=転記先.Worksheets("テスト").Cells(Rows.Count, d) の、
一番最後のCells(Rows.Count, d)の列に指定しているdってこのソースでは何を設定しているか
見えないんだけど、何を設定しているの?
775デフォルトの名無しさん:2011/05/07(土) 21:12:56.29
>>774
dはあらかじめInputboxで指定しています。
776デフォルトの名無しさん:2011/05/07(土) 22:41:24.55
>>776
色々ある。正直いって何がやりたいのかが良く見えない。
まず、myvalueはどこで設定しているのかな?いや、どこかで設定していたとして、
Cells(Rows.Count, 3).Value = myvalueを行った後に行挿入を行おうとすると、
最終行に書き込んだそのデータはどうするのと怒られる筈。
後、Selection.AutoFilter Field:=16, Criteria1:="=" & myvalueの
Selectionは何を選択しているのか。まずここで項目名を指しているセルの範囲を
設定しなくてはならないのでは?
それとループの中でまたオートフィルタの絞り込みを行っているけど、1回の絞り込みでいいのか、
再度絞り込みたいのか。再度絞り込みたいなら一度絞り込みを解除してから
行わないと怒られるんじゃない?
本来これらのエラーが出ると思うんだけど、実際に出てないとすればオートフィルタ―自体の
範囲がちゃんと設定されていない可能性もあるね。
取り敢えずその辺から見直して見るといいんじゃないかな?


777デフォルトの名無しさん:2011/05/07(土) 22:46:53.56
おおぅ、自分にレスしてどーする。
>>776>>775へのレスね。
ちょっと疲れたべさ。暫く自分の方のAndroidの勉強するわ。
778デフォルトの名無しさん:2011/05/07(土) 23:04:10.79
まぁ要するに良く見えない。
779デフォルトの名無しさん:2011/05/07(土) 23:39:09.19
>>776,778
転記元のデータをオートフィルターで抽出して、転記先に張り付けていきたいのです。

いろいろ修正して
For j = Cells(Rows.Count, myCol).End(xlUp).Row To 2 Step -1
myvalue = Cells(j, 3)
Rows(j).Resize(2).Insert
r = j - 1
転記元.Worksheets("リスト").Activate
ActiveSheet.Range("A1").Select
Selection.AutoFilter Field:=16, Criteria1:="=" & myvalue
転記元.Worksheets("リスト").Range("W2:AD4").Copy Destination:= 転記先.Worksheets("テスト").Cells(r, d) -@
転記先.Worksheets("テスト").Activate

Next
となり、あと少しで完成しそうなのですが、
ただ、@の部分で可視セルを選択しないといけないのですが、
可視セルのある指定範囲の選択(3列目から6列目等)は
どうすればできるのでしょうか??

分かりにくい文章、見にくいコードで申し訳ありません。
780デフォルトの名無しさん:2011/05/08(日) 00:02:10.73
本当に意地汚くて嫌いだ、自分。体も精神も恥ずかしい。
781デフォルトの名無しさん:2011/05/08(日) 00:28:12.81
>>779
よく分からないけど
転記元.Worksheets("リスト").Range("W2:AD4").Copy Destination:= 転記先.Worksheets("テスト").Cells(r, d)の、
Range("W2:AD4")の部分をどうやって動的にコードで表現しようかなって事いってるのかな?
そうだとしたら、たとえば3列目から6列目の選択範囲をコピーしたいなら、
Range(Cells(2, 3), Cells(Cells(Rows.Count, 6).End(xlUp).Row, X))
(※Xはオートフィルタ―で絞り込みの対象としてる列の横位置)
とかに変えてあげればいいんじゃないかな。
782デフォルトの名無しさん:2011/05/08(日) 00:32:09.70
おっと違うな。
Range(Cells(2, 3), Cells(Cells(Rows.Count, X).End(xlUp).Row, 6))
(※Xはオートフィルタ―で絞り込みの対象としてる列の横位置)か。
なんか疲れてるみたいだわ。
783779:2011/05/08(日) 01:01:11.56
>>782
ありがとうございます。
なんとかなりそうです。
助かりました!
784デフォルトの名無しさん:2011/05/08(日) 01:33:53.25
>>783
お役に立ててなによりだけど
もし自分の勉強の為じゃなくて仕事として作ってるなら、
転記先のシートに行を挿入する必要は本当にあるのか、
変数dはループの中で特にいじってないから貼られる先は常にいっしょじゃないのか、
なによりシートをアクティブにしてセル操作を行っているだけで、
どのブックのどのシートのどのセルを操作すると言う書き方をしてないから
操作的に非常に不安定じゃないかとか
まぁ色々あるからその辺を良く考えて作り直した方がいいと思う。
どうせ長いコードじゃないし。
785デフォルトの名無しさん:2011/05/08(日) 01:55:02.53
>>784
仕事で使用するために試行錯誤しながら作っています。
変数dと行の挿入はこの前にデータの整理や不要行・列の削除を
行っているため必要となっています。

ご指摘のようにシートやセルの操作は改善の余地が大ありと
思っています。

また分からないことがあれば質問させていただくので
機会があればご教示の程よろしくお願いします。
786デフォルトの名無しさん:2011/05/08(日) 16:12:04.37
>>773
あまり読んでないけど、
オートフィルタの結果のコピーは、
範囲.SpecialCells(xlCellTypeVisible).Copy
かな

でもVBAでオートフィルタ使うのは良くないと思う。
だから質問自体がナンセンス。

私なら転記元のデータを走査してヒットしたら、ひとつずつ転記先にコピー
していくか、collectionか何かに溜めてからまとめてコピーするかだな。
念のため、コピーと言ってもCopyメソッドを使うわけではないよ。
if ヒットしたら then
転記先.Cells(ヒットした分).Value=転記元.Cells(走査した分).Value
end if
787758:2011/05/08(日) 17:06:37.90

何度もすみません。
フォームを閉じた後も変数を保持しておく方法がまだ解決していません。
webをいろいろ見てみたのですが宣言セクションで宣言した変数はブックを閉じるまで値を保持し続ける
と書いてありやってみましたが上手くいきません。
763さんが言っている「標準モジュールの変数に保持しておく方法」
というのも調べてみましたがよくわかりませんでした。
本当に申し訳ありませんが、このようなやり方が記載されているweb
もしくは、コードを教えて頂けると助かります。
馬鹿な質問で申し訳ありません
788デフォルトの名無しさん:2011/05/08(日) 17:25:14.24
>>787
一番簡単なのはワークシートのセルに保存しておくかな

標準モジュールの宣言セクションでPublic で宣言した変数を
フォームで使うようにしたらどうなの
789デフォルトの名無しさん:2011/05/08(日) 17:33:07.26
790デフォルトの名無しさん:2011/05/08(日) 17:40:20.88
>>787
要するに変数のスコープという基本的な知識が抜けているんだよ
他にもプログラミングの基本的な知識が抜けすぎ

このまま先へ進めても分からないことだらけになってしまう
VBAでプログラミングの勉強をするのは困難すぎる
素直にCやJavaなどメジャーな言語の入門書を読めば必ず書いてある
791デフォルトの名無しさん:2011/05/08(日) 17:45:52.34
どうでもいいけどVBAの良著って悉く絶版だよね
VBAに限った話じゃないかも知れないけど
792デフォルトの名無しさん:2011/05/08(日) 17:54:57.33
>>790
そう思ってクラスモジュールを作ってやる方法を書かなかったんだけどなぁ。
プライベートとグローバルの宣言の違いさえ理解しててくれてればなぁ。
793デフォルトの名無しさん:2011/05/08(日) 18:00:15.50
クラスとかまじわかんね。


前に進められたVBのエラーコーディングはとても参考になった。
794デフォルトの名無しさん:2011/05/08(日) 18:13:33.03
C#のクラスは大体分かるが、VBAのはよく分からない不思議
MSも早く.NETに移行すればいいのに
795デフォルトの名無しさん:2011/05/08(日) 18:36:05.82
EXCELのVBAやVB6.0は構造化言語とオブジェクト指向型言語の狭間にいる言語だから仕方ないと言えば仕方ない。

オブジェクト指向型言語から入った人から見れば、このスレで書いてるコードとか見た時、
あー、破綻してるなコレと思う事が多々あるだろうし、
低級言語から入った人とかが見れば、
ぐはぁ、メモリが、処理コストがぁ〜と思う事も多いと思う。
でもま、時代の流れから見てもオブジェクト指向を取り入れて損はないと思うべさ。
796デフォルトの名無しさん:2011/05/08(日) 20:13:20.88
とにかく>>787の人にはまだちょっと
どんなクラスを作って、どこでインスタンスを生成して
どんな使い方をするのかを考えて組むのは>>970の人が言ってる通り多分まだ無理。
一度>>764-765に書いてある様に実際に打ち込んで走らせて流れを追ってほしいな。
それでも理解できなければカプセル化の概念が崩れるけど>>788の人が言ってるみたいに、
標準モジュールにPublicで宣言した変数に保持するのが手っ取り早いかな。
797デフォルトの名無しさん:2011/05/08(日) 20:26:45.17
質問させて下さい
for文中で、変数をnとしてセルを操作しています。
その変数を用いてあるセルに関数を入力して、その関数中の指定したいセルをnを用いて変化させたいのでうまくできません。

うまく伝えられないので、現状としてやりたいことは、
あるセル(ここではA1)に数字を入れて、その数だけfor文を繰り返させています。
A1セルに10と仮に入れて、その隣Bセルに、for文を用いて、Eセルを参照するVLOOKUP関数をA1に入れた数字の行数分繰り返させたいのです。
理想としては
for n =1 to n
Range("B"&n)="=VLOOKUP("E"&n,sheet2!A1:B100,2,FALSE)"
(参照先のsheet2などは特に問題ありません)
next
のようにして、nが増えるにつれてVLOOKUPの部分を書き込んでいって欲しいのですが、直してもうまくいきません。(当然上記じゃ動かない)
参照HPなどで結構ですので、よろしければ教えて下さい。
798デフォルトの名無しさん:2011/05/08(日) 21:02:42.47
>>797

はい

n = Cells(1, 1)
For n = 1 To n
Cells(n, 2).Formula = "=VLOOKUP(E" & n & ",sheet2!A1:B100,2,FALSE)"
Next
799758:2011/05/08(日) 21:10:27.32
皆さん親切に教えていただきありがとうございます。とりあえず788さんの方法でできました。764さん折角書いていただいたのに見逃してごめんなさい。これを見て勉強させていただきます。
800デフォルトの名無しさん:2011/05/08(日) 21:30:29.26
Webクエリの機能で、VBAによって指定したURL(ワークシート上のセルから取得)を開くことは出来ませんか?
たとえばA1に"http:yahoo.co.jp"と書いてあって、VBAでそのページを開く方法です。
Excel2003です、よろしくお願いします。
801デフォルトの名無しさん:2011/05/08(日) 21:42:17.79
>>800
わざわざVBA使わんでも、ハイパーリンクじゃ駄目なの?
802デフォルトの名無しさん:2011/05/08(日) 21:52:04.38
>>801
目的からして処理が速くないと意味無いのでハイパーリンクじゃ駄目です
803デフォルトの名無しさん:2011/05/08(日) 21:53:26.35
>>802
開くってブラウザでか?
804デフォルトの名無しさん:2011/05/08(日) 21:54:43.51
>>803
Webクエリなのでブラウザは関係ないと思いますが
805デフォルトの名無しさん:2011/05/08(日) 21:55:56.30
ワークシートに展開する
テキストに流し込んでHTML作成
フォームのに描画する
webbrowserコントロールでブラウザ作る

梳きなのどうぞ
806デフォルトの名無しさん:2011/05/08(日) 22:01:03.81
>>799
なんか突貫工事っぽいけど、とりあえずは完成したのかな。
完成する前にとやかく言うのもアレだと思って言わなかったんだけど、
>>786の人の意見はごもっともだからね。初期の設計そのものに問題があるよ。
例えば私だったら後々抽出条件が複雑になる様な改修が入る事を想定して、
転記元のシートにSQL投げてRecordsetに値を取得して、それを転記先のシートに
展開する様な方法を視野に入れたと思う。
まぁ、実際そのツールの事を知ってる訳じゃないから何とも言えないけどね。
頑張ってね。
807デフォルトの名無しさん:2011/05/08(日) 22:16:21.38
>>804
マクロ記録でwebクエリ挿入したのを見るといいよ
808797:2011/05/08(日) 22:26:51.53
>>798
できました!
ありがとうございます。とても助かりました。
809デフォルトの名無しさん:2011/05/08(日) 22:52:47.00
>>800
こんなんでどう?適当だけど。

Option Explicit
Sub ChangeWebQueryRefer()
With ActiveSheet.QueryTables(1)
.Connection = "URL;" & Cells(1, 1)
.Refresh
End With
End Sub
810デフォルトの名無しさん:2011/05/08(日) 23:01:41.16
ああごめん、>>809は既になんかWebクエリが設定されていた後でA1に変更したい
URLを設定した場合ね。
811デフォルトの名無しさん:2011/05/08(日) 23:19:23.35
>>809
ありがとうございます,できました。
812797:2011/05/08(日) 23:21:47.69
たびたびごめんなさい・・・
>>798
で、関数中のEを変数nにしたがって移動させるにはどうしたらいいのでしょうか?
n=3のとき関数中のEをGにしたいのですができますでしょうか?
よろしくお願いします。
813デフォルトの名無しさん:2011/05/08(日) 23:28:24.23
>>812
よくわからんがifで条件分岐させるのじゃダメなの?
814デフォルトの名無しさん:2011/05/08(日) 23:38:17.20
>>812
はい

n = Cells(1, 1)
For o = 1 To n
p = "E"
If o = 3 Then
p = "G"
End If
Cells(o, 2).Formula = "=VLOOKUP(" & p & o & ",sheet2!A1:B100,2,FALSE)"
Next
815デフォルトの名無しさん:2011/05/08(日) 23:39:49.79
>>812
E列のアドレスから n-2 ぶんだけ下にOffsetしろ

ttp://msdn.microsoft.com/ja-jp/library/microsoft.office.interop.excel.range.offset(v=office.11).aspx
816797:2011/05/08(日) 23:40:54.19
>>814
ありがとうございます。しかし私の書き方が悪かったようで、nがいかなる数字の場合でもそれを加えた数だけ列を移動させたいのですが無理でしょうか?
817デフォルトの名無しさん:2011/05/08(日) 23:42:38.17
なんで1が先にWakeUpすんだ・・・
放物線の話しじゃないの。
818797:2011/05/08(日) 23:50:48.36
>>815
OFFSETでできました!
ありがとうございました。
819デフォルトの名無しさん:2011/05/09(月) 00:06:30.53
>>816
はい

n = Cells(1, 1)
For o = 1 To n
p = Cells(1, o).Address
p = Replace(Left(p, InStrRev(p, "$") - 1), "$", vbNullString)
Cells(o, 2).Formula = "=VLOOKUP(" & p & o & ",sheet2!A1:B100,2,FALSE)"
Next
820デフォルトの名無しさん:2011/05/09(月) 00:08:04.09
>>818
なんだ、もう片付いちゃってたのね。
821デフォルトの名無しさん:2011/05/09(月) 04:55:51.31
RO浄水器をつければいいだけやろ
822デフォルトの名無しさん:2011/05/09(月) 15:02:27.04
テキストボックスが60個あって
入力する度に文字をチェックするプロシージャを作ってるんですけど、

PrivateSub TextBox1_Change
(略
PrivateSub TextBox2_Change
(略



と60個も並べたくなく、
一発で済む方法ないですか?
823デフォルトの名無しさん:2011/05/09(月) 16:34:09.59
TextBox(0)
コントロール配列ってVBAじゃ使えなかったっけ?
824デフォルトの名無しさん:2011/05/09(月) 16:37:06.78
VBAでコントロール配列は使えない

.Textプロパティに代入とかならControlsでも出来るけど
イベント取りたいとなるとコレクションとクラス使った疑似コントロール配列だな
825デフォルトの名無しさん:2011/05/09(月) 20:57:43.19
>>822
この手の質問定期的にきてうざいな

クラスモジュールを使えばできるから
自分で調べてみろ
826822:2011/05/09(月) 21:57:30.59
>>823-825
サンクス、「擬似コントロール配列」で検索してみたら出てきた。

ホントはChangeじゃなくAfterUpdateだからそんなに難しくなさそう。
頑張ってみるよ!
827デフォルトの名無しさん:2011/05/09(月) 22:08:54.50
朝鮮人に関わると こうなる見本w
828デフォルトの名無しさん:2011/05/10(火) 13:58:47.10
失礼します。vista/2007(2003互換mode)
ボタンコントロールクリック、以下の処理内で実行時エラー32809が発生します。
Dim data As Dai
Dim sheet As ISheetFormat
While Removal.HasNext
Set data = Removal.NextDai
If data.IsP Then
Set sheet = Sheet2 ☆
ElseIf data.IsBunri Then
Set sheet = Sheet11 ☆
Else
Set sheet = Sheet10 ☆
End If
sheet.SetValue data, dt
sheet.CopyBefore ActiveWorkbook.Sheets("Sheet1")
Wend
----------------------------------
以下の手順を踏むと実行時エラーが発生します。
@ブックを起動
Aなにもせずとりあえずブックを上書き保存→excel終了
Bブックを起動
C上の処理を実行
ちなみに@の後にCを行うと正常に動作します(ここ大事)。
また、一度エラーが発生すると上記処理内に限らず
☆マークのシートを参照しようとするとエラーが発生します。
☆マークのワークシートはそれぞれISheetFormatをimplementsしていますが、
一度エラーが発生するとimplementsしようがしまいがとにかく参照しようとすると32809…。
原因につながるヒントを頂けると助かります。
829デフォルトの名無しさん:2011/05/10(火) 14:03:17.25
シート全体をvalueに換えるうまい方法をおしえてくれ。

cells.copy
cells(1,1).pastespecial paste:=xlpastevalue 以外
830デフォルトの名無しさん:2011/05/10(火) 14:53:04.75
>>829
釣りだな。ほらよ。

Range(Cells(1,1),Cells(Rows.Count,Columns.Count)) = Range(Cells(1,1),Cells(Rows.Count,Columns.Count))
831デフォルトの名無しさん:2011/05/10(火) 15:01:57.89
間違えた。ケツに.Valueでもくっ付けとけ。
832デフォルトの名無しさん:2011/05/10(火) 15:25:50.92

> Range(Cells(1,1),Cells(Rows.Count,Columns.Count))
なんでわざわざこんな書き方してるの?釣り?
833デフォルトの名無しさん:2011/05/10(火) 16:01:43.67
お前ならどう書くっていいたいんだ?
834デフォルトの名無しさん:2011/05/10(火) 19:16:22.55
>>832は逃げたか。
釣り用のヘボいコードだと言う事までは分かったらしいが、
この程度のコードのどこがヘボいかまでは指摘できる脳みそを持ち合わせていなかったようだな。
835デフォルトの名無しさん:2011/05/10(火) 20:00:52.48
またアフォが暴れてるなw
Range(Cells(1,1),Cells(Rows.Count,Columns.Count))ってCellsと同じだわな
836デフォルトの名無しさん:2011/05/10(火) 21:44:45.24
質問です。
実は今マリオみたいなゲームを作ろうとしていますが、セルをドットの様に使って
横スクロールをした時、すぐに右端へたどり着いてしまいます。
擬似的に左右で永久にスクロール出来る様に見せかけたいのですが、どんな方法が有りますか?
又、その方法を使った時、最少のセルの横ピクセル数は何ピクセルくらいになりますか?
環境はWinXPのEXCEL2003です。
837デフォルトの名無しさん:2011/05/10(火) 21:49:42.97
>>836
セルを変化させる
838デフォルトの名無しさん:2011/05/10(火) 21:53:44.59
>>837
どの様にでしょうか
839デフォルトの名無しさん:2011/05/10(火) 21:59:49.19
>>836
右端に来たら下の方の行とか別のワークシートに移動させる
840デフォルトの名無しさん:2011/05/10(火) 22:15:16.95
>>839
なるほど、そうすると最低のセル横幅は256セルで2画面分になる様に設定すればいい訳ですね。
何となく目処が立ちました。ありがとうございます。
841デフォルトの名無しさん:2011/05/11(水) 00:09:22.41
>>830=>>833=>>834は、マジで>>835に気付いてなかったようだなw
この程度終わる話に「指摘できる脳みそ」なんて発想は出てこないから
Cells以外の何かを発想してたんだろうね。恥ずかしすぎるw
842デフォルトの名無しさん:2011/05/11(水) 03:29:31.49
VBAゲーム博物館にエクセルマリオがあるぜ
843デフォルトの名無しさん:2011/05/11(水) 08:05:41.61
やはり>>829は釣りだったな。
そして>>829,>>832,>>835,>>841は全て同一人物。
>>829で質問を投げといて、しょぼい答えが返って来るのを待って、返って来たらぶっ叩く。
それを楽しみにこのスレに来ている訳だ。
今回は煽りをくれてやって初めて反応したが、
やっぱりこいつがいつもスレが荒れる原因を作ってる奴だったんだな。
844デフォルトの名無しさん:2011/05/11(水) 08:42:56.73
どうでもいい荒らすな
845デフォルトの名無しさん:2011/05/11(水) 08:47:06.69
>>836
マシンスペックによって動作速度が違うゲームが出来上がりそうだなw
846デフォルトの名無しさん:2011/05/11(水) 09:05:15.88
>>843
相当悔しかったようだねw
847デフォルトの名無しさん:2011/05/11(水) 09:58:31.83
>>845
その辺はAPIを使ってwaitかけて統一するつもり。
余りにマシンスペックが低いのは見捨てる方向で。
848デフォルトの名無しさん:2011/05/11(水) 11:12:24.40
>>843
残念、その中に俺が一つ入ってるので全て同一人物ってのはハズレ
他3つが同一人物でも、少なくとも2人だ
俺の予想では質問者は別で、残り2つが同一人物で、計3人だな
849デフォルトの名無しさん:2011/05/11(水) 12:01:31.70
>>1からここまで全て俺の自演なんだ
>>484は気付いてないかも知れないが、君は俺の自演から生まれた人格なんだよ
さあ俺の元へ還れ
850デフォルトの名無しさん:2011/05/11(水) 13:21:31.46
俺は一つ書いてるんだが、まったくつまらん
851デフォルトの名無しさん:2011/05/11(水) 14:27:29.93
計算や抽出検索、転記などの機能ごとにモジュール分割したいのですが
UserFormの
CommandButton1_Click()
のようなものはユーザーフォームに直接記述して、
実行するものをcallするといった感じでしょうか?

それともUserFormには一切記述しないのでしょうか?

いまいち質問が分かりにくいかもしれませんが、よろしくお願いします。
852デフォルトの名無しさん:2011/05/11(水) 14:48:04.50
>>851
好きにしろ
マクロの実行からも選べる
853デフォルトの名無しさん:2011/05/11(水) 15:09:21.13
イベントは標準モジュールには丸ごと移動することは出来ないのでCallすることになるけど
クラスモジュールにならイベントごと移動することも可能

どちらを使うかは852も言うとおり「好きにしろ」で
854デフォルトの名無しさん:2011/05/11(水) 22:49:20.82
changeイベントの中でイベントの起因に
なったセルが、
ペーストされたのか、手入力されたのか、
分かる方法ない?
855デフォルトの名無しさん:2011/05/11(水) 22:53:07.59
>854
Target の個数が複数だとペースト1択だけど、1個だと・・・どうでしょうねえ
856デフォルトの名無しさん:2011/05/11(水) 23:10:56.00
>>855
ありがとう。
解決の方向性は見えました。
857デフォルトの名無しさん:2011/05/12(木) 13:09:51.16
行を一個飛ばしで選択する方法を教えてください
1、3、5、7、9、
といった感じです
858デフォルトの名無しさん:2011/05/12(木) 14:28:48.31
CTRLを押しながら選択する
859デフォルトの名無しさん:2011/05/12(木) 15:43:55.99
まず素数判定プログラムを作ります
セルにセットします
素数を一つ飛ばしで一致させるプログラムを作ります
配列にランダムソートで格納します
APIから時刻を取得し、データが枝と一致したら、シートから正規表現で該当セルを抜き出します
抜き出したセル番地を配列にセットします
IDEをインポートして、自コードを行を一つ飛ばしで選択出来るよう書き換えます
保存せずに終了させます
860デフォルトの名無しさん:2011/05/12(木) 16:18:03.69
>>858
>>859
お前ら優しいな
861デフォルトの名無しさん:2011/05/13(金) 23:15:03.00
ワークシートに配置したシェープから親オブジェクト(ワークシートオブジェクト)を取得しているプログラムがあるのですが、
別のパソコンでデバッグした場合、「Shapes」が取得される場合があります。

同じプログラムソースコードから取得した型の結果が違うのですが、
原因が掴めないです。

Debug.Print Typename(ActiveSheet.Shapes(0).Parent)

当パソコン→Worksheetが返されます。(正常結果)
別パソコン→Shapesが返されます。(異常結果)

何が違うのか教えていただけませんか。すみません。
862861:2011/05/13(金) 23:16:31.18
すいません。
両端末とも、
OS: Windows XP
オフィス:Excel 2007
です。
863デフォルトの名無しさん:2011/05/13(金) 23:57:24.55
>>862
当ててあるサービスパックが違うんじゃないの?
864861:2011/05/14(土) 00:13:20.35
>>863
ありがとうございます。
なるほど。

元々、シートのシェープの親を取ってくる事になるので、
はじめから、ワークシートオブジェクトのみを取得してきたほうが安定しますね。
大変助かりました。
865デフォルトの名無しさん:2011/05/14(土) 01:26:51.28
Excel2003から2007に移行したのですが、
Auto_Openを動作させずにマクロを開きたい時に、Excel2007ではShiftキーを押したまま
Excelを起動した時でもAuto_Open処理が動いてしまいます。

また、マクロ設定を無効にしている場合はマクロの編集ボタンが無効になっており
プログラム編集ができません。
Auto_Openを動作させずにマクロを編集する方法をご教授願います。
866デフォルトの名無しさん:2011/05/14(土) 01:33:35.99
2007でも出来たと思うが
867デフォルトの名無しさん:2011/05/14(土) 02:21:46.89
Win XP + Office 2007で試してみた
たしかにShift押しながら起動でもAutoOpenは起動するね
回避方法は知らん
868デフォルトの名無しさん:2011/05/14(土) 02:29:29.19
>>865
直接フォルダからEXCELを開くんじゃ無くて、一度EXCELのアプリケーションを立ち上げてから
「ファイルタブ」の「開く」で開きたいブックを選択して、シフト押しながら「開く」ボタン押下で出来るわさ。多分。
869デフォルトの名無しさん:2011/05/14(土) 09:07:32.82
ついでに質問させて頂くわさ。

テーブルジャンプを行いたいです。

具体的には2つの動的な配列変数を用意して、一つの配列に処理順、もう一つの配列に
実行する関数のアドレスを設定して
その配列に設定された順序に関数を実行する処理を作りたいのです。

方法としては、スタックポインタが指しているアドレスの
関数戻りアドレス情報を次の呼び出し関数の呼び出しアドレス情報に書き換えてEnd Functionなり
End subなりを実行して行うか、または
なんらかしらのAPIでコールバックして行う方法を考えているんですけど、
取り敢えず配列に処理順序と関数の開始アドレスを設定する所までは上手くいったものの、
その後のいい方法がなかなか無いんです。

かといって適当に繰り返し処理や分岐でただの関数呼び出しを行ったんでは
処理コストが掛かり過ぎるのと、管理し辛いといった面から避けたい訳です。
特に今作っているのがゲームだから、処理コストは出来るだけ掛からない様にしたいのです。

何かいい方法はありませんか?
870デフォルトの名無しさん:2011/05/14(土) 09:19:24.42
>>869
スレ違い >>3★3,4
871デフォルトの名無しさん:2011/05/14(土) 09:27:50.00
>>870
別にAPIを使う方法じゃ無くても実現出来れば方法にこだわらないわさ。
何ですれ違いになるのかな?
872デフォルトの名無しさん:2011/05/14(土) 09:35:31.75
>>3の★3と★4読め
873デフォルトの名無しさん:2011/05/14(土) 09:41:37.13
>>872
まず★2を読んで欲しい。
それと、全体から見てVB6のUIでは遅すぎて考えた通りのゲームを作れ無いので、
EXCELのシートを使ってゲームを作成している。
その辺の処理速度を考慮しての話だからすれ違いでは無いよね。
874デフォルトの名無しさん:2011/05/14(土) 09:56:00.41
だから処理コスト、処理速度を考慮していくと、Excelは描写手段として使うだけで
その前の処理は全てExcel関係ない処理になるんだってば

それにVBAと比べれば、処理も描写もVB6の方が速いぞ
間違った方法取ってなければな
875デフォルトの名無しさん:2011/05/14(土) 10:03:13.88
まぁ余りダダを捏ねていてもスレが荒れそうなので引っ込むわさ。
でもいい方法が有ったら教えて欲しいなぁ。
876デフォルトの名無しさん:2011/05/14(土) 10:13:03.31
まあ、知ったか教えたがりは2chには多いから
スレ違いでも教えて貰える可能性は0ではないからな
877デフォルトの名無しさん:2011/05/14(土) 10:40:19.28
関数呼んだら、番号によってSelect-Caseした後、ジャンプすれば
ジャンプテーブルになるんじゃないかな。
878デフォルトの名無しさん:2011/05/14(土) 11:01:40.10
>>877
ありがとう。
その方法は一番最初に考えたんだけどやっぱり条件分岐なもんで
キャラクターの属性と動作ごとに処理分けを行うと相当数になるから
出来れば条件分岐ではなく、インデックスを与えてそれを実行する様な方法を取りたかったんですわ。
でも最悪、その方法を使う事にさせて頂きますわ。
本当にありがとうございます。

ただ、この話題はすれ違いらしいのでこの辺で。
879デフォルトの名無しさん:2011/05/14(土) 11:39:22.03
最悪の方法ならスレ違いじゃないなw
880865:2011/05/14(土) 12:14:03.44
>>866
>>867
>>868
回答ありがとうございます。
868さんの方法で試してみます。
881デフォルトの名無しさん:2011/05/14(土) 13:11:25.33
エクセルならシートに配列書き出してワークシートソートすれば早かろう
これならスレ違いにもならぬ
882デフォルトの名無しさん:2011/05/14(土) 13:33:22.78
えっ?
883デフォルトの名無しさん:2011/05/14(土) 13:47:20.50
ワークシートソートの方が速いって
余程ヘボいソートアルゴリズム使ってるんですねw
884デフォルトの名無しさん:2011/05/14(土) 15:07:03.41
>>883がワークシートのソートやクイックソートより超っ速いコードを公開してくれるそうなので楽しみに待ちましょう
885デフォルトの名無しさん:2011/05/14(土) 15:22:00.68
嫌味のつもりで言ってるのだろうけど、その辺に転がってる物を
「公開してくれるそうなので楽しみに待ちましょう」とか、バカっぽすぎて吹いた。
886デフォルトの名無しさん:2011/05/14(土) 15:31:45.02
>>885
自分が馬鹿なんだと気づいてね
887デフォルトの名無しさん:2011/05/14(土) 15:38:19.03
そのうち気付くだろう
その言葉は自分にこそ相応しかったと
888デフォルトの名無しさん:2011/05/14(土) 16:04:11.35
このスレで語尾に草生やす奴は総じて口だけのヘタレだよね
889デフォルトの名無しさん:2011/05/14(土) 16:21:48.50
草1つの場合はそうでもなかったな。
草複数生やす奴は総じて口だけのヘタレだったけど。
890デフォルトの名無しさん:2011/05/14(土) 16:23:03.39
単芝死ね
891デフォルトの名無しさん:2011/05/14(土) 16:34:18.94
悔しかったんだね
892デフォルトの名無しさん:2011/05/14(土) 16:39:24.58
悔しいです(`皿´)
893デフォルトの名無しさん:2011/05/14(土) 17:35:13.84
単芝が糞かどうかは>>883がコード晒せるかどうかにかかっているのか。
責任重大だな。
894デフォルトの名無しさん:2011/05/14(土) 17:51:56.85
>>893
ヒント:>>885
895デフォルトの名無しさん:2011/05/14(土) 18:08:06.89
>>894
なるほど、クイックソートより超っ速いのがその辺に転がっているとか言ってる時点で
察しろよ、言わせんな恥ずかしいって事か。やっぱり語尾に草生やす奴は総じて駄目か。
896デフォルトの名無しさん:2011/05/14(土) 18:08:30.38
関数を指定したセルに文字を設定しつつ、
着色もしたいのですが、下記のユーザ定義関数では
#VALUE!になってしまいます。

Public Function hoge()

ActiveCell.Interior.colorIndex = 3
hoge = "aaa"

End Function

どのようにすれば実現できますか?

Windows7、Excel2010です
897デフォルトの名無しさん:2011/05/14(土) 18:10:48.62
>>896
うーんそれ関数?
898デフォルトの名無しさん:2011/05/14(土) 18:25:13.42
>>896
ユーザー定義関数内で着色しようとしてるからじゃない?
条件付き書式で代用すれば?
899デフォルトの名無しさん:2011/05/14(土) 18:28:26.26
>>897
どういった意味でしょうか?

>>898
実際には複雑な条件チェックをして
その結果によって着色するかしないか
を決めたいので条件付き書式では難しいんです。
900デフォルトの名無しさん:2011/05/14(土) 18:35:25.45
>>895
なんか曲解してるな
言い負かされて悔しいからわざとねじ曲げて解釈して憎まれ口叩いてるのか?
901デフォルトの名無しさん:2011/05/14(土) 18:47:14.93
>>900
俺からして見ればコード挙げられずに顔真っ赤にして必死に書き込んでいる
お前の方がよっぽど悔しそうに見える訳だが。

Wikipediaのソートに関して
http://ja.wikipedia.org/wiki/%E3%82%BD%E3%83%BC%E3%83%88

どのソートが一般的に一番早いと言われているか
自分で確認してからコード晒してくれな。
902デフォルトの名無しさん:2011/05/14(土) 18:52:54.87
>>899
関数にしてどうしたいの?
903デフォルトの名無しさん:2011/05/14(土) 18:54:43.96
ワークシートソート(並べ替え機能)との比較が
いつのまにかクイックソートとの比較になってる

悔しさのあまり顔真っ赤にして必死になってると、
こうやって話が明後日の方向に飛んでいってしまうのかな?
904デフォルトの名無しさん:2011/05/14(土) 18:58:07.42
もうやめて!
あたしのためにこれ以上争わないで!
905デフォルトの名無しさん:2011/05/14(土) 19:02:45.04
>>903
プッ
今頃何言ってるのかな。逃げに入っちゃったかな?
>>884の発言の後で>>885でその辺に転がっているって言ってるよな。
ほら、その辺に転がっているならとっとと挙げてみれば?
人の言ってる事オウム返しにしか言えない奴にはちょっと厳しい?
906デフォルトの名無しさん:2011/05/14(土) 19:07:05.93
セルに自作関数を使って制御したいんだろうけど
907デフォルトの名無しさん:2011/05/14(土) 19:08:59.36
あらら、勘違いを突かれて壊れちゃった?

本当に逃げてるなら、逃げてると言われるのは痛いところだろうが
逃げに入ったとか、ちょっと厳しいとか言われたところで
根本を勘違いしてる奴の言葉じゃ滑稽なだけで煽りにもなってないもんな
908デフォルトの名無しさん:2011/05/14(土) 19:16:53.09
>>907
あーあ、完全に逃げたな。
結局根本とか何とかウダウダ言ってその辺に
転がっているって自分で言ってたコードも晒せないんだもんな。
やっぱり草生やす奴は総じて糞と言うことが確定したな。
909デフォルトの名無しさん:2011/05/14(土) 19:17:36.04
今どういう話なのか三行で
910デフォルトの名無しさん:2011/05/14(土) 19:19:14.58
ワークシートソート(並べ替え機能)より速いソートがあるとしか言ってないんだから
ワークシートソート(並べ替え機能)より速いソートを晒せば納得するのか?
911デフォルトの名無しさん:2011/05/14(土) 19:20:42.42
912デフォルトの名無しさん:2011/05/14(土) 19:23:40.28
>>896
ひょっとして文字を設定するという部分は
hoge = "aaa"
の部分?
913デフォルトの名無しさん:2011/05/14(土) 19:23:56.05
>>909
ワークシートソート(並べ替え機能)より速いソートがあると言ったら>>883
クイックソートより超っ速いコードを公開してくれる>>884
といきなり一言も出してないクイックソートにすげ替えたバカが粘着中
914デフォルトの名無しさん:2011/05/14(土) 19:26:25.56
>>910
ハァ?
それじゃ>>884に対する>>885の発言の解になってないだろ。
ちゃんと自分でクイックソートより速い奴がその辺に転がっているって
言ってるんだからそれを晒せばいいだけじゃないか。何か問題でもあるのか?
915デフォルトの名無しさん:2011/05/14(土) 19:27:15.72
君たち!頭悪そうだからやめておきなさい(^^;
916デフォルトの名無しさん:2011/05/14(土) 19:27:32.07
worksheet chengeを使ってターゲットを自動で変更すりゃいいかなと思ったけど
これうまくいかねえな
917896:2011/05/14(土) 19:29:19.59
>>912
そうです。

セルに =hoge() と入れたら、そのセルに"aaa"と設定した上で着色したいんです。
918デフォルトの名無しさん:2011/05/14(土) 19:30:11.40
速さが知りたいだけならこことか
http://www.asahi-net.or.jp/~ef2o-inue/vba_o/sub05_800.html
919デフォルトの名無しさん:2011/05/14(土) 19:34:01.38
>>917
Public Function hoge(str As String)

ActiveCell.Interior.colorIndex = 3
ActiveCell=str

End Function
920デフォルトの名無しさん:2011/05/14(土) 19:34:21.01
そもそもVBAエディタに書いたコードをワークシートから呼べるの?
921デフォルトの名無しさん:2011/05/14(土) 19:36:08.83
>>914
自分の発言には責任持つけど、バカの曲解にまでは責任持てませんぜ

俺が書いたのは
「ワークシートソート(並べ替え機能)より速いソートがある」
と、それに対して公開しろ的なレスがあったので
「(自分があると書いたワークシートソートより速いソートは)その辺に転がってる」
だけだ

「クイックソートより超っ速いコードがあると言ってるなんて曲解してるバカがいるが
それについてもその辺に転がってるぜ」
なんてことは書いた覚えは無い
922デフォルトの名無しさん:2011/05/14(土) 19:36:37.53
>>917
ワークシートにこれを書けば

Const ConstTargetStr = "=hoge()"

Private Sub Worksheet_Change(ByVal Target As Range)
'シート上のどっかが書き換わったらConstTargetStrを探し出す
'探し出したセルに"aaa"を代入して色を変更するプログラム
End Sub
923デフォルトの名無しさん:2011/05/14(土) 19:38:19.66
>>920
は?
924デフォルトの名無しさん:2011/05/14(土) 19:38:35.39
>>918
なんだ、僅差でクイックソートよりワークシートのソートメソッド使った方が速いのか。
これは>>921はどう言い訳するんだろうな。
じゃあ「ワークシートソート(並べ替え機能)より速いソートがある」のを晒してくれればいいや。
ちょっと楽しみ。
925デフォルトの名無しさん:2011/05/14(土) 19:41:42.44
俺から見ればどっちも
「ワークシートソートなんてクソ」
って言ってるように見えたが
926デフォルトの名無しさん:2011/05/14(土) 19:42:44.73
>>925
どのレスを見て?
927デフォルトの名無しさん:2011/05/14(土) 19:43:18.73
>>923
うわーこんな事できるの知らなかったわ><
928896:2011/05/14(土) 19:43:58.95
>>919
やってみましたが、#VALUE!になってしまいます。

>>920
呼べます。
それをユーザ定義関数と呼ぶらしいです。たぶん。

>>922
これでも要件を満たせますが、
実際にやりたい処理はもっと複雑なので、
シート上の変更のたびに呼び出されてしまうのは、
避けたいです。
929デフォルトの名無しさん:2011/05/14(土) 19:48:14.19
>>924
ほれ http://chaichan.web.infoseek.co.jp/vbtips/VBMemo2006081601.htm:0.737s
ワークシートソート:0.861s
930デフォルトの名無しさん:2011/05/14(土) 19:49:18.22
>>926
>>882以降全部

>>928
あはい
自作関数も呼び出しで言えばおんなじようなもんだけどご自由に
931デフォルトの名無しさん:2011/05/14(土) 19:56:28.46
>>928
こちらの Win2000, Excel2000 では
以下のコードでおkだった

Public Function hoge()
ActiveCell.Interior.ColorIndex = 7
hoge = "aaa"
End Function
932896:2011/05/14(土) 20:05:01.64
>>931
色も変わりました?
WinXP、Excel2003もあるので、それで試してみました。
#VALUE!にはならないですが、色がかわりませんでした。
933デフォルトの名無しさん:2011/05/14(土) 20:06:30.47
>>932
色も変わりますよ。
934デフォルトの名無しさん:2011/05/14(土) 20:06:52.89
そのhogeはちゃんと標準モジュールに書いてる?
935896:2011/05/14(土) 20:10:22.32
>>933
そうですか。
excel2003から仕様が変わったということですかね。

>>934
はい。書いています。
936デフォルトの名無しさん:2011/05/14(土) 20:11:21.43
XP,Excel2000だと色はかわらんな
937デフォルトの名無しさん:2011/05/14(土) 20:12:52.55
>>935
何回かやってたら色が変わらなくなった。
VBエディタの実行ボタンを押すと変わるんだけど・・・
938896:2011/05/14(土) 20:15:49.05
>>937
あ、そういうことですか。
VBAエディタから実行させるとExcel2003でも、2010でも正常に動きます。
ワークシートから=hoge()ではどのバージョンでもダメみたいですね。。。
939デフォルトの名無しさん:2011/05/14(土) 20:27:17.11
今北産業だが、なんかアフォがファビョってるなw
なんかソートでおかしな比較論を展開してるやつなんなの?
まず配列ありきなら配列をワークシートに書き出してソートするより、配列上でソートする方が速いわなぁ。
なぜなら配列のワークシートへの書き出しはコストがゼロじゃないからな。
940デフォルトの名無しさん:2011/05/14(土) 20:43:17.75
とにかくワークシートのソートとクイックソート云々を言いだしたやつはアフォということで
糸冬了
941デフォルトの名無しさん:2011/05/14(土) 20:46:10.74
そもそも配列のソートじゃなくて、
>>869に対するExcelを使用した方法の提示なんだけども
942デフォルトの名無しさん:2011/05/14(土) 22:07:24.26
>>938
関数は(あれば)引数を受け取って値を返すだけの機能
書式の変更等はできない仕様
Subのほうに書くしかない
943896:2011/05/14(土) 23:03:54.96
>>942
functionから書式変更するsubを別途呼んでもダメだったので、
そういう仕様なのかと疑っていましたが、やっぱり仕様だったんですね。


諦めてボタン等から起動して、チェックと書式変更する処理を流すようにでもしてみます。
レスくれた方々、ありがとうございました。
944デフォルトの名無しさん:2011/05/14(土) 23:44:07.49
>>943
もう見てないかな?
これはたしかユーザー定義型の制約で仕方ない事だったと思ったべさ。
>>922の人のが殆ど自分の考えと一緒だったけどちょっと違うのが、
変更された特定値をサーチするんじゃなくて、値の書き込み元の範囲を
最初に特定してしまって、その範囲外ならすぐに処理を抜けてしまえば
シート上の変更のたびに呼び出されても負担が少ないわさ。

たとえばシートのセル範囲にRng_TgtFromと言う名前を切って、これを
計算が反映される入力元の範囲とした場合、次の様にVBEのシートに書くべさ。
945デフォルトの名無しさん:2011/05/14(土) 23:46:29.37
>>944の続き

Private Sub Worksheet_Change(ByVal Target As Range)
Dim oRngTgtFrom As Range
Dim oRngTgtTo As Range
Dim oRngMono As Range

Set oRngTgtFrom = Range("Rng_TgtFrom")

If oRngTgtFrom.Row > Target.Row + Target.Rows.Count - 1 Or _
oRngTgtFrom.Row + oRngTgtFrom.Rows.Count - 1 < Target.Row Or _
oRngTgtFrom.Column > Target.Column + Target.Columns.Count - 1 Or _
oRngTgtFrom.Column + oRngTgtFrom.Columns.Count - 1 < Target.Column Then
Exit Sub
End If

Set oRngTgtTo = Range(Cells(Target.Row + Target.Rows.Count - 1, _
Target.Column + Target.Columns.Count - 1), _
Cells(oRngTgtFrom.Row, _
oRngTgtFrom.Column))
946デフォルトの名無しさん:2011/05/14(土) 23:47:57.42
>>945の続き

For Each oRngMono In oRngTgtTo
If oRngMono <> "" Then
oRngMono.Offset(0, 2).Value = "AAA"
oRngMono.Offset(0, 2).Interior.ColorIndex = 7
Else
oRngMono.Offset(0, 2).Value = ""
oRngMono.Offset(0, 2).Interior.ColorIndex = 0
End If
Next

End Sub
947デフォルトの名無しさん:2011/05/14(土) 23:59:48.52
>>945の続き

まず入力したセルが指定範囲内かチェックしてるわさ。

次に入力したセルが範囲内だった場合、指定範囲と入力された範囲の
被った部分を処理対象にするわさ。

で、処理対象範囲の中のセルを一個づつガラガラまわして値と色を設定してるわさ。

値の"AAA"と結果出力位置は適当に後で直して欲しいわさ。

インデントが取れたからかなり見辛くなったから
コピッてはっつけてインデント補正してから見てほしいわさ。
948デフォルトの名無しさん:2011/05/15(日) 00:24:17.64
ぐはぁ、>>944でユーザー定義型とか言っちゃってるよ。
ユーザー定義関数の間違いね。ユーザー定義型って言ったら構造体のことになっちゃうわさ。
949デフォルトの名無しさん:2011/05/15(日) 04:36:24.95
ユーザ定義関数の引数にRangeをとって、その関数を使うときに
色を変えるセルを引数に指定すれば良いんじゃねえかと思うんだが
950デフォルトの名無しさん:2011/05/15(日) 08:02:20.85
えっ?
951デフォルトの名無しさん:2011/05/15(日) 10:36:16.75
>>949
やってみてから言えば?
952896:2011/05/15(日) 11:54:30.92
>>947
改良案ありがとうございます。
たしかに範囲指定内でのみ処理が流れるようにすれば負荷を抑えられますね。

書いてもらったコードですが、名前付きセル内のセルの
値と書式を設定した場合は、設定時に再びworksheet_changeイベントが
発生しループするようだったので、私のほうでも方針は同じで、やり方を少し変えてみました。

Private Sub Worksheet_Change(ByVal Target As Range)

' "Rng_TgtFrom"セル内のみを処理対象とする
If Not Application.Intersect(Target, Range("Rng_TgtFrom")) Is Nothing Then

' "Rng_TgtFrom"セル内を書き換えたとき
' 再びWorksheet_Changeイベントが
' 発生しないようにイベント無効化
Application.EnableEvents = False

' 書式と値設定
Target.Interior.ColorIndex = 3
Target.Value = "aaa"

'イベント有効化
Application.EnableEvents = True

End If

End Sub

これなら私がやりたかったことにだいぶ近づきました。
ありがとうございます。
953デフォルトの名無しさん:2011/05/15(日) 12:08:15.55
>>952
ちょっと待って、
今更だけどもうちょい考える余地がある事に気付いたべさ。
954デフォルトの名無しさん:2011/05/15(日) 12:26:43.23
>>952
今更だけど条件付き書式を使ってやる方法も思いついたわさ。
複雑な条件で着色しなければいけないって話だったから、これもユーザー定義関数に
してしまって、出来るなら処理元を一緒にしてしまえば楽になるかな。こんな感じ。

Public Function hoge1(IN_str As String) As String
Dim bBool As Boolean
Call hoge3(IN_str, bBool)
hoge1 = IN_str
End Function

Public Function hoge2(IN_str As String) As Boolean
Dim bBool As Boolean
Call hoge3(IN_str, bBool)
hoge2 = bBool
End Function

Private Function hoge3(IN_str As String, IN_bool As Boolean)
IN_bool = False
If IN_str <> "" Then
IN_str = "aaa"
IN_bool = True
End If
End Function

シートのセルの数式からhoge1を呼び出す様にして、
同じセルの条件付き書式から数式でhoge2を呼び出す様に設定しとけば、
最初の1セルの設定は面倒だけど後はコピペで展開すれば
わざわざイベントの事を気にしないでも済むわさ。
まぁ、後は好みで使い分けるわさ。
955896:2011/05/15(日) 13:06:05.15
>>954
おお、条件付き書式にユーザ定義関数指定すれば確かにいけますね。
もしかし>>898の方はそういう意味で言ってくれていたのかも・・・^^;

これのほうが考え方としてはシンプルかもしれませんね。

この方法も検討してみます。どうもです。
956949:2011/05/15(日) 19:04:06.15
>>951
すまん。やってみたらできなかった
ユーザ定義関数でRangeさわると、どうもその段階で循環参照するっぽい
ということで代替案を考えた

まずクラスモジュール(updateclass)つくる
Public WithEvents App As Application
Public RangeToUpdate As Range
Public ColorToUpdate As Variant
Private Sub App_AfterCalculate()
    If Not RangeToUpdate Is Nothing Then
        RangeToUpdate.Interior.ColorIndex = ColorToUpdate
        Set RangeToUpdate = Nothing
    End If
End Sub
Private Sub Class_Initialize()
    Set App = Application
End Sub

やってることはApplicationのAfterCalculateで色を設定する
設定する範囲をRangeToUpdateで
設定する色をColorToUpdateで指定する

つづく
957949: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)とか指定する
958デフォルトの名無しさん:2011/05/15(日) 20:18:50.35
というかそこまで苦労してプログラム作るのって
なんかVBAの本来の目的から外れてる気がしないでもない

本当に必要な要件なのか、その辺から見直しオススメw
959デフォルトの名無しさん:2011/05/15(日) 20:31:17.58
>>957
>ユーザ関数呼んだセルはApplication.ThisCellでとれるみたいなので
>引数にRangeとる必要はなさそう

その方法だと再計算後のイベントで拾って来て1セルしか処理していないから
一度計算式を入れたセルを、違う色に着色して複数セル選択してコピペしても
一つのセルしか色が変わらないんじゃないか?
960デフォルトの名無しさん:2011/05/15(日) 20:37:16.18
つか関数でやるとセルをクリアしたとき塗りつぶし残ったままじゃん
あと条件をチェックする前に塗りつぶしをクリアしないと
961デフォルトの名無しさん:2011/05/15(日) 20:51:45.22
ま、>>958が正解だな
962デフォルトの名無しさん:2011/05/15(日) 22:09:09.26
>>958
これが正論であるがゆえ、Word VBAは隆盛をみないんだよなw
Access VBAはともかく
963デフォルトの名無しさん:2011/05/16(月) 03:55:56.12
>>959
複数セルコピペは試したけどちゃんと動いてる
ユーザ関数はセル単位で呼ばれてるはずだけど、そのたびに再計算してる模様
再計算方法を手動にしたらどうなるかって今ふと気になったがそこは知らん
964デフォルトの名無しさん:2011/05/16(月) 12:52:35.59
>>963
Aftercalculateがどう言うイベントか知っていればそんな返事は返って来ないと思うんだが。
一度ヘルプで確認してからトレースでも確認しろ。
背景色ごと複数セルを選択してコピペして以前塗られた背景色が残っているだけじゃないのか?
これが業務なら、指摘されても気付かないでそのまま通して本番環境で発覚したりする訳だ。
それに要件的には差程難しい要件ではないと思うが。
自分でトリッキーに作って難易度を上げておいて要件のせいにするのはどうかと思うぞ。
965デフォルトの名無しさん:2011/05/16(月) 16:59:57.44
>>964
>背景色ごと複数セルを選択してコピペして以前塗られた背景色が残っているだけ
これはその通りのようだ
で、何を要件のせいにしてるってんだ?
素直に作るとしてお前ならどう作るんだ?
966デフォルトの名無しさん:2011/05/16(月) 18:00:13.48
>>965
俺の意見は>>898で既に述べているが何か?
967デフォルトの名無しさん:2011/05/16(月) 20:57:41.99
いまだに「がなにか?」とかいう書き方するやつがいた
968デフォルトの名無しさん:2011/05/16(月) 21:00:34.43
別にいいだろ
969デフォルトの名無しさん:2011/05/16(月) 21:23:29.60
いまだに「がなにか?」とかいう書き方を普通にしますがなにか?
970デフォルトの名無しさん:2011/05/16(月) 21:41:20.69
なんかきもい
971デフォルトの名無しさん:2011/05/16(月) 22:42:01.64
きもすぎる
972デフォルトの名無しさん:2011/05/16(月) 23:09:53.99
いまだに「きもい」とかいう書き方するやつがいた
973デフォルトの名無しさん:2011/05/16(月) 23:11:10.78
はずい
974デフォルトの名無しさん:2011/05/16(月) 23:19:28.81
しょすい
975デフォルトの名無しさん:2011/05/16(月) 23:59:33.76
いまだに「いまだに」っていういまだにがいまだに
976デフォルトの名無しさん:2011/05/17(火) 17:10:44.71
そうだに
977デフォルトの名無しさん:2011/05/17(火) 23:16:49.04
なんだに
978デフォルトの名無しさん:2011/05/17(火) 23:19:14.42
にーにー、にににーにー!
979デフォルトの名無しさん:2011/05/18(水) 01:18:37.22
VBAでExcelの記載をHTMLに置き換える自動生成するプログラムを作っているのですが
for文で処理ごとにcountを追加してそれが7になったら改行(=<tr>タグで囲む)と言う事をしたいのですが

for文〜

'カウントが7の場合
If count = 7 Then
txt = txt & "<tr>"
End If

txt = txt & "<td>" & Cells(i, 1) & "</td>" &
count = count + 1

'カウントが7の場合
If count = 7 Then
txt = txt & "</tr>" & vbNewLine
count = 0
End If

next


If count = 7を2回書いて非常に不細工な記載になっているのですが
もっと簡単な方法ってあるのでしょうか?
980デフォルトの名無しさん:2011/05/18(水) 01:35:08.37
それをそのまま使うと

If Count = 7 Then
txt = txt & "<tr>" & "<td>" & Cells(i, 1) & "</td>" & "</tr>" & vbNewLine
Count = 0
else
txt = txt & "<td>" & Cells(i, 1) & "</td>"
count = count + 1
End if

981デフォルトの名無しさん:2011/05/18(水) 03:42:36.32
>>979
それおかしくない?TDがTRの外に出ちゃうよ?
こうだと思うんだけど

txt = txt & "<td>" & Cells(i, 1) & "</td>"
count = count + 1

If count = 7 Then
  txt = "<tr>" & txt & "</tr>" & vbNewLine
  count = 0
End If
982デフォルトの名無しさん:2011/05/18(水) 07:32:17.40
おしえたがり大ハッスル
983デフォルトの名無しさん:2011/05/18(水) 07:55:23.67
そして教えられないゴミが大嫉妬w
984デフォルトの名無しさん:2011/05/18(水) 08:25:17.55
おれの場合はあらかじめ、

txt = "<table><tr>" 'としておいて

For文〜

 txt = txt & "<td>" & Cells(i, 1) & "</td>"

 If Count = 7 Then
  txt = txt & "</tr>" & vbNewLine & "<tr>"
  Count = 0
 End if

Next

txt = txt & "</tr></table>"

だな。
985デフォルトの名無しさん:2011/05/18(水) 10:26:36.03
Do 【 until/while condition】←条件式?

【statements】←A ?
【exit do】  ←B ?
【statements】

loop

参考書に載ってるモデル図ですがAとBの個所が何を表わしてるのか
わかりません(´・ω・。)教えてくださいです

986デフォルトの名無しさん:2011/05/18(水) 10:45:59.19
>>985
つヘルプ
987デフォルトの名無しさん:2011/05/18(水) 10:56:21.08
do オプション
なんか処理
loop

これで条件達成するまでなんか処理を続ける
条件が不達だといわゆる無限ループ

do オプション
なんか処理1
ループ抜ける
なんか処理2
loop

これで無限ループからも抜けられる
988デフォルトの名無しさん:2011/05/18(水) 13:26:39.24
>>987
バカ?
989デフォルトの名無しさん:2011/05/18(水) 14:25:43.42
もっと分かりやすい説明が必要だったか……
990デフォルトの名無しさん:2011/05/18(水) 14:48:54.58
解りやすい解りにくい以前に間が抜けすぎだ
その記述は無限ループを回避する為の手法じゃないしな

ということは「バカ?」ではなく「マヌケ?」と言うべきだったかな?
991デフォルトの名無しさん:2011/05/18(水) 15:28:46.38
何が言いたいのかは理解した
が、どうでもいい

次スレまだー?
992デフォルトの名無しさん:2011/05/18(水) 15:58:13.21
これは苦しいw
993デフォルトの名無しさん:2011/05/18(水) 16:06:31.68
レスも読めないのに揚げ足とりして勝手に自爆するような方に中途半端に煽られても別に……
994デフォルトの名無しさん:2011/05/18(水) 16:11:45.45
反応するってことは自覚はあったようだ
995デフォルトの名無しさん:2011/05/18(水) 16:19:51.78
>>993
草生やすクズを一々相手にしてたら自分が嫌な気分になるから止めといた方がいいよ。
996デフォルトの名無しさん:2011/05/18(水) 16:22:50.64
自分にレs(ry
997デフォルトの名無しさん:2011/05/18(水) 17:03:46.10
ここまでお兄ちゃんの自演なの

新スレ欲しいなっ
998デフォルトの名無しさん:2011/05/19(木) 06:40:21.69
取り敢えず立てたので誘導させて頂くわさ。

Excel VBA 質問スレ Part19
http://hibari.2ch.net/test/read.cgi/tech/1305754555/l50
999デフォルトの名無しさん:2011/05/19(木) 10:10:39.25
やったね!
1000デフォルトの名無しさん:2011/05/19(木) 10:18:18.41
1000ならみんなが幸せに
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。