11/10/16 05:07:34.87
●を含む文字列を検索して削除、さらにこの動作を●を含む文字列がなくなるまで繰り返すvbaを作ってます。
以下のプログラムだと実行エラー424となってしまいますが、解決方法は無いでしょうか?どなたか教えてください。
Dim x As Range
Set x = Sheets("test").Cells.Find("●", After:=Range("A1"))
If Not x Is Nothing Then
Do While Not x Is Nothing
x.Delete
Loop
End If
207:デフォルトの名無しさん
11/10/16 07:54:45.29
VBAに関数オブジェクトなんて無いぞ。
Deleteした時点でxが無効な状態になってそれっきりじゃん。
208:デフォルトの名無しさん
11/10/16 07:58:32.85
>>206
まず制御が分かってないな
[F8]キーでステップ実行してみるといいよ
分からないメソッドはヘルプ参照するなり
ググるなりして
209:デフォルトの名無しさん
11/10/16 10:02:01.15
Dim x As Range
Set x = Sheets("test").Cells.Find("●", After:=Range("A1"))
If Not x Is Nothing Then
Do While Not x Is Nothing
x.Delete
Set x = Sheets("test").Cells.Find("●", After:=Range("A1"))
Loop
End If
こうだな
210:デフォルトの名無しさん
11/10/16 14:56:45.02
>>209
何も解ってない初心者を騙すのは良くないぜ
211:デフォルトの名無しさん
11/10/16 18:32:08.05
>>206
Sub 全部消せ()
Dim x As Range
Do
Set x = Sheets("test").Cells.Find("●")
If Not x Is Nothing Then x.Clear
Loop Until x Is Nothing
End Sub
212:デフォルトの名無しさん
11/10/17 06:01:38.76
こいつも制御が分かってないな
> Do
> Set x = Sheets("test").Cells.Find("●")
> If Not x Is Nothing Then x.Clear
> Loop Until x Is Nothing
制御以前に不適切なコードではあるが、このやり方で行くなら普通は
Do
Set x = Sheets("test").Cells.Find("●")
If x Is Nothing Then Exit Do
x.Clear
Loop
という制御にするよな。なんかDo...Loopには、WhileかUntilで条件書かないと気が済まない初心者大杉。
こいつは、「x Is Nothing」を2回連続で判定することにバカらしさ、正確には冗長性を感じないのかねぇ?
それと、なんで皆FindNext使わないの?質問者はまだしも、2人出てきた回答者まで揃って…
極狭い範囲では大差ないけど、広い範囲で何度も検索繰り返すと、FindとFindNextでは10倍以上の差がでることもあるのに。
まあ正確に言えば、FindとFindNextの差じゃなくて、オプション引数Afterを適切に指定して、前検索結果位置以降から
検索再開させるか否かの差だが、これをやるためにはループに入る前に、最初の検索結果をxに代入しておく必要があり
それやるならループの前と中両方Findにするより、前はFind、中はFindNextにした方がいい。
これやると、ループの前にもFind処理が入り、コード記述量自体は多くなるが、処理の冗長性、処理の内容的には少なくなる。
プログラムに置いては、自分だけが使う「使い捨てマクロ」でない限り、コードの表面的な記述量を減らすより、冗長な処理を無くして
処理量を減らすのが基本だよ。「x Is Nothing」の連続判定も、After無し、あるいは>>209みたいな固定値のAfterでのFind繰り返しも、
冗長極まりない。初心者はコード量が少ないのが優れたプログラム、コード量が少なければ処理量も少なくなると勘違いしてそうだが、
そういう認識でコード書いてたら、いつまで経っても成長できないよ。
更に言うなら「『文字列』を検索して『削除』」なので、ClearではなくClearContentsが正解。
213:デフォルトの名無しさん
11/10/17 06:58:50.28
いるよなあ。
コードを見ると反射的に最適化しまくる香具師ってw
>>206の質問の意図も、元のコードをできるだけ残して
最小限の変更で動くようにしてあげた>>211の配慮も
まるでわかってないんだろう。
プログラムばっかりやっていて対人関係を疎かにしていると
こういう空気を読めないコミュ障になるから気をつけよう。
214:デフォルトの名無しさん
11/10/17 20:19:29.71
同じようなコードは俺も考えたけど、
Do-Loopの両方に抜け出し条件を付けないのも、
それはそれで嫌な感じなんだよなあ。
あと、質問者のコードはClearじゃなくてDeleteだから。
215:デフォルトの名無しさん
11/10/17 20:28:23.92
わかっててDeleteを使ってんならいいけど、なんとなくわかってない気がするんだよなあ>質問者
元ソースの書き方だと詰める方向を明示しても良さそうなのに書いてないし
216:デフォルトの名無しさん
11/10/17 20:54:56.39
いるよなぁ
>>213みたいに上から目線で得意げになっちゃう子。
プログラムばっかりやっていて対人関係を疎かにしていると
こういう空気を読めないコミュ障になるから気をつけよう。
217:デフォルトの名無しさん
11/10/18 00:55:59.46
ちょいと聞きたい。
料理のレシピなんかを管理したいときって、ExcelでVBA使うのとACCESS使うのどっちがいいんだろうか。
(料理名で検索したり、逆に使用している材料で検索したりしたい)
218:デフォルトの名無しさん
11/10/18 01:08:39.49
Access
219:デフォルトの名無しさん
11/10/18 01:37:32.04
>>218
サンクス!やっぱアクセスか。
値段が高いからExcelで済ませたかったんだが仕方ない。
ついでに聞きたいんだが、VBAの用途ってどんなものがある?
やっぱ計算メイン?DBと接続とか出来た気もしたんだが。
220:デフォルトの名無しさん
11/10/18 01:44:02.45
>>217
とりあえずExcel
テーブル設計ができているのならAccessだろうが
料理のレシピって、どんなテーブルを使うのか見当がつかない
221:デフォルトの名無しさん
11/10/18 01:52:45.70
>>220
検索重視ならAccessだな
材料とかジャンルとか調理方法とか、テーブルの作り方次第でどうにでもどきる
222:デフォルトの名無しさん
11/10/18 01:53:25.19
まぁ対人関係のよいっていうか人格者にはキレのあるコードを書けるやつが少ないのは確かだ。
223:デフォルトの名無しさん
11/10/18 02:38:17.16
>>212はClearContentsでよければ
Set x =範囲.Find(********)
Do Until x Is Nothing
x.ClearContents
Set x =範囲.FindNext(x)
Loop
ってなるって教えりゃいいのに...。
あと書式が設定されてなきゃClearでも問題ないからな。
その方が早いし。
224:デフォルトの名無しさん
11/10/18 02:40:37.27
あとDeleteならFindNextはちょっと面倒になりそうだな。
225:デフォルトの名無しさん
11/10/18 02:42:20.44
そもそも>>223みたいなのはReplaceメソッドを使うべきだな。
226:デフォルトの名無しさん
11/10/18 02:50:09.29
コードだけ書いたんじゃ、知識のない奴には、どの回答が一番良いのか
どのコードにどういう問題があるのか解らなくて混乱する
奴の書き方は確かに諄いけど、間違ったこと書いてないし
他の回答者から見たらカチンとくるかもだけど、質問者から見たらむしろ
ありがたいだろうな
227:デフォルトの名無しさん
11/10/18 02:53:47.59
>>226
>>212は>>223や>>225まで気づいてたのかねぇ。
まぁFindメソッドのヘルプの添削だから知ってるかも知らんが。
228:デフォルトの名無しさん
11/10/18 03:04:41.25
ちなみにDo Loopの制御構造をよく理解できてない人は下のように書きがちだ。
Set x =範囲.Find(********)
If Not x Is Nothing Then
Do
x.ClearContents
Set x =範囲.FindNext(x)
Loop Unitil x Is Nothing
End If
229:デフォルトの名無しさん
11/10/18 03:05:14.60
Sub あああ()
Dim a As Variant
Dim b As Variant
Dim c As Variant
Dim d As Variant
Dim e As Variant
a = 2
Do While Cells(a, 1).Value <> ""
If Cells(a, 3) = Cells(a - 1, 3) And Cells(a, 2) >= 15 Then
Cells(a - 1, 5) = b
End If
c = WorksheetFunction.SumIf(ActiveSheet.Range("f2:f288215"), "b = 1 ")
d = WorksheetFunction.CountIf(ActiveSheet.Range("e2:e288215"), "b > 0")
a = a + 1
Loop
e = c / d
Cells(8, 8) = e
End Sub
230:229
11/10/18 03:10:11.71
>>229
● 「C列のアクティヴセルとその1こ上が同じ名前」かつ「B列」が15以上の時、
1・E列がセルない「1」の数
2・ 1の時、F列の数値の合計
3・ 「1/2」を算出したい
● オーバーフローになる
● エクセルの反応がなくなる
んですがどうすればいいでしょうか?
231:196
11/10/18 08:27:09.75
>>230
きれいな日本語で書き直して。
232:デフォルトの名無しさん
11/10/18 09:14:55.40
>>219
>値段が高いからExcelで済ませたかったんだが仕方ない。
RDBにするならMySQLやPostgreSQLでもいいやん
自分で使うぶんには無料だし
233:デフォルトの名無しさん
11/10/18 10:26:15.56
無料のSQLserverでもええやん
234:デフォルトの名無しさん
11/10/18 10:32:08.13
>>230
変数bの内容が最初から最後までずっと0のまま
まずはそこを直せ
235:229
11/10/18 12:43:14.94
>>234
やり方がわかりません・・・
確かにF列の該当セルが空欄になっちゃいます・・
236:229
11/10/18 13:32:57.52
書き直しました
Sub あああ()
Dim a As Long
Dim b As Long
Dim c As Long
Dim d As Long
Dim e As Long
a = 2
Do While Cells(a, 1).Value <> ""
If Cells(a, 3) = Cells(a - 1, 3) And Cells(a, 2) >= 15 Then
b=Cells(a - 1, 5)
c = WorksheetFunction.SumIf(ActiveSheet.Range("f2:f200"), "b = 1 ")
d = WorksheetFunction.CountIf(ActiveSheet.Range("e2:e200"), "b > 0")
End If
a = a + 1
Loop
e = c / d
Cells(8, 8) = e
End Sub
237:229
11/10/18 13:33:34.74
>>236を実行すると「オーバーフローしました」というエラーが出てしまいます
238:デフォルトの名無しさん
11/10/18 13:50:54.13
>>237
レス直前に、変数bとRANGE修正してたか。
とりあえず、「SumIf」「CountIf」の使い方も間違ってる気がする。
変数c,dがゼロになるから、変数eの計算をゼロで除算してる。
239:229
11/10/18 14:11:01.15
>>238
>変数c,dがゼロになるから、変数eの計算をゼロで除算してる。
問題点がわかりました。
ありがとうございます
240:これでなぜ、エラー1004ですか
11/10/18 15:04:40.77
Sub 入力ボタン_Click()
Worksheets("転載部分").Activate
Dim e As String
Dim f As String
Dim g As String
Dim h As Integer
Dim nexter As Long
' 改行の動作が、これ。
nexter = ActiveSheet.Cells(3, 1).End(xlDown).Row
e = 有利な特徴.Value
f = 分野.Value
g = レベル.Value
h = ポイント.Value
Worksheets("転載部分").Cells(nexter + 1, 1).Value = e
━
途中まで、転載しました。この最後の行で、止まります。もう、謎です。たすけて。
241:デフォルトの名無しさん
11/10/18 15:16:29.11
>>240
エラーが出た時、変数nexterがいくつになってるか確認
242:これでなぜ、エラー1004ですか
11/10/18 16:07:44.33
65536になってます。本当はこれ、3のはずなんです。
243:これでなぜ、エラー1004ですか
11/10/18 16:10:28.52
4行目が空白セルで、この空白セルの一つ上のセルを自動的に見つけてくれるはずなんです。
244:これでなぜ、エラー1004ですか
11/10/18 16:13:51.14
nexter = ActiveSheet.Cells(2, 1).End(xlDown).Row
にしたら、下の行へ下の行へと行かず、4行目のセルばかりをセレクトするようになります。
後半部を下にペーストします。
Cells(nexter + 1, 2).Value = f
Cells(nexter + 1, 3).Value = g
Cells(nexter + 1, 4).Value = h
Range(Cells(nexter + 1, 1), Cells(nexter + 1, 4)).Select
(罫線のところ中略)
ActiveCell.Offset(1, 0).Select
End Sub
245:デフォルトの名無しさん
11/10/18 16:27:24.33
A列の最終行
246:これでなぜ、エラー1004ですか
11/10/18 16:27:58.40
自己解決しました。
いったん、セル改行をされなくなるようにしてから動作させて、
再び元に戻したら、アプリケーションやオブジェクトの問題が起きなくなりました。
謎は残ります。自己解決とはいえ、なぜこうなるのかご存知でしょうか。
247:これでなぜ、エラー1004ですか
11/10/18 16:42:31.46
また、問題がぶり返しました。コンボ・ボックスを追加したら、先程の手順でも効果がなくなりました。
248:これでなぜ、エラー1004ですか
11/10/18 16:45:33.72
とりあえず、初期状態の文字入り(.value有り)のセルを2行の厚さにしました。これも、応急処置です。
249:これでなぜ、エラー1004ですか
11/10/18 16:55:39.81
スポーツ界も格闘界も芸能界もIT業界もヤクザが幅を利かせてると
聴きましたが、興業はともかく、なんでITもなんでしょうか。
250:952
11/10/18 20:05:28.96
関数にdll使うのって、vbaのみで作った場合と比較して
計算速度としては優位になるのでしょうか。
目くそ鼻くそ?
251:デフォルトの名無しさん
11/10/18 20:24:07.43
>>248
>初期状態の文字入り(.value有り)のセルを2行の厚さ
nexter = ActiveSheet.Cells(2, 1).End(xlDown).Row
では これが最善策じゃないかな
今回の場合、このコードだと
Cells(2, 1)を含めて2行以上の連続した文字入りセルがないと .End(xlDown)は希望する
セル位置にはならないよ
とりあえず
.End(xlDown) は CTRL+↓ と基本同じ動作なので手動でテストしてみる事をお勧めするよ
んで自分なら
nexter = ActiveSheet.Cells(ActiveSheet.Rows.Count, 1).End(xlUp).Row
とするかな
252:デフォルトの名無しさん
11/10/18 20:28:56.25
>>250
作って比較すりゃ分かるじゃん。
俺のはdllの方が速いよ。
253:デフォルトの名無しさん
11/10/18 20:34:34.30
>>249
人身売買は893の専売特許
254:デフォルトの名無しさん
11/10/18 23:16:59.36
速度をやたら気にする人間はこれでテストすれば良い。
'ミリ秒単位での時間の計測
Declare Function GetTickCount Lib "kernel32.dll" () As Long
Sub うんたらかんたら()
Dim startTime As Long
Dim endTime As Long
'処理の先頭で現在時刻を取得
startTime = GetTickCount
'何らかの処理
'処理の末尾で現在時刻を取得し、その差分を調べる
endTime = GetTickCount
MsgBox "経過時間は " & Format(endTime - startTime, "#,##0") & "[ミリ秒]"
End Sub
255:デフォルトの名無しさん
11/10/19 01:01:18.89
ご冗談を…
256:デフォルトの名無しさん
11/10/19 03:05:26.89
常識的に考えれば、DLLで行う処理が(呼び出しのオーバーヘッドも含めて)VBAで行う処理より早ければDLLが早いし
そうじゃないならVBAの方が早いって結果になるんだが
そこに有利も不利もないだろ
257:デフォルトの名無しさん
11/10/19 09:09:30.57
そういえばVBAにもコンパイルってあったよな
それも比較してみたら?
258:デフォルトの名無しさん
11/10/19 11:11:51.04
>>251
>んで自分なら
>nexter = ActiveSheet.Cells(ActiveSheet.Rows.Count, 1).End(xlUp).Row
>とするかな
nexter = ActiveSheet.Cells(ActiveSheet.Rows.Count, 1).End(xlUp).Row
と
nexter = Cells(Rows.Count, 1).End(xlUp).Row
の違いって何なのでしょうか
同じだったら短いほうが読み易い気もするんですが。
259:デフォルトの名無しさん
11/10/19 13:46:08.73
>>258
コードが標準モジュールにあるなら一緒 好きな方にすればいい
コードがシートモジュールにあった場合
nexter = Cells(Rows.Count, 1).End(xlUp).Row
の処理対象シートは シートモジュールのシートになる(ActiveSheetではない)
260:デフォルトの名無しさん
11/10/19 23:29:39.97
行番号を求めてるうちはSelectするレベルと大差ない。
下くらい書けるようになってやっと脱初心者。
書けてもけっして上級者ではない。
Dim nexter As Range
Set nexter = Range("A" & Rows.Count).End(xlUp).Offset(1)
nexter.Offset(, 1).Resize(, 3).Value = Array(f, g, h)
nexter.Resize(, 4).Select
'(罫線のところ中略)
nexter.Select
261:デフォルトの名無しさん
11/10/19 23:33:55.17
なるほど、そういう違いがあったのですか。
教えてくださってありがとうございます。
標準モジュールしか使ったことがないので分かりませんでした。
もう一個、まったく別件の質問なのですが
FileSystemObjectってあるじゃないですか。
あれって皆さんどんな風に使ってるのでしょうか。
私はパブリック変数で FSO as Object を宣言して
最初のプロシージャで
Set FSO = CreateObject("Scripting.FileSystemObject")
ってやってますが、
パブリック変数はあまり使わないほうが良いらしいので、
他にもっと良いやり方があるなら教えてほしいです。
(参照設定でMicrosoft Scripting Runtimeにチェックを入れるやり方は
別PCで実行するときに面倒なのであまり良いやり方とは思えません。)
262:デフォルトの名無しさん
11/10/19 23:40:28.38
>>261
グローバル変数を使わない方法だと、別の手続きを呼び出すときには、いちいちオブジェクトもパラメータとして渡すってのが
まあ、正当と言えば正当かな
Call File_Sub_1(FSO, Data1, Data2)
みたいに
263:デフォルトの名無しさん
11/10/20 01:38:14.59
パブリックな変数はあまり使わない方がいいってのは、変数の有効範囲は狭い方が良いというのが基本的な考え方
FSOで考えれば、ほんとにFSO(のインスタンス)を使いまわす必要があるのか考えた方がいい
あとパブリックかどうかと、参照設定するかCreateObjectするかは別の話なんだが解ってるのか?
264:デフォルトの名無しさん
11/10/20 02:11:51.13
>>262
>>263
インスタンスを使いまわすとかそういう事は考えてなくて
単純に宣言とか一回で済むほうが楽だというか、
グローバル変数使うと引数で渡さずに済むんで楽でいいな、
という程度の認識しかないです。
参照設定についてはとにかくマクロのコードの中以外で完結してない事が
やっぱり面倒だという認識で敬遠してます。
CreateObjectと参照設定の件についてはあんまり意味が分かってないです。
参照設定にするとオートコレクトが使えるんでしたっけ?
という程度です。
265:デフォルトの名無しさん
11/10/20 19:33:18.65
>>264
自分は未熟だし、いつどのようなプログラム例を見つけるか不明なので、
最初はPublicで書き連ねていく。
マクロを作りながら、そこにコメント付けて分類したりして纏めていく。
完成と言えるものができたら、
データ型の見直しとか、適切な場所への移動を行う。
まぁ、趣味でやっててヘルプファイルとグーグル先生が教師だからこんなもんだ。
266:VBA初心者
11/10/20 20:28:33.52
ファイルのカスタムプロパティにDSO
support.microsoft.com/kb/224351/ja
を利用して、値を書き込もうとしています。
下のソースで、対象ファイルがExcelやWordなら書き込めるのですが、
SolidWorksというCADのファイルだと書き込まれません。
(OnErrorでも反応なし。ちなみにASCIIコードや半角カタカナ,全角文字は
1文字は書き込めます。)
やはり、SolidWorkerの販売元に聞かないといけないでしょうか?
Set objDSO = CreateObject("DSOFile.OleDocumentProperties")
objDSO.Open ファイル名
objDSO.CustomProperties.Add "項目1"
Set objProperty = objDSO.CustomProperties.Item("項目1")
objProperty.Value = "あい"
objDSO.Save
objDSO.Close
Set objDSO = Nothing
どなたか、わかる方いましたらご教授お願いします。
267:デフォルトの名無しさん
11/10/21 09:27:50.30
グローバル変数あるとデバッグとメンテが大変なんだよね。
使用箇所は検索出来てもそれがどんな順番で実行されるか分からないし。
メソッドが変数について状態を前提としているかも分からないし。
逆に、一度初期化した後は読み取り専用って使い方はアリだと思う。
268:デフォルトの名無しさん
11/10/21 11:21:40.33
土素人ですいません。文系の学生で、できなくて困ってます。
VBAでCLEAN関数を使って、列一行改行を全部取りたいです。
SUB HOGE
なんたら CLEAN ("A:A")
END SUB
みたいにできるでしょうか?縦一列の、改行を全部削除できたらいいです。
269:デフォルトの名無しさん
11/10/21 11:55:45.10
>>268
Clean関数は文字列しか処理できない(Rangeは受け付けない)ので、
自分で繰り返すように作る
For r = 1 To ActiveSheet.UsedRange.Row
Cells(r, 1) = Application.WorksheetFunction.Clean(Cells(r, 1))
Next
270:デフォルトの名無しさん
11/10/21 12:31:44.69
>>268-269
たとえば
With Range("A1",Range("A"&Rows.Count).End(xlUp))
.Value=Application.Clean(.Cells)
End With
実際は文字列は一旦消してから書き出すのが鉄則なので、Variant型変数に取得して
範囲を消してから書き出す。
271:デフォルトの名無しさん
11/10/21 12:39:12.00
質問です
nmcファイルに関する質問はここでいいでしょうか
272:デフォルトの名無しさん
11/10/21 12:53:13.58
>>271
だめです
273:デフォルトの名無しさん
11/10/21 13:22:22.50
そうですか
では受付しているスレがあったら教えてください
ダウンロードしたツールのヘルプに書いてあるexeの実行について
説明がよくわからなく、自分で追加していいのか教えてほしいのが趣旨です
よろしくお願いします
274:デフォルトの名無しさん
11/10/21 13:37:52.79
>>273
>>1を100万回読んでね
275:デフォルトの名無しさん
11/10/21 14:24:15.02
>>269-270
ほんとにありがとーーーーーーーーーー!(涙)涙出るほどうれしいよ。
こうやって合体させたよ。
Sub Macro2()
For r = 1 To ActiveSheet.UsedRange.Row
Cells(r, 1) = Application.WorksheetFunction.Clean(Cells(r, 1))
Next
With Range("A1",Range("A"&Rows.Count).End(xlUp))
.Value=Application.Clean(.Cells)
End With
END SUB
詳しいコード内容はわからないが、
これでA列がクリーンされた。
関数によって簡単にVBAに組み込めないものもあるのだろうか?
ほんと感謝
276:デフォルトの名無しさん
11/10/21 14:27:56.50
明日エキスパート(スタンダード)の試験でレジストリ関係の処理をテストしてるんですが、
↓のコードがコンパイルエラーになります。(DeleteSettingステートメント)
メッセージは「引数の数が一致していません。または不正なプロパティを指定しています」
これでなぜコンパイルエラーになるのか誰か説明してくれませんか?
もう2時間も足踏みしている
'登録名:Application
pos = InStrRev(ThisWorkbook.Name, ".") - 1
APPNAME = Left(ThisWorkbook.Name, pos)
'データ削除
DeleteSetting APPNAME
MsgBox "レジストリ掃除完了"
277:デフォルトの名無しさん
11/10/21 15:08:45.89
Functionoプロシージャか他のユーザー定義関数で、関数を格納したセルの値が
参照するセルの値の変更に伴い、自動的に再計算されて正しい数になるプロシージャはないでしょうか。
例:セルA4の値=3 セルA5の値=5 セルA6の関数の値=20
左の値を3から30に変える、左のセルから他のセルへ移った瞬間、セルA6が40になる。
※例のセルA6には、ifやselect等で作られた独特なユーザ定義関数が入っているものとする。
278:デフォルトの名無しさん
11/10/21 16:49:52.72
>関数によって簡単にVBAに組み込めないものもあるのだろうか?
WorksheetFunctionクラスのメソッドでは提供されてないものもある
CODE関数とか
まぁ他にもいろいろあるんだろうけど。
279:デフォルトの名無しさん
11/10/21 20:23:24.18
×
For r = 1 To ActiveSheet.UsedRange.Row
Cells(r, 1) = Application.WorksheetFunction.Clean(Cells(r, 1))
Next
△
For r = 1 To ActiveSheet.UsedRange.Rows.Count
Cells(r, 1) = Application.WorksheetFunction.Clean(Cells(r, 1))
Next
○
For Each x In ActiveSheet.UsedRange.Columns(1).Cells
x = Application.WorksheetFunction.Clean(x)
Next
280:デフォルトの名無しさん
11/10/21 20:25:17.58
>>277
日本語おかしいけどユーザ定義関数で解決する話じゃないの?
281:デフォルトの名無しさん
11/10/21 21:00:16.85
>>277
自分のVBA関数内でApplication.Volatileを記述すると幸せになれるかも。
282:デフォルトの名無しさん
11/10/21 21:04:37.70
>>279
なんでループ回すの?
>>270読んだ?
283:デフォルトの名無しさん
11/10/21 21:11:31.57
ループ回すにしてもUsedRange.Columns(1).Cellsは下手だわな。
UsedRange.Resize(,1)とすればセルの集合になるし。
284:デフォルトの名無しさん
11/10/21 21:39:40.87
>>276
再現できない
レジストリエディタ見ながら
1行ずつ試してみれば?
285:デフォルトの名無しさん
11/10/21 22:17:30.54
>>279は>>270の間違いを正しただけだな。
For r = 1 To ActiveSheet.UsedRange.Rowは明らかな間違いだし。
286:デフォルトの名無しさん
11/10/21 22:20:19.40
すまん>>270じゃなく>>269の間違いを正したってことね。
287:デフォルトの名無しさん
11/10/21 22:30:26.40
>>285-286
なるほど、そういえばそうだな。
288:デフォルトの名無しさん
11/10/21 23:25:21.00
Excel2010でグラフを表示させるマクロを組んでます。
下のコードでは、実行したときに「ApplyCustomeTypeメソッドは失敗しました: '_Chart'オブジェクト」とエラーが出ます。
ネットにも割と転がってる書き方なんですが、何が原因なんでしょう?
Dim ChartObj As ChartObject
Dim ch As Chart
Set ChartObj = ActiveSheet.ChartObjects.Add(100, 100, 100, 100)
Set ch = ChartObj.Chart
ch.ApplyCustomType ChartType:=xlAnyGallery, TypeName:="折れ線"
'実際にはユーザー定義のグラフを作成します。
'このあと実際のデータ系列を追加していきます。
289:デフォルトの名無しさん
11/10/22 01:40:03.91
>>288
2007で試したけど、TypeNameにテンプレートに保存されてる名前指定しないとエラーになるな
290:デフォルトの名無しさん
11/10/22 01:56:30.15
>>283
コードの可読性って知ってる?
291:デフォルトの名無しさん
11/10/22 06:15:39.57
可読性はどっちも変わらないよ。
292:デフォルトの名無しさん
11/10/22 06:21:27.04
そういえばOffset(,1)とすると可読性が落ちるとかいう先生がいたな。
Offset(0,1)としなさいみたいな。
Resizeの第一引数がないから可読性が落ちると思ってたりして。
293:288
11/10/22 08:42:11.99
>>289
ためしにグラフのテンプレートを作ってそれを指定したらうまくいきました。
thx!
294:デフォルトの名無しさん
11/10/22 09:03:09.96
>>291
残念、ハズレ
295:デフォルトの名無しさん
11/10/22 09:57:19.71
最近vb.netやってて久しぶりにVBA でちょこっとPG組んでみたけどなんか凄い違和感を感じた。
やっぱりあまり入力補完が効かないせいかな。
可読性は大事だね。変数名とかにも拘れば、その分
説明のコメントを省略出来たりすることもあるしね。
296:デフォルトの名無しさん
11/10/22 11:01:55.28
可読性なんてのはその人のレベルで違う。
297:デフォルトの名無しさん
11/10/22 11:05:35.02
欲しいのは1列目のセル集合
① 使用範囲 の 列(1) の セル
② 使用範囲 の サイズ変更(,1)
はてさて、、、
298:デフォルトの名無しさん
11/10/22 11:08:08.95
>>295
VBAでは入力補完が効く書き方が概ねセンスのよい書き方だ。
入力補完が効かない場合でもきちんと固有の型の変数に一度代入すれば入力補完が効く。
たとえばWith ActiveSheetとやっても駄目だが、Worksheet型の変数に
Set sh = ActiveSheet
With sh
とすれば入力補完が効く。
299:デフォルトの名無しさん
11/10/22 11:10:30.77
>>297
その人のレベル。
300:デフォルトの名無しさん
11/10/22 11:12:30.41
欲しいのは1列目のセル集合
① 使用範囲 の 列(1) の セル
② 使用範囲 の サイズ変更(,1)
はてさて、、、
301:デフォルトの名無しさん
11/10/22 11:13:33.15
どっちも同じ
302:デフォルトの名無しさん
11/10/22 11:15:55.78
① 使用範囲 の 列(1) の セル
② 使用範囲 のセル集合のサイズ変更(,1)
だな。
UsedRangeはセル集合を最初から返すから、セルの集合のまま使った方が手っ取り早い。
303:デフォルトの名無しさん
11/10/22 11:42:21.69
> UsedRangeはセル集合を最初から返すから、セルの集合のまま使った方が手っ取り早い。
> UsedRangeはセル集合を最初から返すから、セルの集合のまま使った方が手っ取り早い。
> UsedRangeはセル集合を最初から返すから、セルの集合のまま使った方が手っ取り早い。
> UsedRangeはセル集合を最初から返すから、セルの集合のまま使った方が手っ取り早い。
> UsedRangeはセル集合を最初から返すから、セルの集合のまま使った方が手っ取り早い。
304:デフォルトの名無しさん
11/10/22 11:46:00.34
>>303
分かり切ったことを5回も書かなくていい。
つまり
①セル集合の使用範囲の列集合の列(1) のセル集合
②セル集合の使用範囲のサイズ変更(,1)
ってことだろ?
305:デフォルトの名無しさん
11/10/22 12:34:59.89
┐(´ー`)┌
306:デフォルトの名無しさん
11/10/22 13:45:11.77
Sheet1の使用範囲の2列目のセル集合なら
Sheet1.UsedRange.Columns(2).Cells
Sheet1.UsedRange.Resize(,1).Offset(,1)
などがあり、とりたてて後者を推奨するわけではないが、1列目に限れば
Sheet1.UsedRange.Resize(,1)がすっきりしてるわな。
上級者ほどResizeを使うだろうな。
307:デフォルトの名無しさん
11/10/22 14:06:46.59
失礼、
上級者ほどResizeを使わないだろうな。
の誤りです。
308:デフォルトの名無しさん
11/10/22 14:16:01.87
>>307は下手くそな成りすまし
>>306ではない
おまえは下手を自覚した方がいい。
309:デフォルトの名無しさん
11/10/22 14:29:00.56
話反れるけどVBA上級者ってどんな人?
PGならVBから入った人が多くて、そっちの機能で大体の事は出来ちゃうと思うし、
現場で使う人は、機能は知っててもプログミングの基礎知識が無いだろうし。
自分の周りに上級者が居ないので気になりました。
310:デフォルトの名無しさん
11/10/22 14:34:35.64
全くの素人です。あるフォルダ―の中のエクセルファイルがあります。
のファイルの中にはいろいろ個別のデータが書き込まれているのですが、
中身チェックのマクロとか組めば、各ファイルを開いて簡単に中身を読み込んで、
一覧表みたいなのはできるのでしょうか?
311:デフォルトの名無しさん
11/10/22 14:38:57.21
VBAで上級者はいない
これデフォ
312:デフォルトの名無しさん
11/10/22 14:46:31.92
できる事も、やれる環境も限られてるからな
プレハブで豪邸が建たないとの同じようなもんだ
プレハブにはプレハブのいい所があるんだから、そこを重視すべき
313:デフォルトの名無しさん
11/10/22 15:04:06.01
たまに、「うちの業務は全部この Excel 帳票でやってます」
なんてのがあるけど、物には限度ってものがあるよな。
314:デフォルトの名無しさん
11/10/22 15:18:10.23
>>310です。 ぐぐったら出てきました。 自己解決です。
315:デフォルトの名無しさん
11/10/22 15:29:52.56
「上級者ほど~を使う」というのは、上級者じゃないと把握出来ない
つまり「上級者ほど~を使う」というのは、「俺は上級者」と遠回しながらドヤ顔で言ってるのと同じ
しかも、自分の書いたものを、他人が上級者認定してるかのように自演してまで
うわぁ、痛すぎw
316:デフォルトの名無しさん
11/10/22 16:17:33.95
309だけど自演じゃないよ。
「プレハブ工法を知り尽くした男」に尊敬や憧れなんて無いし。
偉いとは思うけどね。
やっぱ上級者を育てる土壌がないのか、危険な言語だわ
317:デフォルトの名無しさん
11/10/22 16:28:19.27
上級者ほど道具を使って
マニアックになって行く
318:デフォルトの名無しさん
11/10/22 16:41:24.11
というか、想定用途が違うんだから、VBA 以外でやったら上級者とかいう話じゃないでしょ。
むしろ、VBA で済ますべきか他の方法を使うべきかを見極められるのが上級者。
319:デフォルトの名無しさん
11/10/22 16:53:54.68
> 1列目に限れば
条件を勝手に限定せず
条件が変わっても違和感無く柔軟に対応できる方法を使うのが上級者
特定条件での端的なすっきりさを優先して、1列目ならResize、2列目以降ならColumnsと
やりかたをコロコロ変えるのが初心者
320:デフォルトの名無しさん
11/10/22 17:21:01.86
だそうだ
321:デフォルトの名無しさん
11/10/22 18:51:17.38
実行時バインドのItemプロパティを多用する奴に上級者はいない。
322:デフォルトの名無しさん
11/10/22 18:59:45.85
>>316
プレハブの例え挙げたの俺だけど、>>318が正解
震災の仮設住宅設営で、一級建築士も宮大工も必要ない
言語は道具なんだから、きっちり使いどころを押さえているのが肝要
まぁプレハブ工法を極めるのもアリでしょ
かなりのスピードと精度を求められると思うが
323:デフォルトの名無しさん
11/10/22 19:01:05.96
おまいら1行目にいろんな処理をするときどちら使う?
その1
With Range("A1").CurrentRegion.Rows(1)
.****.***
.****.***
.****.***
End With
その2
With Range("A1").CurrentRegion.Resize(1)
.****.***
.****.***
.****.***
End With
324:デフォルトの名無しさん
11/10/22 19:18:38.01
Range(場所).Columns(1)
325:デフォルトの名無しさん
11/10/22 19:19:38.02
ああ、ColumnsじゃなくてRowsか
326:デフォルトの名無しさん
11/10/22 19:20:37.77
>>324
どちらへのレス?
327:デフォルトの名無しさん
11/10/22 19:22:30.80
ちょい遅かったか。
>>324-325は>>319か?
328:デフォルトの名無しさん
11/10/22 19:25:18.84
>>323
どちらが楽かと言われれば当然後者だわな。
329:デフォルトの名無しさん
11/10/22 19:36:40.52
分かってる人もいるにはいるんだな。
330:デフォルトの名無しさん
11/10/22 19:41:10.60
何故に自演してまで・・・
331:デフォルトの名無しさん
11/10/22 19:44:58.29
また始まったなw
332:デフォルトの名無しさん
11/10/22 19:52:23.38
>>324=>>319だったらかわいそうだな。
333:デフォルトの名無しさん
11/10/22 19:59:37.98
一方を書いたの俺だが、=はハズレなので可哀想じゃないわけだね
334:デフォルトの名無しさん
11/10/22 20:04:13.88
>>324-325ならどっちにしてもかわいそう
335:デフォルトの名無しさん
11/10/22 20:58:37.29
_,====ミミミヽ、
,,==≡ミヽミヾミミミ、ヾ、
_=≡≡三ミミミ ミミヾ、ソ)),,》 .
彡彡二二三≡ミ-_ ミミ|ノノj )||ヽ, )、
__,,,,,,,,,/彡二二二 ,- __ミ|/ノ ノノノノ) ||
-=二ミミミミ----==--'彡 ∠ミミ_ソノノノノ ノ
//>=''"二二=-'"_/ ノ''''')λ彡/
,,/ ̄''l 彡/-'''"" ̄-=彡彡/ ,,-''",,,,,,,ノ .彡''"
(, ,--( 彡 ,,-- ===彡彡彡"_,-_ ヽ Υ
ヾ-( r'''''\ //=二二''''''彡ソ ̄ ∠__\ .\ソ .|
\;;;; \ Ζ彡≡彡-'''',r-、> l_"t。ミ\ノ,,r-v / ̄ ̄ ̄ ̄ ̄ ̄
\;;;; \ 彡""彡彡-//ヽ" ''''''"" ̄'''""(エア/ /
\;; \'''''')彡ヽ// | (tv /| , r_>'| < 一体(ry
\;;; \'" \ ,,"''-,,ノ,r-", / r'''-, .j \
\;;; \ /,,>--'''二"''' r-| 二'" / __ \______
\;;r'""彡_l:::::::::::::::::::::: /./_ " / ̄ ̄"===-,
)''//rl_--::::::::::::::::/:/ヽ"'=--":
336:デフォルトの名無しさん
11/10/22 21:04:01.01
アホと戦うのも疲れるよ。
337:デフォルトの名無しさん
11/10/23 01:58:17.38
VBAスタンダードクラウン日本第1号講師のVBA講座 - YouTube
www.youtube.com/watch?v=ZNx8aq9ZIvI
これの Test4_1_6のプロシージャなんだけど
制御がひどくないか
Worksheets("Sheet1")がWorksheets("Test")より左にあったら
実行時エラーだし
VBAに関わらず、こんな制御を書く人間はプログラミングしないでくれ
338:デフォルトの名無しさん
11/10/23 02:48:03.74
>>337
何この上から目線
人が何書こうが勝手だろうに
339:デフォルトの名無しさん
11/10/23 07:29:17.41
>>337
ループの回し方の講座だろ?
Worksheets("Test")はない前提だから別にいいんだよ。
そもそもシート名を書き換えるなら普通はループは回さないし。
またコードなんか隅々まで考慮に入れて書いてたら2~3倍の記述量になるから講義にはならん。
340:デフォルトの名無しさん
11/10/23 09:41:01.03
厨房でも設問の「ただし空気抵抗は考慮しない」云々の但し書きに
あーだこーだぬかす奴がいるでしょ
それと同じだよ
問題の本質を捉えられない馬鹿は普通にいる
341:デフォルトの名無しさん
11/10/23 10:10:32.61
擁護がひどいな
VBAスタンダードクラウン日本第1号講師のVBA講座 - YouTube
www.youtube.com/watch?v=ZNx8aq9ZIvI
より、引用
Sub Test4_1_6()
For i = 1 To Worksheets.Count
If Worksheets(i).Name = "Test" Then
MsgBox "既にTestシートが存在します"
Exit Sub
ElseIf Worksheets(i).Name = "Sheet1" Then
Worksheets(i).Name = "Test"
Exit For
End If
Next
End Sub
342:デフォルトの名無しさん
11/10/23 10:38:38.30
Sheet1が先に見つかったらエラーですかw
343:デフォルトの名無しさん
11/10/23 16:57:01.73
シート名の"Sheet1"と"Test"は共存しない前提だろ?
"Sheet1"を"Test"に変更すれば"Sheet1"はなくなるからね。
共存ありなら
Sub Test4_1_6()
Const FROM_NAME As String = "Sheet1"
Const TO_NAME As String = "Test"
Dim sh As Worksheet
On Error Resume Next
Set sh = Worksheets(TO_NAME)
On Error GoTo 0
If sh Is Nothing Then
On Error Resume Next
Set sh = Worksheets(FROM_NAME)
On Error GoTo 0
If Not sh Is Nothing Then
sh.Name = TO_NAME
End If
Else
MsgBox "既に" & TO_NAME & "シートが存在します"
End If
End Sub
なんてなるんだろうけど。
344:デフォルトの名無しさん
11/10/23 16:58:43.47
ん?Testシートが既存の状態でsheet1が先に見つかったら同じ名前を付けようとしてエラーになるやん。
でも講座用なら別にこんなん普通やろ。>>340に同意だな。
345:デフォルトの名無しさん
11/10/23 17:06:56.96
おっと、たとえばグラフシートに"Test"とかあった場合上ではNGか。
shをObject型で宣言して
Set sh = Worksheets(TO_NAME)じゃなく
Set sh = Sheets(TO_NAME)だな。
346:デフォルトの名無しさん
11/10/23 18:12:07.64
普通のExcelの初期状態の新規ブックはSheet1とかSheet2って名前になってるよな。
別に>>341みたいに目くじら立てる問題じゃないな。
講義用ならありだと思う。
ほんまもんのプロが>>341みたいな不細工なコード書いてたらプロとして失格だが。
347:デフォルトの名無しさん
11/10/23 19:13:50.91
単純に、Forループを2回廻すとか、
Sheet1のインデックス取っておいて
Forループ出てからファイル名変更するとか、
すれば、講座の趣旨にも沿うだろ
>343とかw
348:デフォルトの名無しさん
11/10/23 20:21:54.46
スタンダードクラウンなんて資格は知らんが、大体資格なんてあてになるのか?
MVPなんかかなり酷いぞ。
349:デフォルトの名無しさん
11/10/23 20:25:29.08
訂正
全員ひどいってわけじゃないと思うが、ひどいのがいるって話ね。
350:デフォルトの名無しさん
11/10/23 21:55:11.31
そいつ前いた忍者ハッタリ君じゃね?
351:デフォルトの名無しさん
11/10/23 22:53:10.63
エラー処理ってどこまで配慮するかのサジ加減が良く分からない。
自分で使うマクロなら例えば数字の入力を要求するところに文字は入れないし、
エラーで止まっても原因の見当がつくから適当に書いちゃってる。
でも人に使わすものだと相手がどんな使い方するか分からないから
エラー処理きちんとやらないとあとで文句言われてめんどくさい。
352:デフォルトの名無しさん
11/10/23 23:49:30.14
MVPはサイトを立ち上げてティップスをいっぱい並べておけば誰でもなれる。
ティップスの質は関係ないよ。
353:デフォルトの名無しさん
11/10/24 00:04:04.69
そのとおり
MVPはそもそも資格ではない
354:デフォルトの名無しさん
11/10/24 07:19:53.34
野球板でどうぞ
355:デフォルトの名無しさん
11/10/24 09:36:34.66
>>277です。Application.Volatileでも、ダメでした。
356:デフォルトの名無しさん
11/10/24 10:10:40.93
>>355
そもそも質問が意味不明
左の値ってなんだ?
なんでA4の3を30に変えるとA6の20が40になるのかも分からんし。
ユーザー定義関数なんてのは引数をきちんと渡せば、引数の変更で普通に再計算される。
Application.Volatileなんてものは書く必要なし。
そんなもの書いてる関数のほとんどは糞関数だ。
357:デフォルトの名無しさん
11/10/24 10:25:45.25
>>355
そもそも関数にSelect使っても動かんだろ?
358:デフォルトの名無しさん
11/10/24 10:32:23.54
selectは使っておりませんが、functionプロシでifを使ってます。
ユーザー定義関数でifは使えないんですか?
>なんでA4の3を30に変えるとA6の20が40になるのかも分からんし。
ユーザー定義関数で、数が変わるのを表現しました。
359:デフォルトの名無しさん
11/10/24 10:33:33.47
あと、プロシージャを標準モジュールに入れているのも、原因でしょうか。
360:デフォルトの名無しさん
11/10/24 10:44:41.45
きちんと引数を使ったら、自己解決しました。すみませんでした。
お礼に「9歳から14歳」を2ちゃんねる検索したらヌケる、この情報をお教えします。
361:デフォルトの名無しさん
11/10/24 12:28:08.39
すみません。素人です。
Sub B()
Dim i As Long
For i = 1 To 10
Cells(i, 1) = Mid(Cells(i, 11), 4, 6)
Next i
End Sub
という、A1からJ1へMIDで6文字取り出す式を立てたつもりなのですが、
なぜか結果をA列を縦に表示します。
Xにforで代入し、iが1,2,3…と変化したら、A1,B1,C1…と行方向横に表示すると思うのですが、
X値が変化して、なぜ縦に列で出るのでしょうか????
362:デフォルトの名無しさん
11/10/24 12:37:46.40
>なぜ縦に列で出るのでしょうか????
そらぁ縦に出るように指定してるからだろ w
363:デフォルトの名無しさん
11/10/24 12:45:59.69
cells(1,i)なら横に出るよ
364:デフォルトの名無しさん
11/10/24 13:07:58.71
行,列の考え方が逆
365:デフォルトの名無しさん
11/10/24 14:20:27.89
こういう、定義をあいまいなまま放置する人が6+5×3=33という計算をしちゃうのかねぇ?
366:デフォルトの名無しさん
11/10/24 14:27:46.55
>>362-364 ありがとうございます。デフォですかこれ。
Cells(y,x)と指定するんですね。
367:361
11/10/24 14:28:55.93
あれっ
6+5×3は195じゃないの?
368:デフォルトの名無しさん
11/10/24 14:56:33.92
x,yじゃなくてrow,colで考えれば自然
369:デフォルトの名無しさん
11/10/24 15:06:46.18
>>368
なぜ自然なのだ?
370:デフォルトの名無しさん
11/10/24 16:07:41.41
じゃあ自然じゃなくていいです。
371:デフォルトの名無しさん
11/10/24 19:06:42.47
>>366
これは生きている人間?
372:デフォルトの名無しさん
11/10/24 20:45:11.72
計算プログラムを作っています。
列を一次元配列にfor文で入れるところが処理速度のボトルネックだと
わかったのですが、高速で代入できる方法はありますか?
どんな方法でも構いません。
配列はdllに渡します。
373:デフォルトの名無しさん
11/10/24 20:53:34.18
Range.Valueで、Variantの二次元配列として取り出す。
自前のdllならVariantの二次元配列を直接処理できるようにすればなお良し。
374:デフォルトの名無しさん
11/10/24 21:50:49.42
>>372
Excelのバージョンは?
375:デフォルトの名無しさん
11/10/24 23:06:28.04
>>373
ありがとうございます。
試してみます。
>>374
2003です。
376:デフォルトの名無しさん
11/10/24 23:08:14.32
moji = "aaaa\nbbbb\nccccccccccc\n"
Filename = ActiveWorkbook.Path & "aaa.txt"
fileNo = FreeFile
Open Filename For Output As #fileNo
Print #fileNo, moji
Close #fileNo
こういう変数があった場合
aaaa
bbbb
ccccccccccc
みたいにテキストに改行された状態で書き出したいのですが可能でしょうか?
377:デフォルトの名無しさん
11/10/24 23:12:21.56
fileNo = FreeFile
Open Filename For Output As #fileNo
dim s as string
for each s in split(moji, vblf)
Print #fileNo, s
next
Close #fileNo
378:デフォルトの名無しさん
11/10/24 23:40:25.69
こうだろ
fileNo = FreeFile
Open Filename For Output As #fileNo
dim s as string
for each s in split(moji, "\n")
Println #fileNo, s
next
Close #fileNo
379:デフォルトの名無しさん
11/10/25 00:16:55.31
>>377-378
すみませんありがとうございます
もし宜しければ
変数内に\tがあればテキストにタブに変換されてるようにしたいです
これも教えてください。
380:デフォルトの名無しさん
11/10/25 00:20:03.11
fileNo = FreeFile
Open Filename For Output As #fileNo
dim s as string
for each s in split(moji, "\n")
Println #fileNo, replace(s, "\t", vbTab)
next
Close #fileNo
381:デフォルトの名無しさん
11/10/25 08:10:31.17
>>375
2003ならVariant変数に
a =WorksheetFunction.Transpose(列)とすればaは1オリジンの一次元配列になる。
65536行を超えることのある2007以降では怖くて使えない。
今後のことを考えると>>373のいうとおり、二次元配列を処理した方が無難かも。
382:デフォルトの名無しさん
11/10/25 13:20:07.31
2003でオンライン会議してみたいのですが、「ディレクトリサーバ」はどうするのでしょうか。
あと、エクセルで社外のネットワークを介してチャットやホワイトボードするのは今現在、一般的なのでしょうか。
383:デフォルトの名無しさん
11/10/26 12:27:58.98
テンプレから判断するとスレ違いだと分かっているのですが、他にきくべきスレが見あたらないので、ここで質問させてください。
あるオブジェクトのプロパティ(メンバ)一覧を取得するにはどうしたら良いのでしょうか?
JScript の for(in) のようなことがしたいです。
(当然ですが)直接 For Each In に渡してもだめでした。
384:デフォルトの名無しさん
11/10/26 12:54:36.28
>>383
ExcelじゃなくてAccess VBAの例だけど、応用できないかな?
URLリンク(www.accessclub.jp)
385:デフォルトの名無しさん
11/10/26 13:22:26.89
10個の連続したセルを赤から白までの
グラデーションっぽく色を変えて塗りつぶしたにのですが、
ColorIndexの数字は一つ一つ調べておくしかないですか?
赤の数字を基準に一定の数字を足すなり引くなりすると
グラデーションっぽくなるとか、そういう方法はないでしょうか?
386:デフォルトの名無しさん
11/10/26 13:52:48.38
>>385
RGB関数を使うと、色の濃さと数字がきっちり比例するようになるから簡単だよ
A1~A10に色を付けるサンプル(ただしExcel2007、2010に限る)
Sub グラデ()
For r = 1 To 10
Cells(r, 1).Interior.Color = RGB(255, r * 25.4, r * 25.4)
Next
End Sub
387:デフォルトの名無しさん
11/10/26 14:11:43.76
ありがとう。
これで楽になる
388:デフォルトの名無しさん
11/10/26 14:12:10.53
>>386は手抜き
より厳密にやるなら
r * 25.4
の部分を
Int((r - 1) * 28.4)
にすると正確に0から255までのグラデーションになる
389:デフォルトの名無しさん
11/10/26 16:54:37.93
Excel2003で、コントロール・ツールボックスからイメージを配置してピクチャーも設定しました。
そのイメージが、左クリックで選択できなくなりました。
このイメージを編集したいのですが、どのようにすればよろしいでしょうか。
390:196
11/10/26 17:22:28.07
>>389
デザインモードをオンにしたら出来ないかな?
391:デフォルトの名無しさん
11/10/26 18:18:03.41
>>389
選択モードにするとか
ツールバーの白い矢印(マウスカーソルと同じ)のアイコンをクリックね
392:デフォルトの名無しさん
11/10/26 19:22:54.69
Excel2007 グラフのソース変更の質問です
元からあるグラフのデータ範囲を変更したいのですが
SetSourceData を使って設定しようとしています
ここで、複数のデータ範囲を一つのグラフに入れたいのですが
.SetSourceData Source:=(Range(A1:E1,A3:E10))
のように、セルの名前を使った指定方法ならうまくいくのですが
Function関数などを使っているので、セルの座標をCellsで指定しなければいけません
どうしたらよいでしょうか?
393:383
11/10/26 19:40:05.57
>>384
これは行けそうです!
非常に助かりました。ありがとうございました!!
394:デフォルトの名無しさん
11/10/27 11:26:22.50
>>390>>391
デザインモードのタグも、白い矢印のタグも、Excel2003だからか、見当たりません。
395:デフォルトの名無しさん
11/10/27 12:05:24.34
>>394
Excel2000の場合ですけど、
[表示(V)] > [ツールバー(T)] と進み、
[コントロールツールボックス]にチェックを入れると
デザインモードのボタンが表示されます。
(ツールバーの余白部分で右クリックしても同様の操作が可能です。)
デザインモードにすればイメージの編集が可能でした。
396:デフォルトの名無しさん
11/10/27 12:26:02.88
解決しました。2007とレイアウトが大幅に変わってて、気付くことが多かったです。
397:デフォルトの名無しさん
11/10/27 16:07:55.38
Excel2007だけど、?なので教えてください
Formを挿入すれば参照設定で自動で
Microsoft Forms 2.0 Object Libraryにチェックが入りますけど
フォームを削除してこの参照のチェックをオフにしようとすると、
画像のようなメッセージが出てオフに出来ないっす。
一旦Excelを閉じてもう1回開いてからでも駄目でした。
要らなくなったんだから、参照しないようにしたいんですけど
URLリンク(www.dotup.org)
398:デフォルトの名無しさん
11/10/28 09:35:51.90
2003です。
たとえばa+bを計算するときに、
一度目はセル(1.1)、(1,2)を読み込んで、計算、
(1,2)の値を変更して再計算するときに、(1,1)は読み込まずに一度目に読み込んだ値を使用して計算することは可能でしょうか。
399:デフォルトの名無しさん
11/10/28 11:41:14.12
>>398
a = Cells(1, 1)
b = Cells(1, 2)
一回目 = a + b
Cells(1, 2) = 別の値
'再計算
b = Cells(1, 2)
二回目 = a + b
400:デフォルトの名無しさん
11/10/28 12:16:49.27
仕事でどうしても使わなきゃならなくなったんだけど、VBAって理不尽なエラーが多く出ないかい?
まあ、おじさん初心者が基礎をすっとばかして適当に組んでるのが原因ってのは解ってんだけどね
401:デフォルトの名無しさん
11/10/28 12:43:23.12
>>400
どんなアプリでもマクロ言語ってのはどうしてもそうなる。
それでもVBAはメジャーな分比較的きちんとしてるほう。
402:デフォルトの名無しさん
11/10/28 13:09:42.58
>>400
VBAに限らないよ
どんなプログラムでも素人が組むとエラーだらけになる
まともなアプリって、全体の半分ぐらいはエラー対策だったりするし
想定外の事態を事前にどれだけ予測してどれだけ対処できるかでプログラマーの腕がわかる
403:デフォルトの名無しさん
11/10/28 16:03:56.66
でも掲示板での質問にエラー対策が完璧な回答をしても喜ばれない。
コメントも同じ。
回答は本筋だけ示せばよい。
404:デフォルトの名無しさん
11/10/28 16:31:51.41
>>399
ありがとうございます。
staticで実現できました。
405:397
11/10/28 17:21:23.53
何方か判りませんかね~^^;
406:デフォルトの名無しさん
11/10/28 17:57:27.41
>想定外の事態を事前にどれだけ予測して
予測してたら想定外じゃないだろ
407:デフォルトの名無しさん
11/10/28 18:57:00.97
>>401
そんなもんなんですねぇ
今やっと、大体の画面作りが終わったので、これから計算や文字処理のルーチンを書いてく予定です
画面でこれだけ苦労したのに、本当に最後まで作ることができるんかいなと・・・
でもやるしかないんで、騙し騙しでも頑張るです
408:デフォルトの名無しさん
11/10/28 20:29:58.72
というか、「理不尽な」エラーなんて出た記憶がないな
409:デフォルトの名無しさん
11/10/28 20:54:19.01
理不尽なソースならいくらでもあるよ
410:デフォルトの名無しさん
11/10/28 21:08:04.44
エラー時にエラートラップされていない場合のみ止める設定の時に、
たまに数字だけのエラー表示があるのが、一寸鬱陶しくはある。
まあ、エラー時に止める設定にすれば判るから大して困りはしないが。
411:デフォルトの名無しさん
11/10/29 00:17:47.48
むしろ正常に動作していないのにエラーも何も出さないってのがMSのソフトには多いから困る
412:デフォルトの名無しさん
11/10/29 00:21:48.78
それは仕様です(キリッ
413:デフォルトの名無しさん
11/10/30 09:45:17.96
初心者です。
変数型によるメモリの使用量の違いを知りたくて
sub test()
debug.print application.memoryused
dim a as byte
a=1
debug.print application.memoryused
end sub
と byteをvariantに変更して比較したのですが使用量が変わりません。
どうしてなのでしょうか?
414:デフォルトの名無しさん
11/10/30 10:14:54.03
>>402は古いと思う
415:デフォルトの名無しさん
11/10/30 11:05:13.30
遅レスですが
>>386>>388の
25.4とか28.4という数字は、どこから出てきた数字なんでしょうか?
416:デフォルトの名無しさん
11/10/30 11:32:07.66
>>323>>328
の話にあった
With Range("A1").CurrentRegion.Rows(1)
より
With Range("A1").CurrentRegion.Resize(1)
の方が楽、というのがわからないです。どういう場合に楽なんでしょう?
可読性は前者の方が高いと思うのですが??
417:196
11/10/30 11:51:53.93
良く分からんけど、
mov ax,0
の代わりに
xor ax,ax
するようなもん。
418:デフォルトの名無しさん
11/10/30 13:25:17.86
>>416
Resizeならピリオド打つと自動メンバ表示されるがRowsは実行時バインドのItemプロパティを使ってるので自動メンバ表示されない。
With Range("A1").CurrentRegion.Rows(1)これはWith Range("A1").CurrentRegion.Rows.Item(1)の略だ。
Withでくくるときは極力Itemプロパティは使わない方がよい。
>>298も読むように。
419:416
11/10/30 13:37:49.32
>>418
非常に分かりやすい説明ありがとうございました。
「Resize」の表記で直感的に意味がわかるようになることが
良いVBA使いに至る道のようですね。
420:416
11/10/30 13:40:10.44
>>417
アセンブリ言語が良くわからないので
喩えがあまり理解できませんでしたが
回答ありがとうございました。
421:デフォルトの名無しさん
11/10/30 21:15:04.72
UserFormについて質問です。
(XP&Excel2000,2003)
複数のフォームを開閉するマクロを組立て中です。
この時、1枚目を完全に閉じた上で、2枚目のフォームを開くことはできないでしょうか。
変数受け渡しでうまくいかないかと試行中。
Google先生はLoad/Showしか教えてくれない…。
422:デフォルトの名無しさん
11/10/30 22:25:32.61
どこで困ってるのか今ひとつ良くわからない
423:421
11/10/30 23:01:29.14
普通に
Unload Me
UserForm2.show
みたいにしてもフォームが消えなかったり、
先ほど開いていたフォームを開きなおすとエラーが出る等、かな。
424:デフォルトの名無しさん
11/10/30 23:25:05.89
>>421
どんなエラー?
425:421
11/10/31 06:57:57.73
>>424
マクロ本体が無いので少し説明不足でした。申し訳有りません。
ダミーで確認してみたところ、
「既にフォームは表示されています。モーダルにできません。」でした。
CommandButtonでの操作は問題ない(ように思う)のですが、
右上の×ボタン操作を閉じた時の動作が思うように行きません。
426:デフォルトの名無しさん
11/10/31 07:38:25.66
Aフォームのボタンから別のBフォームを表示させ、その時にAフォームを消す
んで、Bフォームを消してまたAフォームを表示させる
ってことやってるけど、全然そういうエラーは出たことはない
>変数受け渡しでうまくいかないかと試行中。
フォームを開くのに変数受渡しって何?
427:421
11/10/31 09:42:21.52
>>426
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
UserFormX.Show Xは読み替えで。
End Sub
↑UserFormXが起動するので、Show以降が処理されない=閉じることができない。
だから、フォーム2の後ろにフォーム1が見えたままですし、フォーム2を閉じると上述エラーが出る。
「Me.Hide」を加えると見た目では消えている…けど途中で閉じるボタンが聞かなくなる。
そもそもHideとUnloadは役割が違う。
>>変数受け渡し
フォーム毎に変数(Public)を持たせます。
そして、閉じるときにスイッチOFFをいれつつ、フォーム管理マクロを呼び出し。
強引にフォームを閉じ、必要なフォームを開けないかと思いましたが、
結局↑と似たような感じになり断念。
フォーム数だけマクロ用意すれば変数不要な気もする。
代替案で「閉じるのはCommandButtonのみ、右上×ボタンは封印」
というのも考え中ですが、こちらで何かいい案が聞けないかなと…。
428:デフォルトの名無しさん
11/10/31 10:00:43.25
UserForm_Terminate()
に書けばいいよ
429:デフォルトの名無しさん
11/10/31 10:15:02.07
>>428
回答がお早い…。
Terminateでも同じフォーム開きなおすと、閉じるボタン聞かなくなりますねぇ。
他のボタンも動かなくなるのも同じです。
430:426
11/10/31 10:15:44.13
こっちはExcel2007
Query_Closeでやはり
既にフォームは表示されています。モーダルにできません。
というメッセージが出るね。
まぁ早い話、これを使ってのフォームの操作は諦めろってことでは?
431:デフォルトの名無しさん
11/10/31 10:30:54.52
UserFormX.Show
じゃなくて
dim f as new userformx
f.show
ってすればいいよ。
432:421
11/10/31 10:50:03.25
おぉ…完成しました。
開き方ひとつでこうも変わるものなんですね。
回答くださった方々、ありがとうございました。
少しずつですが勉強頑張ります。
433:デフォルトの名無しさん
11/10/31 20:26:14.54
このスレの趣旨と合うかどうか微妙ですが質問です。
オフィス2007使用で、会社のパソコンのマイドキュメント内に自分のフォルダを作成しそのフォルダを信頼する場所に指定して
その中で自分が直接作ったファイルのみを使用してます。この状態で他人が作ったマクロ有効ファイルを一切使わない場合、
マクロウィルスなどの被害にあう可能性はありますか?
434:デフォルトの名無しさん
11/10/31 21:39:37.48
>>433
マクロウィルス「など」ってちょっと曖昧ですね。
マクロウィルス以外の被害は想定しなくても良い前提なんですか?
まぁ、仮にエクセルのマクロウィルス限定だとしても
ほかの前提条件が不明だから可能性はゼロにはならないです。
たとえば、他人が勝手にそのPCを使って出所不明のマクロを実行してしまう。
なんてのはどうです?
ってそういう頓知を聞きたいわけじゃないですよね。
そのPCを自分以外は誰も使用しなくて、自分自身でマクロウィルスを作成・実行しない。
という前提ならエクセルのマクロウィルスの被害には遭わないです。
要は信頼する場所云々以前に出所不明のマクロを実行しないというのが肝であって
それさえ守れば後は関係ないです。(あくまでもマクロウィルス限定の話ですけれど)
435:デフォルトの名無しさん
11/10/31 22:07:49.81
あるかないかで言えば、アドオンが感染とかExcel本体が感染とか常駐型に感染とか、
マクロファイル以外にも感染ルート、可能性はいくらでもある
436:433
11/10/31 22:35:31.24
ありがとう。
いちおう自分がVBAを使い始めた事が原因で感染しなければ良いので。出所不明のマクロ使用しないですし大丈夫ですね。
会社がセキュリティソフト導入しないので、エクセル以外からの感染は仕方ない状態です。
共用してるもう一人が、俺のファイルが重すぎる、お前なんかしただろとわけわんない言いがかりをつけられてて一応自分のせいではないことを確認したかったのです。
437:デフォルトの名無しさん
11/10/31 23:56:58.15
嫌な現場だなw
そんな心配しなきゃいけない位なら
そんな所やめてしまえばいいだろうに。
438:デフォルトの名無しさん
11/11/01 00:05:05.81
>会社がセキュリティソフト導入しないので
すげぇ会社だな、ヲイ
439:デフォルトの名無しさん
11/11/01 00:08:46.05
MSEをこっそり入れとこう
440:デフォルトの名無しさん
11/11/01 03:59:10.14
本当に自分が直接作ったファイルしか使わないなら安全かもしれんが
ウィルスってのは、ファイルを書き換えたりするんだぞ
お前が作ったそのままだと思ってるファイルが実はこっそりウィルスに感染してる可能性は排除できんぞ
441:434
11/11/01 06:15:52.26
>>433
酷い職場ですね。
そんなんじゃあマクロウィルス以前に
どんなマルウェアに感染されてるか分かったもんじゃないですね。
ちなみにうちの会社だとインターネットにつながってるPCと
社内のネットワークだけにつながってるPCの2系統のネットワークがあって、
業務は社内ネットワーク上のPCでしか作業してないです。
外部記憶メディア(USBメモリなど)の使用も禁止です。
普段はそっちで仕事していて、
調べものとかがあるときだけインターネットにつながったPC使ってます。
442:デフォルトの名無しさん
11/11/01 14:06:28.11
>>441
うちもそういう構造してるけど、アップデート関係が完全に放置されてる。
隔離すればある程度安全には違いないんだが、
年1回ほど「ウイルス発見されたー もちこむなー」って言ってるよ。
443:デフォルトの名無しさん
11/11/01 14:48:13.78
>>441
IT系じゃないよね?
444:デフォルトの名無しさん
11/11/01 17:08:02.57
>年1回ほど「ウイルス発見されたー もちこむなー」って言ってるよ。
「ウイルス発見されたー ちんこもむなー」に見えた。
疲れてるな、俺。
445:434
11/11/01 19:53:43.66
>>443
ちがいます。
専門的な作業は外注しますし、
私はプログラマーとかじゃないのでVBAもろくに使えません。
でも簡単なマクロでも自分の仕事には十分役立ちます。
446:デフォルトの名無しさん
11/11/02 09:34:22.37
>>445
ウィルスって騒ぐほどの会社ならいいが。
世間一般的な(家庭レベル)セキュリティで十分な気がするけどな。
例えば、世界が認める日本企業なんかにいるんなら、そのサーバーを
ターゲットにするだろ?
一般企業でウィルス感染は、いわば社会人のモラル欠如の結果、
変なサイトにアクセスし感染って感じじゃね?だいたい一般的な
会社をターゲットにするなんて考えられない。メリットなしだ。
今のウィルスはマルウェア型で個人情報(カード情報)の抜き取り
がメインになりつつある(日経PC情報)。あまり、そこに力いれん
方が良いと思うけどな。
あとウィルスソフトのフリーも入れない会社自体も問題あるけどね!
長文すまん。むかつくやつはスルーしてくれ。
447:デフォルトの名無しさん
11/11/02 10:57:04.17
無防備なPCはそもそもネットにつなぐな
普段使うようなサイトでも改ざんされたりしてるだろ
相手のサーバがクリーンかどうかチェックできないのに
変なサイトかどうかは判断できない
448:デフォルトの名無しさん
11/11/02 14:16:05.36
>>447
>普段使うようなサイトでも改ざんされたりしてるだろ
ほんとに?
>変なサイトかどうかは判断できない
エロサイトやフリーダウンロード横行しているサイト
検証してアップいるサイトならOK。
449:デフォルトの名無しさん
11/11/02 14:17:29.21
変なサイトってここの事か?
昔ノートンが誤検知して大騒ぎした事があった
450:デフォルトの名無しさん
11/11/02 14:19:00.18
saymoveが改ざんされてたじゃまいか
451:デフォルトの名無しさん
11/11/02 15:59:02.41
>>450
saymoveは寄生型のサイト。
それを普通のサイトというのは変でないの?
452:デフォルトの名無しさん
11/11/02 19:36:59.65
読み上げについて、Excel2003です
Application.Speech.Speak Range("A1")
で文字を読み上げさせることはできたんですが、読み上げる音声(sam,kenji,naoko)を指定する方法ないですか?
コントロールパネルから設定できるのは知っていますが、VBAで制御する方法を教えてください。
453:デフォルトの名無しさん
11/11/02 20:02:24.73
読み上げについてです
コントロールパネルから読み上げる音声(sam,kenji,naoko)を設定できるそうですが
どうればよいのでしょうか?
454:デフォルトの名無しさん
11/11/02 20:39:14.89
>>452
.GetVoices().Item(n)
455:デフォルトの名無しさん
11/11/02 21:20:33.70
>>453
そのままOKボタン押せば設定されますよ
456:デフォルトの名無しさん
11/11/03 10:53:32.25
>>455
コントロールパネルのどこで?
457:デフォルトの名無しさん
11/11/03 11:46:58.15
URLリンク(www.geocities.co.jp)
コントロールパネルに「音声認識」がある場合に動作します
458:デフォルトの名無しさん
11/11/03 11:49:39.30
>>457
ニャイ場合は?
459:デフォルトの名無しさん
11/11/03 11:52:32.60
ア キ ラ メ ロ
460:デフォルトの名無しさん
11/11/03 12:09:33.23
ぃゃょ
461:デフォルトの名無しさん
11/11/03 13:38:29.29
使用ソフトexcel2003で質問です。
ある特定のフォルダにある複数のエクセルファイルから,幾つかの条件でデータを抽出し,
新規のエクセルファイルに集約するマクロを作りたいと思っています。お力を拝借いただきたいです。
○元データ
あるフォルダに顧客データファイル(氏名,都道府県,郵便番号,電話番号,性別,などが一行に並んでいる)が複数ある。
仮にファイル名「顧客1」「顧客2」……とする。
○抽出条件
例えば,氏名が「田中」または「斉藤」,かつ都道府県が「神奈川」「山梨」「鹿児島」「北海道」「沖縄」のいずれか,
かつ性別が「男」。など複数の条件
○作成ファイル
元データと同じ項目並び順で,条件に該当した顧客データを一つのエクセルファイルに収める
オートフィルタとコピペを繰り返せばよいかと思ったのですが,私の知識では複雑な条件に
対応させることができませんでした。上記の都道府県の例のように最低5つのキーワードで抽出を可能にしたいです。
どなたかそれらのコードを記述していただけませんでしょうか?
462:デフォルトの名無しさん
11/11/03 13:57:03.41
accessにするべき
463:デフォルトの名無しさん
11/11/03 15:25:20.59
>>461
こんなページが有ったよ。
参考にできるんじゃないか?
URLリンク(www.eurus.dti.ne.jp)
464:デフォルトの名無しさん
11/11/03 16:02:54.01
>>461
ExcelファイルにSQL投げればいいんじゃないかな
465:デフォルトの名無しさん
11/11/03 22:01:10.50
>>461
サンプルを用意すればそれに応じて
書いてみてもいい
466:デフォルトの名無しさん
11/11/03 22:23:55.12
データの件数によっては、VBAじゃ遅すぎて実用にならないんじゃ・・・。
467:デフォルトの名無しさん
11/11/04 03:28:43.61
元データがエクセル表だってんなら、何でやっても大差はでない気はするが
468:デフォルトの名無しさん
11/11/04 08:24:28.27
100件ぐらいまではたいした違いはないだろうけど、数千件、数万件となってくると、
一旦 CSV で出力して、Perl かなんかで処理したほうが、
CSV出力の手間を込みで見ても断然早いんじゃないかな。
469:デフォルトの名無しさん
11/11/04 09:33:12.22
ひとつのExcelファイルにまとめるスクリプトを書いてあげたよ。
URLリンク(codepad.org)
まあこれを超えるものは作れないだろう。
470:デフォルトの名無しさん
11/11/04 10:15:22.29
>>469
あなたすごいですねぇ。
こんな上級者がこのスレにいたとは!!!
471:デフォルトの名無しさん
11/11/04 11:11:46.91
そうか、code padはVBAの場合plaintextで置けば良いんだ。
472:デフォルトの名無しさん
11/11/04 11:38:07.14
>>469
何コレ。天才じゃないの?
473:デフォルトの名無しさん
11/11/04 12:18:24.35
初心者です。
アクティブセルの列番号は ActiveCell.column で取れますが、
フィルターをかけて非表示の列ができると結果が変わってきます。
フィルターをかけた状態で元の列番号を取ることはできるのでしょうか?
出来る方法があれば教えて下さい。
474:デフォルトの名無しさん
11/11/04 12:24:27.86
さすがの俺もそれは知らないなぁ
475:デフォルトの名無しさん
11/11/04 12:35:17.76
>>474
サンクスです
476:デフォルトの名無しさん
11/11/04 12:54:04.07
>>469 >>470 >>472
自演乙()
477:デフォルトの名無しさん
11/11/04 18:31:44.08
>>469
こういうのをサクッっと作れちゃう人尊敬する
478:デフォルトの名無しさん
11/11/04 21:35:16.35
IDでないんだな、それが
479:デフォルトの名無しさん
11/11/05 00:08:29.18
誰かExcel2003で下がエラーになるかどうか試してくんない?
俺は2007同様エラーになると思うんだが、エラーにならないと言ってるやつがいるもので。
Sub hage()
Dim a(1 To 65537) As Long
MsgBox WorksheetFunction.Match(0, a, 0)
End Sub
480:デフォルトの名無しさん
11/11/05 00:21:37.78
今Excelが手元にないので
481:デフォルトの名無しさん
11/11/05 09:37:23.44
>>479
Excel2000の場合だと、
Dim a(1 To 5461) As Long
までならOKで、
Dim a(1 To 5462) As Long
以上だと
実行時エラー '13':
型が一致しません。
てのが出る
482:デフォルトの名無しさん
11/11/05 11:16:59.21
>>481
トン。
2000の制限は俺も知ってたんだけど、2003は2007同様65536までじゃないのかな~。
483:デフォルトの名無しさん
11/11/05 11:45:41.27
>>482
2003でやったところ、65536だとOK
484:デフォルトの名無しさん
11/11/05 18:51:59.71
>>483
65536でOKなのは知ってるが65537じゃどうなの?
485:デフォルトの名無しさん
11/11/05 20:24:02.33
2003でやってみたけどまさかこんな結果になろうとは
486:デフォルトの名無しさん
11/11/05 20:25:29.55
65536 "だと" OKって言ってるんだから普通に考えればNGだろw
487:デフォルトの名無しさん
11/11/05 20:42:14.70
もういいわ、誰か他の人に聞きたい。
Excel2003で次のコードはエラーになる?
Sub hage()
Dim a(1 To 65537) As Long
MsgBox WorksheetFunction.Sum(a)
End Sub
488:デフォルトの名無しさん
11/11/05 20:46:58.23
2003で実行
65537:エラー
65536:OK
489:デフォルトの名無しさん
11/11/05 20:49:42.59
まぁ区切りのいい数字だわな
490:デフォルトの名無しさん
11/11/05 20:52:42.28
>>487
エラーになったらエラいこっちゃ。
491:デフォルトの名無しさん
11/11/05 21:04:48.81
>>488
サンクス。
やっぱ予想通りエラーだな。
某板だけどなんであんなウソ書くのかなぁ。
492:デフォルトの名無しさん
11/11/06 00:38:27.29
本家のVisual Basicも挑戦しようと思い本を読んでると
ExcelVBAでは A=A+1 と記述すべきところは Visual Basicでは A+=1 としないといけないみたいです。
でもこんなのイヤです。
Visual Basicでも従来どおり A=A+1 でも使用可能ですか?
493:デフォルトの名無しさん
11/11/06 00:49:34.68
さらにVisual Basicでは、標準モジュールは使わなくて、クラスモジュールを使うと書いてます(フォームモジュールもExcelVBA同様存在する)。
このクラスってなんですか?
上級向けの本ではよく出てくるので、おそらく大事だと思うんですが
ひとことでいえばどんなしくみですか?
494:デフォルトの名無しさん
11/11/06 01:20:13.48
型
495:デフォルトの名無しさん
11/11/06 01:28:29.79
型とは、長文でいえばどんなしくみですか?
496:デフォルトの名無しさん
11/11/06 01:29:32.60
>>492
使えるけど使わない。
論理演算子のAndやOrも、意味は知らなくてもいいから
Andalso、Orelseと書き換える様に。
497:デフォルトの名無しさん
11/11/06 01:32:49.84
>>479
一応だが…2010でも実行。
結果は他の人と同じだった。
>>492-494
一言どころか一文字とは。
498:デフォルトの名無しさん
11/11/06 01:35:42.91
>>493
VBの話はスレ違いなので
VBのスレ探してそこでやってください
499:デフォルトの名無しさん
11/11/06 01:43:19.62
>>495
例えば~ As Collectionとした場合、このCollectionに当る部分が型。
要するに~に当る部分が何ものなのかを定義している所。
このCollectionクラスはAddと言うメソッドを持っている。
クラスモジュールで似た様なもの作るとするならば、
Collectionと言う名をクラスモジュールに付けて、Addと言うメソッドを作る。
適当だけどこんな感じ。
スレ違いには同意なので、VB.Netスレで聞いて下さい。
500:493
11/11/06 01:54:08.04
さっぱりわからん
501:デフォルトの名無しさん
11/11/06 02:00:07.93
>>500
わからなくていいんです。
クラスってのはオブジェクト指向プログラミングの
中核を成すとても難しい概念。
そう簡単にわかってもらっちゃ、世の中のプログラマー
たちがメシを食えなくなりますんで。
502:デフォルトの名無しさん
11/11/06 08:54:58.20
わからなくて良くはないだろ。
その概念に出会って一月経ってわからん言ってる奴は
半年後もわからん言ってるよ。
そして1年後も3年後も5年後も同じこと言い続ける。
503:デフォルトの名無しさん
11/11/06 08:56:26.22
おっと、スレチへのレスだったか。突っ込まなきゃ良かった
504:デフォルトの名無しさん
11/11/06 09:01:51.18
VBA はいつまて VB6 ベースで行くんだろう?
そろそろ VB.net か C# でも書ける様にしてくれないだろうか。
505:デフォルトの名無しさん
11/11/06 10:51:32.57
C#でオブジェクト指向らしい言語にはなったが
大切なのはそれを設計に生かすこと
設計がオブジェクト指向ならVBでも十分
てか、メンテナンスに優れていて想像しやすいものならOK
506:デフォルトの名無しさん
11/11/06 11:05:38.78
>>505
>設計がオブジェクト指向ならVBでも十分
VB って今の VBA のこと言ってるの?
「書ける」と「書き易い」の違いぐらいは理解しようね。
507:デフォルトの名無しさん
11/11/06 11:14:25.39
エンドユーザー部門が使えるレベルの
マクロ・簡易言語としての側面をVBAは持つ。
本格的なクラスベースの言語になると
オブジェクト指向についての詳細な知識が必要となり
エンドユーザー部門がついてこれない。
おそらくずっとVB6レベルのままだろうし、そうでなくてはならない。
508:デフォルトの名無しさん
11/11/06 11:18:08.63
別の言い方をすれば
馬鹿でもオブジェクト指向らしくせざるを得ないのがC#
客はうんなこと分かってないから喜ぶわけだがw
509:デフォルトの名無しさん
11/11/06 11:40:05.15
>>502
じゃあ鯛焼き機の話でもしようか
510:504
11/11/06 12:01:24.06
>>507-508
いや、別に VBA を無くせといってるわけじゃないよ。
> VB.net か C# (* でも *) 書ける様に
そもそも、C# でオブジェクト指向らしくないコードなんていくらでも書けるだろ。
ひょっとして、class ってキーワードがあったらオブジェクト指向らしいとでも思ってるの? (w
511:デフォルトの名無しさん
11/11/06 12:07:25.11
>>510
いい加減スレ違いの話を続けるのはやめてくれ
512:デフォルトの名無しさん
11/11/06 12:12:05.59
あれ?
馬鹿がばれて逆切れ?(w
513:デフォルトの名無しさん
11/11/06 12:19:51.24
C#しか知らないんだろうね
ここで勉強しようよ 仲良く
514:デフォルトの名無しさん
11/11/06 12:21:03.69
ここはVBAのスレです。
そろそろ軌道修正願います。
515:デフォルトの名無しさん
11/11/06 12:29:40.65
まぁVbaにも継承こそ出来ないものの
クラスはあるんだからその話をすればいいじゃない
516:デフォルトの名無しさん
11/11/06 15:56:34.80
じゃあ行番号つけた旧BASICに則ったコード書こうぜ
517:デフォルトの名無しさん
11/11/06 16:13:24.96
>>516
旧BASICってどれだよ。N-BASIC 辺りのことか?
誰得だよw
518:デフォルトの名無しさん
11/11/06 17:35:57.95
やだなあ、先輩。Hu-Basicに決まってるじゃないですか。
519:デフォルトの名無しさん
11/11/06 17:38:45.67
いや、dbBASICかもしれんよ
520:デフォルトの名無しさん
11/11/06 17:48:44.86
ここはExcel VBA質問スレだろ?
ズレまくってるのを早く修正しる
521:デフォルトの名無しさん
11/11/06 17:57:18.44
じゃ質問よろしいかしら?
呼び出し元で例外処理を一括で行ってるとして、
呼び出し先でエラーが発生した時に処理していたセルを、
ログなどに記録したいとします。
記録先や記録方法は、よしなにするとして、
このセル情報を、どーやって保持・参照すれば良さげでしょう?
出来れば自前で保持などせず、例外オブジェクトあたりから引っ張れると素敵ですが、
そんな仕組みあったかしら?
なお当然ですが、呼び出し先で発生する例外は自前でスローするとは限りません。
522:デフォルトの名無しさん
11/11/06 17:59:39.33
tiny BASIC でスタートレックと聞いてやってきました。
523:521
11/11/06 18:08:01.49
>>521補足
擬似コードで説明するなら、下のe.getStacktrace()に代わる情報として、
処理中のセル位置情報を引っ張れたら幸せだなーと
でも、おそらけ例外オズジェクトからは取れないので
何か工夫しないとダメな悪寒。
class Caller() {
try {
new Callee().execute();
} catch (Exception e) {
log(e.getStacktrace()); //←これ相当
}
}
524:デフォルトの名無しさん
11/11/06 18:35:16.58
フォームのボタンについて
たとえば
Private Sub CommandButton1_Click()
textbox1.value=textbox1.value + 1
end sub
これをENTERで連打するとしっかり連続計算されるけどクリック連打だとダブルクリックになるのでゆっくり連打しかできない。
ダブルクリックイベントにならないようにクリックで早く連打してクリックイベントにする事は可能ですか?
525:デフォルトの名無しさん
11/11/06 18:36:36.77
ダブルクリックもクリックと同じ処理にすればいんでね?
526:デフォルトの名無しさん
11/11/06 18:38:17.42
>>523
そんなの書ける位理解してるなら
ファクトリーパターンでも使っとけ
527:523
11/11/06 18:54:22.09
>>526
生成だけハンドルすればOKならファクトリーメソッドでいんだけど、
どちらかっていうとテンプレートメソッドが近いですかね。
で、そこまではいんですけど、
今どこ処理してたの?情報は、VBAでだとどーやって引っ張ったらいいのかしらん?
という点が質問したい点なのですわ。
その情報としては実運用を考えるとセル位置とか知りたいなー
528:デフォルトの名無しさん
11/11/06 18:54:25.64
>>521
そもそもその例外はVBAのエラーであって、EXCELのエラーではないからな
それに、VBAの例外オブジェクトにスタックトレースとかなかった気もする
自分でスタックトレース相当な何か作る(当然設定も自分でする)しかないんじゃね
>>524
ダブルクリックと判定される間隔はシステムのコントロールに設定がある
つまり、アプリでどうこうしちゃいかんって事かと
とりあえずダブルクリックイベントで+2すれば?
529:524
11/11/06 19:23:46.00
ダブルクリックでも同じ処理したらいい感じになりました。エンター連打と同じぐらいスムーズには動かない
けど十分快適になりました。ありがとうございます。
530:521
11/11/06 19:51:50.89
>>528
うーん、やはりVBAの例外オブジェクトにはスタックトレース情報はないですよね。。
VBA風擬似コードで↓こんな感じにするしかないのかしらん
public sub caller()
on error resume next
callee.execute()
if error
log(ExcelContext.getInstance().getCell());
end if
end sub
class Callee
public sub execute
dim context as ExcelContext = ExcelContext.getInstance()
foreach cell in Selection
context.setCell(cell); //忘れずに呼ぶ
do本来やりたいことWith(cell)
end foreach
end sub
end class
忘れずに呼ばなきゃならない時点で
イケてない感がはんぱない。パフォーマンスも悪そう。
どなたか良いアイデアありますか?
531:デフォルトの名無しさん
11/11/06 20:39:04.45
ユーザーフォーム上のボタン名をセル上から取得するにはどうすればいいですか?
たとえばA1の値を参照して、A1が"あ"なら"あ"というボタンにする
532:521
11/11/06 20:45:15.17
Captionにセットするだけちゃうん?
533:デフォルトの名無しさん
11/11/06 21:36:47.24
Interface→implementsを使われている方にお聞きします。
今implementsにて実装しています。(勉強中…)
インターフェースクラス_インターフェース定義メソッド
の実装をしていくわけですが、実装の中で別のインターフェース定義メソッドを
呼び出す時にも インターフェース_ の接頭語みたいなのがつくので
何か違和感があります。こんなものですか?(下のサンプル参照)
インターフェース_の接頭語がつくような設計自体おかしい事ですか?
ご存じな方よろしくお願いします。
例
IAnimal
sub eat() :end sub
sub hunt() :end sub
//////
implements IAnimal
CLion
sub IAnimal_eat()
IAnimal_hunt() ←この部分の違和感
foo()
end sub
sub IAnimal_hunt()
hoge()
end sub
534:デフォルトの名無しさん
11/11/06 22:42:14.77
>>530
Calleeのプロパティとして参照する。
getInstance?シングルトン?VBAのクラスのコンストラクタってprivateに出来たっけ?
>>533
知らないけど勉強中との事なので。
もう何年もVBAやってるけどInterface使うプロジェクトは見たこと無いです。
535:521
11/11/06 23:07:20.59
>>534
あら。CalleeとかCallerとかVBAだと予約語っぽいですね。
先のコードは書きやすい命名で書いちゃいましたが、命名規約的にNGっぽいかも。
ちと勉強してきますね。レスサンクスです。
シングルトンは格納先を素直に書いたらこうかな?レベルで書いた擬似コードなので
VBAだと書けないかも。
その場合は外部からインスタンス化されたら例外投げるとかで対処する感じでしょうかね。
536:デフォルトの名無しさん
11/11/06 23:38:42.94
>533
VBAでInplementsを使って実装する時は、
たとえば533のように、Interface名_methodのように
予約語がついてしまう。
これはVBAの仕様上の問題で、ヘルプにも書いてある。
たくさんの共通する命令がある時に
命令の実装忘れがないようにできるくらいで、
VBAで活用する機会は正直あまりないと思います。
(Interfaceの多重継承も一応できますが…)
537:デフォルトの名無しさん
11/11/07 15:28:13.65
末尾再帰の最適化について質問です。
FunctionA(n As Long)
If n=0 then
FunctionA=1
Else
FunctionA=FunctionA(n-1)+FunctionB(n-1)
End if
End Function
FunctionB(n As Long)
If n=0 then
FunctionB=2
Else
FunctionB=FunctionA(n-1)+FunctionB(n-1)
End if
End Function
このように末尾で2つの関数が再帰呼び出しされている場合、どのように最適化すればよいでしょうか。
nが大きいと2の累乗でスタックに詰まれていくから重くなるのだと思います。
538:デフォルトの名無しさん
11/11/07 15:31:06.87
>>537
頭痛が痛くなるな。俺には無理。
539:デフォルトの名無しさん
11/11/07 15:38:15.47
>>529
mouseupイベントに書けばいいのでは?
540:デフォルトの名無しさん
11/11/07 17:06:56.12
Excel2007
Listbox(1行につき3列)に抽出した結果を格納して表示することを考えてるんですけど、その結果が1件のみの時は、
フォームを出した時点で選択状態にしたいと思ってます。
んで、その選択状態にするにはどのようにするんでしょうか?
541:デフォルトの名無しさん
11/11/07 17:08:03.60
selectedindexとかない?
542:デフォルトの名無しさん
11/11/07 18:00:25.53
>>533
VBAの勉強してるなら、Interfaceの事は見なかったことにして忘れた方が良い
オブジェクト指向のクラス設計勉強してるなら、ちゃんとしたオブジェクト指向言語つかった方が良い
>>537
どっかアルゴリズムのスレ探してそこで聞いた方がいいんじゃね
543:デフォルトの名無しさん
11/11/07 18:16:54.06
>>541
フォームのInitializeで
Me.LstBox1.Selected(0) = True
ででけました。㌧クス
544:デフォルトの名無しさん
11/11/07 20:31:22.81
>>537
これ、初期値のA(0)=1とB(0)=2こそ違うけど、それ以降は
A(n) = B(n) = 3*(n-1)^2 で、再帰も糞もなくないですか
545:デフォルトの名無しさん
11/11/07 22:00:47.52
例に突っ込むって馬鹿なの?
546:デフォルトの名無しさん
11/11/07 22:30:43.31
例に突っ込むとかじゃなく最適化してるじゃん
こういう再帰的な呼び出しに関して
一般的な最適化の手法ってのはないんじゃね?
547:デフォルトの名無しさん
11/11/07 22:58:23.61
なんかテスト臭いな。
何て言うか、自分の考えていた答えよりちょっとレベルの低い答えが
帰ってニヤってしたかったけど、根本から最適化されてしまって逆切れしたみたいな。
548:デフォルトの名無しさん
11/11/07 23:17:54.08
おまいらなんの話してんだよ。高卒の俺にはさっぱりわからんぞ
549:デフォルトの名無しさん
11/11/08 01:05:39.01
馬鹿には無理
550:デフォルトの名無しさん
11/11/08 03:55:30.21
あれ、飛び石で範囲指定したセルってリサイズ不可?
A列の入力されたセルを選択して右に5セル移動して更に範囲を横20に拡大したいんだけど。
Columns("A").Select
Selection.SpecialCells(xlCellTypeConstants, 23).Select
Selection.Offset(0, 5).Resize(, 20).Select
551:デフォルトの名無しさん
11/11/08 07:15:33.62
>>550
やってみりゃ分かるだろ?
For Eachでも回して処理するんだな。
552:デフォルトの名無しさん
11/11/08 07:16:45.11
書き忘れたがFor Eachはセル単位じゃなくAreas単位で処理な。
553:550
11/11/08 22:57:25.82
やっぱ無理か
changeイベントの実行範囲に指定したかったんだけどな…
554:デフォルトの名無しさん
11/11/09 00:03:03.63
sheetsとworksheets、どっち使ったらいいの?
555:デフォルトの名無しさん
11/11/09 00:28:41.37
そういう質問するうちは、worksheets を使ってればいい。
556:デフォルトの名無しさん
11/11/09 00:37:32.18
>>554
そういう質問をする内はSheetsを使っておけばいい。
対象にグラフのシートを含めてみれば分かる。
557:デフォルトの名無しさん
11/11/09 00:46:15.15
フォームコントロールとActiveXコントロールの違いは何ですか?
どう使い分けますか?
558:デフォルトの名無しさん
11/11/09 00:47:23.90
>>555-556
そういう回答をするうちは、ロムっていればいい。
ちゃんと解説できる日本語を身につけたら書き込みしてよい。
559:デフォルトの名無しさん
11/11/09 00:54:52.73
>>558
そういう突っ込みをする内は(ry
560:デフォルトの名無しさん
11/11/09 08:41:58.50
ワークシートと決まってればSheetsは間違い。
何か分からないときにSheetsを使う。
たとえば>>343の修正の>>345とか。
561:デフォルトの名無しさん
11/11/09 11:24:12.15
Activesheetだっけ、Activeworksheetだっけ、それともどっちも使えるんだっけ?
こういうどっちでもokみたいな仕様はexcel作者は即刻に止めていただきたい。
いつもとまどう。特に1か月以上ぶりにVBAを使い始めたとき。
562:デフォルトの名無しさん
11/11/09 17:15:55.07
excelの作者はちゃんと理由があって似たようなものを作ってるんだと思うんだが
問題はそれをちゃんと使い分けられないVBAプログラムの作者だろ
563:デフォルトの名無しさん
11/11/09 20:08:45.75
互換性を放棄すれば大分スマートな構造になりそうな気はする。
というか、そうなったらVBA自体確実に消されるなw
564:デフォルトの名無しさん
11/11/10 09:16:08.07
Sub test1()
Dim a as integer
Dim b as integer
a=10
b=Function test2(a)
End sub
Function test2(c as integer) as integer
test2=c*2
c=30
End function
------------------------------------------------
これを実行したあとは
a=30
b=20
c=30
になってますよね?
もし5行目をb=Function test2(a+1)にしたら
a=10
b=22
c=30
ですか?
さらに5行目をb=Function test2(a*1)にしたら
a=10
b=20
c=30
ですか?
565:デフォルトの名無しさん
11/11/10 13:10:50.31
withつこてる?
566:デフォルトの名無しさん
11/11/10 13:26:31.82
フォームコントロールとActiveXコントロールの違いは何?
どう使い分けます?
567:デフォルトの名無しさん
11/11/10 14:52:08.78
コマンドボタンに黒の左向きの三角を設定したいんだけど、
フォント名を合わせても四角が表示されてしまいます。
どうすれば設定できますか?
イメージでも良いです。
よろしくお願いします。
568:デフォルトの名無しさん
11/11/10 15:03:30.32
等式で大文字と小文字を区別するにはどうしたらいいの?
(例) If range("A1")=""Apple" thenで、A1がappleでもAPPLEでもaPPLEでも、正と判断してしまうので困っちゃうの。
569:デフォルトの名無しさん
11/11/10 15:08:18.03
そんなあほな
570:デフォルトの名無しさん
11/11/10 15:13:20.98
>>567
配置を縦にして▲を表示すればいいよ
571:デフォルトの名無しさん
11/11/10 15:19:07.49
>>568
Option Compare Text
があるんじゃない?
572:デフォルトの名無しさん
11/11/10 15:24:50.03
>570
おおおおおおおお!ありがとうございました
573:デフォルトの名無しさん
11/11/10 17:28:27.63
VBAから外部ソフトのボタンを押すプログラムを書きました。
いくつかあるボタンのうち、同じプログラムで押してはいるけど、
反応しないボタンがあります。
Ret = SendMessage(hwnd1, WM_LBUTTONDOWN, 0, 0)
Ret = SendMessage(hwnd1, WM_LBUTTONUP, 0, 0)
このプログラムでハンドルをハンドルを変えて実験すると、
きちんと反応するボタン、反応しないボタンがあるのはどう対処すればいいでしょうか?
ちなみに、ハンドルはスパイソフトでみてあっているのは確認しています。
ステップ実行でボタンがへこんで戻るのも確認しました。
Cで書いてやってみるときちんと反応します。
よろしくお願いします。
574:デフォルトの名無しさん
11/11/10 17:43:12.12
PostMessageにすればいいよ
575:デフォルトの名無しさん
11/11/10 18:22:42.16
>>573
VBAから外部ソフトを操作するのって、どういう命令を使うの?
それ実にやりたいことだから知りたい。
576:デフォルトの名無しさん
11/11/10 19:18:25.24
>>573
出来ました。
ありがとうございました。
>>575
ここでは説明できないし、自分もググりながらやってるから
間違った説明をしてしまうと思う。
VBA winapi とかでググってくれ。
大まかなことはすぐ理解できると思う。
577:デフォルトの名無しさん
11/11/10 19:26:47.69
間違えた。
>>574でした。
578:デフォルトの名無しさん
11/11/10 20:21:09.15
>>575
GUIアプリケーションって、
他のプロセスからメッセージを受け取って、その内容に応じてイベントハンドラを呼び出してるんだけど、
メッセージ送信は送信先アプリの送信先コントロールが分からないとダメで、
その識別子をウィンドウハンドルって言うよ。
SendMessageってAPIで送信出来るよ。
579:575
11/11/10 20:41:27.81
さっぱりわからん
580:デフォルトの名無しさん
11/11/10 20:56:18.21
何故、メモ帳に字が書けるか。
ボタンを押すとファイルの保存先を聞いてきて保存できるか。
まずはその仕組みのイメージだけでも理解しないと575のやりたいことは出来ないよ。
581:デフォルトの名無しさん
11/11/10 21:12:01.99
ワークブックのイベントで新しいシートを追加したら、
既存のSheet1のWorksheet_Changeのコードを追加したシート
にコピーする事は可能でしょうか?
自分なりにぐぐったところ下記の様な感じだと思うのですが
Private Sub Workbook_NewSheet(ByVal Sh As Object)
Dim VBP, Code As String
With ThisWorkbook.Sheet1.VBProject.VBComponents("Sheet1").CodeModule
Code = .Lines(1, .CountOfLines)
End With
この後はどうしたら良いのでしょうか?
582: 忍法帖【Lv=2,xxxP】
11/11/11 02:58:43.64
>>581
InsertLines メソッド を使って書き込むんだけど
コードをコピーするんじゃなくて
ワークブックの Workbook_SheetChangeイベントで
イベント処理するってのはどうなのかな?
これなら新しいシートを追加してもイベント処理対象だし
583:583
11/11/11 04:37:40.14
セル範囲をVariant変数に入れて別のセル範囲にコピーする方法についての質問です。
ただ単にコピーするだけならできたのですが、
その中の1行目と2行目を入れ替えて貼り付ける事は可能でしょうか?
ためしに以下のようなコードを書いてみましたが
「インデックスが有効範囲にありません」のエラーが出ました。
Sub test1()
Dim MyData As Variant
Dim MyTemp As Variant
MyData = ThisWorkbook.Sheets(1).Cells(1, 1).Resize(3, 5)
MyTemp = MyData(1) <-ここでエラーになる
MyData(1) = MyData(2)
MyData(2) = MyData(3)
MyData(3) = MyTemp
ThisWorkbook.Sheets(2).Cells(1, 1).Resize(3, 5) = MyData
End Sub
・・・
>>584に続きます