07/06/29 01:05:23
すみませんが、ひとつ教えてください。
階乗を計算する関数を作成したくて、
以下のようなプログラムを書いたのですが、
戻り値が0です。
なぜでしょうか?
(ちなみに、xxをkfactにすると、正常に動くようです)
ぜひ、ご回答お願いいたします。
Public Function kfact(n As Integer) As Integer
Dim i As Integer
Dim xx As Integer
i = 1
xx = 1
Do While i < n
xx = xx * i
i = i + 1
Loop
End Function
263:デフォルトの名無しさん
07/06/29 01:26:15
>>262
Public Function kfact(n As Integer) As Integer
Dim i As Integer
Dim xx As Integer
i = 1
xx = 1
Do While i < n
xx = xx * i
i = i + 1
Loop
'↓これ追加(戻り値)
kfact = xx
End Function
ちなみに階乗なら=fact()って関数あるけど
それじゃダメなん?
VBAで使うならApplication.WorksheetFunction.Fact()ね
264:デフォルトの名無しさん
07/06/29 16:35:16
>>256
わけ。特に珍しい手法ではない。
Dictionaryやfsoは便利なので結構良く使うと思う
265:デフォルトの名無しさん
07/06/29 20:11:27
エクセル2003、ウィンXPです。
以下の様なマクロを作成しました。
データの抽出後に、可視セルの値を順に特定セルに入れて、
印刷したいのですが、思った様に動作しません・・・。
どなたか、お知恵を!
Sub 抽出と印刷()
'書類作成用にデータを抽出。
'シート1のBP列がゼロで無いものを抽出。
Sheets("シート1").Columns("BP:BP").AutoFilter Field:=1, Criteria1:=">0", Operator:=xlAnd
'抽出されたリストのBP列の値をシート2のD68に順番に入れて、2枚ずつ印刷する。
‘抽出から除外された行は印刷からも除外したいので、可視セルだけで処理したい。
Dim i As Long
For i = 2 To Worksheets("シート1").Cells(Worksheets("シート1").Rows.Count, 1).End(xlUp).SpecialCells(xlCellTypeVisible).Row
Worksheets("シート2").Range("D68").Value = Worksheets("シート1").Cells(i, 1).SpecialCells(xlCellTypeVisible).Value
'印刷処理をします。
Sheets("シート2").PrintOut copies:=2, Collate:=True, preview:=True
Next i
End Sub
266:デフォルトの名無しさん
07/06/29 20:28:14
>>256,264
> これってなに?VBAから、WSHのオブジェクトを呼び出しているわけ?
正確には違う
Microsoft Scripting RuntimeはWSHのインストーラーパッケージに含まれてはいるが
Scripting.DictionaryはWSHのオブジェクトではなく、ActiveXの汎用コンポーネントに含まれるオブジェクト
WSHのオブジェクトじゃないから、WSHから使う場合もWSHのオブジェクトであるWScriptオブジェクトみたいに
いきなり使うことは出来ず、CreateObjectなどで外部参照してやる必要がある
267:デフォルトの名無しさん
07/06/29 23:03:58
ShowしたUserFormってどうやって閉じていますか?
UserForm1.Close
こんなのないよね?
Unload Meってのはいまいち分からない。不便。
268:デフォルトの名無しさん
07/06/29 23:08:07
Unload UserForm1
269:デフォルトの名無しさん
07/06/29 23:24:03
>>268
サンクス
270:デフォルトの名無しさん
07/06/29 23:25:06
>>265
どこが思ったように動作しないのか説明がないけど
抽出したあとCopy使えばいいよ
>>267
UserForm1.Hide
271:デフォルトの名無しさん
07/06/30 00:04:38
>>270
Hideは見えなくなるだけ
272:デフォルトの名無しさん
07/06/30 00:46:27
>>271
うん、でも>>268の人がもう答えてたから他のを書いた
あと一応はShowとHide、LoadとUnloadが対応になってるかなと思ってるし
273:デフォルトの名無しさん
07/06/30 01:35:58
Accessではclose使えるのに
どうしてExcelではだめなのでしょう?
274:262
07/06/30 01:50:26
263
ありがとうございます。
ワークシート関数ってオーバーフローするイメージがあるので、あんまり好きじゃないのです。
275:デフォルトの名無しさん
07/07/01 00:50:52
>>92
Application.FileSearchは削除されたよ。
以前から挙動不信だったんで、存在そのものを抹消したのだと思われ。
276:デフォルトの名無しさん
07/07/01 03:23:57
5人で30回じゃんけんをして、出した手をB~Fに書き込み、勝敗をG~Kに
書き込むマクロを短めで作りたいのですが、勝敗パターンを作る以外の方法が思いつきません。
よろしくお願いします。
277:デフォルトの名無しさん
07/07/01 04:25:41
>>276
>>16
さようなら
278:デフォルトの名無しさん
07/07/01 08:47:13
>>275
あー確かに挙動不振だな
279:デフォルトの名無しさん
07/07/01 09:19:11
置換について質問です。
以下の様にすると、"さんま"という文字列を"魚"に置換できるのですが、
"さんま"、"タイ"、"いわし"のいずれかの場合に"魚"に置換する場合はどうやって指定しますか?
Selection.Replace What:="さんま", Replacement:="魚"
280:デフォルトの名無しさん
07/07/01 09:31:10
>>279
with Selection
.Replace What:="さんま", Replacement:="魚"
.Replace What:="タイ", Replacement:="魚"
.Replace What:="いわし", Replacement:="魚"
end with
281:デフォルトの名無しさん
07/07/01 09:38:53
>280
ありがとうございます!
282:デフォルトの名無しさん
07/07/01 10:13:19
>>276
総合で訊いてる奴だよな?
283:280
07/07/01 10:20:13
>>281
ぉぃ! まさか、こんなこと訊いてるんじゃないよなぁ...と思いながら、
答えてみたんだが、解決かよ(-_-#);
284:デフォルトの名無しさん
07/07/01 10:57:24
釣りだろ
285:デフォルトの名無しさん
07/07/01 11:57:26
シートAに以下のマクロ実行するボタンがあります。
シートBを選択した状態だと問題なく動作するが、
シートAから実行するとエラーがでます。
最終的にシートA以外は不可視にしたいので、
Worksheets("シートB").select
をしたくないです。
何か良い方法有りますか?
Worksheets("シートB").Range(Cells(1, 1), Cells(100, 100)).Sort Key1:=Range("a1"), Key2:=Range("d1"), Header:=xlYes
286:デフォルトの名無しさん
07/07/01 14:11:49
Set ws = Worksheets("シートB")
With ws
.Range(.Cells(1, 1), .Cells(100, 100)).Sort Key1:=.Range("A1"), Key2:=.Range("D1"), Header:=xlYes
End With
287:デフォルトの名無しさん
07/07/01 15:26:32
>286
有難うございます。
試してみましたところ、シートBが選択された状態では動作しました。
シートAが表示された状態で実行すると、
「アプリケーション定義またはオブジェクト定義のエラーです」となります。
288:デフォルトの名無しさん
07/07/01 19:25:16
Σ(゚∀゚;) ?
289:デフォルトの名無しさん
07/07/01 19:45:48
285です。
解決しました。
Worksheets("シートB").Range(Worksheets("シートB").Cells(1, 1), Worksheets("シートB").Cells(100, 100)) _
.Sort Key1:=Worksheets("シートB").Range("a1"), Key2:=Worksheets("シートB").Range("d1"), Header:=xlYes
290:デフォルトの名無しさん
07/07/01 20:52:21
>>289
これって>>286と何が違うん?
291:デフォルトの名無しさん
07/07/01 22:42:36
Excel2003なのですが、
VBエディターで編集したマクロをリロードするための
ファンクションキーってありますでしょうか?
292:デフォルトの名無しさん
07/07/01 23:01:44
エクセルの2つのシートを比較するマクロを作っているのですが、
行と列のサイズが大きくなると処理が重くなります。
1000*256ぐらいで処理が重くなります。
これは、仕様なんでしょうか。
For i=0 To 65536
For j=0 To 256
比較
Next
Next
使われているシートの範囲を読み取るとか
範囲を設定するとかすればいいと思っています。
指摘などありましたらよろしくお願いします。
293:デフォルトの名無しさん
07/07/01 23:19:53
>>292
Dim s As Range
Set s = ActiveCell.SpecialCells(xlLastCell)
MsgBox s.Column & " " & s.Row
294:デフォルトの名無しさん
07/07/02 20:40:46
arry(あ,い,う,え,お)
を、
ExcelのセルA1~E1に
一気に貼り付ける方法てないですかね。
For文で順番に
セルA1に「あ」を入れて
セルB1に「い」を入れて…
というのは分かるんですが。
なんかもっとこう効率良いやり方ないかな。
295:デフォルトの名無しさん
07/07/02 21:05:35
>>294
おしい、そこまでいけて何故できないw
Range("A1:E1") = Array("あ","い","う","え","お")
是非感想を。
296:デフォルトの名無しさん
07/07/02 21:14:58
>>295
で、できたー!!
ありがとう。これでよかったのか…
Pasteにばっか気をとられてたわ。
297:デフォルトの名無しさん
07/07/03 00:16:07
VBAのコードを含んだブックを余所にあげたりするとき、デジタル署名とか
どうしてますか?
律儀にベリサインから買ったりしてるんでしょうか?
298:デフォルトの名無しさん
07/07/03 06:33:52
SelfCert
外に出すときは、署名壊れたとき用に対応策(向こうで再署名)を書いておく
# ソースは見られるが管理者だけなら問題なかろう
2000ならこれでOK
それ以降なら我慢して使ってもらうしか。
一応、毎回署名を確認してもらう事に…
既に署名を持っているならともかく、予算的にExcelの為に申請なんて出せないし。
299:デフォルトの名無しさん
07/07/03 09:15:58
売る場合はともかく、あげる場合は向こうで勝手に対応してもらう
300:デフォルトの名無しさん
07/07/03 11:31:57
Set objIE = CreateObject("InternetExplorer.application")
で、IEを起動しています。
なんらかの操作で、IEのウインドウが最小化された場合に備えて、それを「元のサイズに戻す」の
処理を行いたいのです。
検索してみたところ、VBでは、SW_SHOWNA の利用で良いみたいですが、
同様の処理をVBAで行いたいのです。
ojbIEに対して処理を加える方法は無いでしょうか?
他に考えたのは、API32を参照しobjIEとは関係なく処理を行うですが、そうした方が良いのでしょうか?
よろしく御願いします。
301:デフォルトの名無しさん
07/07/03 12:10:35
>>300
>>16
302:デフォルトの名無しさん
07/07/03 12:41:01
厳しいなあw
303:300
07/07/03 16:21:57
Declare Function ShowWindow Lib "user32.dll" (ByVal hWnd As Long, ByVal nCmdShow As Long) As Long
If objIE.Top < 0 Then
ShowWindow objIE.hWnd, 9 'SW_RESTORE アクティブにもなる。
End If
で解決しました。objIE.Top < 0 は怪しいですが、良しとします。
304:デフォルトの名無しさん
07/07/03 18:42:33
>>295
それ、A1:E1ならできるけど
A1:A5だとうまくいかない。なんでだろ?
305:デフォルトの名無しさん
07/07/03 20:17:56
>>302
× スレ違い指摘が厳しい
○ 質問者がVBAの範疇を理解してない
306:デフォルトの名無しさん
07/07/04 17:34:35
VBAというか、プログラミングの初心者です。
変数のスコープ(有効範囲?)のことでハマッっています。
UserForm1のなかの冒頭でPublicとして宣言した変数aの値を
(この値は同じくUserForm1内にPublicとして記述されたプロシージャによって代入される)
UserForm2のなかのプロシージャ内でmsgbox(a)として表示しようとするのですが、
値が空白になってなにも表示されません。
UserForm1 UserForm2のすべてのプロシージャをPublicにしても同じです。
こんなボケに対する、どなたかツッコミをお願いします。
307:デフォルトの名無しさん
07/07/04 17:47:03
Msgbox(UserForm1.a)
理由:ユーザフォームはモジュールではなくクラスだから
308:304
07/07/04 19:03:53
自己解決。
これでいけた。
Range("A1:A5") = Application.Transpose(Array("あ", "い", "う", "え", "お"))
309:306
07/07/04 22:42:37
>>307
助言くださったとおり、うまくいきました。理由を書いてくださったのがヒントになり、
Public変数をUserFormではなく標準モジュールのほうで宣言すればいいことに
気がつきました。どうも有難うございました。
310:デフォルトの名無しさん
07/07/05 12:37:25
>Public変数をUserFormではなく標準モジュールのほうで宣言すればいい
死ね
311:デフォルトの名無しさん
07/07/05 21:18:05
あの子ったら、また私のパンティを……。
息子の康彦を学校へ送りだし、洗濯にかかろうとした美沙緒は、
洗濯機のなかに無造作に放りこまれた自分のパンティを見て、大きく溜め息をついた。
困ったわ。どうすればいいのかしら?……
パンティを手に持ったまま、美沙緒は考えこんでしまった。
康彦は十四歳の中学二年生。七つ年上のいまの夫と大恋愛に落ちた美沙緒が、
周囲の猛反対を押しきって、十八歳のときに産んだ子だ。
その康彦の不可解な行動に美沙緒が最初に気づいたのは、もう一年近くも前のことになる。
312:デフォルトの名無しさん
07/07/05 21:23:27
小学生の頃、同じクラスのヤシんちに行った。ソイツの姉ちゃんは高校生でキレイだった。
化粧してるのをボケーと見てた。
「何で見てるの?」
やさーしく微笑んでくれた。
「ち、ちゅーしたい!」
おいら、とっさに言った。
姉ちゃん、頭なぜなぜして、オデコにちゅーしてくれた。
「口紅ついちゃったわね」
コットンでキレイにしてくれた。
おいら、コットンを奪って逃げた。
次の日、姉ちゃんに告った。
「お姉ちゃん、彼氏いるの」
おいら「ならば、貴様を殺して永遠に我と共に」
姉ちゃん「よかろう。来るが良い」
虚空を突き破る轟音。空気を切り裂く甲高い音。
おいらの口から鮮血があふれ出す。
おいらの拳は僅かに届かず、逆に手刀が胸に突き刺さっている。崩れ落ちるおいら。
おいら「・・・これで、貴様は俺を忘れないだろう。ぐ・・」
姉ちゃん「忘れはせぬ。貴様の魂我が心と共に。悲しき男よ。誰よりも愛深く、拳でしか愛を語れぬゆえに」
死してなおその男の顔に浮かぶ表情は喜びであったか悲しみであったか。
その時、一陣の風が吹いた。
愛に死んだ修羅の魂を運び去るように。
313::
07/07/06 22:24:01
00年 01年 02年 03年
売上高
キャベツ 500 400 300 200
ニンジン 600 300 400 500
トマト 400 400 500 400
レタス 300 500 600 300
年代別に最も多い売上高の野菜を調べるためのアルゴリズムってどうすればいいんですか?
上の例で言うと00年の売上高がもっとも高いのはニンジンなのでマクロをつかって00年
ニンジン、01年レタスというようにセルに順番に出していきたいんですがどうすればいいんで
しょうか?
314:デフォルトの名無しさん
07/07/06 23:04:40
>>313
VBAを使うまでもない。よってスレ違い。
315:デフォルトの名無しさん
07/07/06 23:18:00
>>310
>死ね
って、どういう意味ですか?
316:デフォルトの名無しさん
07/07/06 23:24:52
>>315
つ[辞書]
つ[goo.ne.jp]
317::
07/07/07 01:04:04
>>314
課題でどうしてもVBAを使ってやらないとだめなんです。
まだはじめたばかりで普通にやったほうが早いんですけど。
せめてどのような文法を使ったらいいのかだけでも教えてもらえませんか?
318:デフォルトの名無しさん
07/07/07 01:54:03
>>317
ここは宿題スレじゃない
319:デフォルトの名無しさん
07/07/07 11:55:37
00年 01年 02年 03年
売上高
キャベツ 500 400 300 200
ニンジン 600 300 400 500
トマト 400 400 500 400
レタス 300 500 600 300
ニンジン レタス レタス ニンジン
320:>314
07/07/07 14:28:49
Sub CHEATFROM2CH()
For c = 2 To 5
val1 = 0
val2 = ""
For r = 2 To 5
If Cells(r, c) > val1 Then
val1 = Cells(r, c)
val2 = Cells(r, 1)
ElseIf Cells(r, c) = val1 Then
val1 = val1
val2 = val2 & "と" & Cells(r, 1)
ElseIf Cells(r, c) < val1 Then
val1 = val1
val2 = val2
End If
Next r
Cells(12, c) = val1 & "円の" & val2
Next c
End Sub
もっと削れるけど、このままの方がわかり易くていいだろ…
321:デフォルトの名無しさん
07/07/07 16:26:12
シート2に顧客番号と名前のリストを置いて、
シート1のA1に、例えば「10」と入力した時にそれに対応するシート2の
顧客番号10番の名前を、シート1のA2に表示させたいんですが。
初心者の俺でもできるかなと思いましたが分かりませんでした。 orz
よろしくお願いいたします。
322:デフォルトの名無しさん
07/07/07 16:56:22
>>321
それを何故VBAでやりたい?
シートだけでできるっしょ。
323:デフォルトの名無しさん
07/07/07 17:06:56
B列にhh:mm:ss形式で入っている時刻をまず文字列(’シングルクォーテーションをいれるみたいなイメージなんですが)にして、
次にA列の文字列と連結してC列に表示していきたいのですが、
B列のhh:mm:ss形式をそのままの形で文字列にするにはどうすればよいのでしょうか?
324:デフォルトの名無しさん
07/07/07 17:28:31
しょうがねぇなぁ……
手元にOpenOfficeしかないから適当に読み替えて試してくれ。
>>321
顧客番号がA列、名前がB列として、
A2
=vlookup(a1;シート2.a1:b9999;2)
>>323
C5
=a5&text(b5;"hh:mm:ss")
325:321
07/07/07 17:59:42
>>324
早速のレスありがとうございました!
試してみてエラーが出たので悩みましたが、
=VLOOKUP(A1,Sheet2!A1:B9999,2,TRUE)
でうまくできました!
2人でやっているお店で店長が入院してしまい、自分1人ですべてこなすために
手書きでやっていた部分の仕事をどうしても合理化しなくてはいけなかったので
とても助かりました。ありがとうございました。
326:321
07/07/07 18:56:36
すみません、追加で質問させてください。
顧客が9999人だった時に、10000以上の数字を誤入力してしまうと
9999番目の人が表示されてしまいます。データの入力規則で縛ろうにも、
毎日顧客は増えていきますのでその度に手直しできません。
良い知恵がありましたらよろしくお願いいたします。
327:デフォルトの名無しさん
07/07/07 18:57:55
数式を穴があくまで見つづけろボケ
328::
07/07/07 22:05:29
>>320
まじでありがとうございます。
自分もこんなふうにできるようになりたいです
329:デフォルトの名無しさん
07/07/07 22:09:53
>>328
1週間くらい勉強すれば、このくらい出来るようになるよ
330::
07/07/07 22:29:29
お世辞だよ
331:デフォルトの名無しさん
07/07/07 22:44:56
初心者なのですが、質問させて下さい。
環境はWinXP+Excel2003です。
VBAでFor文を使ったネスト構造を作っています。
3階層のネスト構造の場合、
各変数x,y,zとして以下のロジックを作ってみました。
For i = 1 to 3
For j = 1 to 3
if i = j then exit for
For k = 1 to 3
if j =k then exit for
if k=i then exit for
<処理>
Next k
Next j
Next i
期待としては、同じ数が出たときだけスルーするロジックになって欲しかったのですが。
実際には、そうはならず、9パターン中、1-2-3と1-3-2と2-1-3と2-3-1と3-1-2と3-2-1の
6パターン処理されるつもりだったのに、2-3-1と3-2-1の2パターンしか処理されませんでした。
ロジックのどこがおかしいのでしょうか。
おそらく、exit for の設定を私が判っていないせいの様な気がするのですが…
332:デフォルトの名無しさん
07/07/07 23:03:30
そりゃぁ、exitでforから抜けちゃってるからねぇ。
333:デフォルトの名無しさん
07/07/07 23:06:37
うすうす気付いてるようだけど、ループのスキップではなく、ループの終了(Exit For)をしてるから
1=1でExit Forすると、以後の2~3は処理されない
For i = 1 To 3
If i = 1 Then Exit For
Debug.Print i
Next i
で、2と3が出力されませんと言ってるようなもの
一致条件でExitではなく、不一致条件内に内部ループや処理を置けばいい
334:デフォルトの名無しさん
07/07/07 23:32:36
>>332
>>333
迅速なレスをありがとうございました。
やはり、Exit Forが悪いと言うことで、
当該部分を削除し、以下のように変更したところ、期待通りの結果が出来ました。
if i = j then
elseif j = k then
elseif i = k then
else
<処理>
endif
適切なヒントを下さり、本当にありがとうございました。
335:>326
07/07/08 01:15:38
引数に"TRUE"を使うからそうなる。
"TRUE"だと完全一致しなくてもデータを読んでしまうので
"FALSE"(完全一致必須)にするのが一般的
蛇足すると、Sheet2がデータ専用なら行数を限定する必要は無い
VLOOKUPのデータ元参照式には、参照範囲のズレを防ぐため普通$を付ける。
てことでこんなんが妥当かな。
=VLOOKUP(A1,Sheet2!$A:$B,2,FALSE)
ところでここVBAスレなんだけど…
336:321
07/07/08 02:56:27
>>335
詳しく解説していただき本当に感謝です。
正直、TRUEやFALSEの意味もろくに分かっていなかった自分です。
スレタイだけ見てここで質問してしまい、大変お邪魔しました。
337:デフォルトの名無しさん
07/07/08 07:08:08
>>335
ExcelとVBAの質問スレらしいよ
338:デフォルトの名無しさん
07/07/08 07:55:16
×ExcelとVBAの質問スレ
○ExcelのVBAの質問スレ
例えスレ立て主の意図が前者だろうと、2chの規則的には
プログラム技術板でExcelのVBA以外の話は板違いになるからね
339:デフォルトの名無しさん
07/07/08 11:08:17
すこしスレ違いだが、皆さん大丈夫?
URLリンク(itpro.nikkeibp.co.jp)
Excelレガシー問題
340:デフォルトの名無しさん
07/07/08 12:02:44
SOXで大変なのは全体最適を考えてこなかった
その記事で言う情報システム部門の方なんじゃね?
未だ運用もはっきりしないのにあと半年少々でどうするんだろ。
341:デフォルトの名無しさん
07/07/08 15:40:12
80以下なら赤
90以下なら黄色
100以下なら緑
といったようにセルに入力された値によって
背景色が変わるという列を作りたいのですが
どうすればいいのでしょうか?
342:デフォルトの名無しさん
07/07/08 16:35:29
それをVBAでしたいの?
そうでなければスレ違い。条件付き書式ググれ。
343:デフォルトの名無しさん
07/07/08 16:57:28
現在、Excelファイルが60,000ファイルほどあります。
その全ファイルから、一部分(一番上の5行ほど)だけ別のエクセルファイルにコピーするロジックを作りました。
ロジックの概要は以下の通りです。
処理の内容としては、すでに開いているブックから他のブックを開いて、必要な部分をコピー後にクローズさせています。
Set wb2 = Workbooks.Open(Filename:="aaa.xls")
Set ws2 = wb2.Worksheets("Sheet1")
<処理>
ActiveWorkbook.Close saveChanges:=False
Set newbook = Nothing
上のロジックでコピーを行っていると、最初の1,000ファイルぐらいはサクサクオープン/クローズの処理が出来るのですが、
段々オープン/クローズの時間が遅くなってきて、最期は「xxx.xlsはファイルが読み取り専用か、読み取り専用フォルダにあります(略)」
と表示され、ファイルオープンが出来なくなります。
なお、エラーが出るファイルも、一回Excelを閉じると、正常に表示できるので、ファイルが壊れているわけではなさそうです。
この場合、問題の原因がVbaなのか、ハードウェアなのか、OSなのかよく分かりません。
もし何かご存じのことがありましたら、教えていただけませんでしょうか。
344:デフォルトの名無しさん
07/07/08 19:15:00
問題の原因はおまえのプログラム
345:デフォルトの名無しさん
07/07/08 21:04:23
>>343
お望みのことでなくて、恐縮ですけど、
60,000個のファイルから、それぞれ5行を別のエクセルファイルに
コピーしていくと、300,000行になりますよ。
エクセルって、65,536行までないですけど...
それに、何万行もあるファイルの操作は、それだけで、
処理がのろのろ...になるのは、避けようが無いと思ふ...
346:デフォルトの名無しさん
07/07/08 21:41:41
大丈夫、今のExcelはもっと長い。
それはさておき、5行ずつ選択して選択範囲だけcsvで保存して、後でまとめてマージってのはどうだろう。
347:デフォルトの名無しさん
07/07/09 00:32:33
>>344
その可能性が高いとは思うのですが、どうも納得できない部分もあります。
具体的な原因をお教えいただけますか?
>>345
私の説明が悪くて申し訳ないです。
実際には、5行分の内容を配列でまとめて、1行に流し込んでいます。
そのため、実際には1ファイル1行のサイズでコピーをしています。
ご指摘のあったとおり、確かに全てをコピーすると行が足りなくなる可能性が有ります。
私が欲しいデータは、全データ中の一番上と一番下の部分だけなので、
レスを頂いた後で、if文で一番上と一番下だけコピーするようにしたら、コピー行はほとんど無くなりました。
けれど、やはり1000ファイルを超えた当たりから、読み込みが遅くなり、
最期に読み込みエラーが出てきてしまいます。
>>346
おっしゃられるとおり、CSVにした方が良いのかも知れません。
とはいうものの、気になる問題が二つあります。
一つは、範囲指定をした上でCSV形式で保存する方法を私が知らないことと、
もう一つは、VBAでCSVファイルを大量に読み込んで加工できるかどうか、
また、数千ファイルを読み込んだ時点でエラーが発生するかも知れないという不安です。
難易度はどれくらいでしょうか?
348:デフォルトの名無しさん
07/07/09 01:23:02
>>347
ひとつのsheetにまとめるかわりにcsv形式でまとめる
openとwrite使えばOK
エラーの原因はリソースを食いつぶすからだろ
おそらくこれでだいぶリソースの使用が減ると思うが
全部処理できるかはわからない
349:デフォルトの名無しさん
07/07/09 07:11:07
> 一つは、範囲指定をした上でCSV形式で保存する方法を私が知らないことと、
知らなければ勉強すればいいだけ。生まれたときからこの世の全てを知ってる人間なんて居ない。
> もう一つは、VBAでCSVファイルを大量に読み込んで加工できるかどうか、
問題ない。
以前約 6'140'000 個のcsvを扱ったことがある。(時間は掛かったけど、放置して置いたらエラーも出ずに無事完了)
キミが扱う 60,000 個程度ならなんてことないはず。
当然csvはExcelにブックとして開かせるんじゃなくて、348も言ってるように直接ファイルにアクセスすること。
それについても解らなければ勉強しよう。
難易度は「入門者→初心者」の移行レベルくらい
これが出来たら、VBA入門者(門を潜っただけ)ではなくVBA初心者(初歩的なことなら出来る)を名乗っても良い
350:デフォルトの名無しさん
07/07/09 10:13:29
>>343
newbookは開放してるけど、wb2やws2は開放しないのか?
351:デフォルトの名無しさん
07/07/09 19:34:56
Excel2003でユーザフォームをもちいて抽出フォームを作成しているのですが
コマンドボタンを押すと
配列(多次元)のデータをユーザフォーム上に表示させるには
どのパーツを使えばいいのでしょうか?
352:デフォルトの名無しさん
07/07/09 20:59:27
>>351
Grid系
353:デフォルトの名無しさん
07/07/09 21:42:18
>>352
Webで検索してもあまり情報が出てこないのですが
オススメな参考書とかありますか?
354:デフォルトの名無しさん
07/07/09 22:01:16
>>351
listbox
355:デフォルトの名無しさん
07/07/09 23:21:22
>>348
>>349
レスをありがとうございました。
今日、超巨大書店でVBAの辞典を買って来て、OPENとかCSV形式での保存方法を勉強しました。
おかげさまで、今バックグラウンドでエクセルファイルをCSVファイルに変換するマクロ流してます。
23:15の時点で5,000ファイルほど変換できました。
変換スピードはあまり落ちていないので、余計なリソースを食うアプリを立ち上げないようにしておけば、
何とか最期まで行けるかも知れないと思い始めました。
で、今気がついたんだけど、エクセルのファイル数が実は600,000ファイルだったw
ぶっ続けで処理を流しても4日位、電源OFFの時間を考えれば1週間位かかりそうです。
CSVファイルを読み込むのも出来ましたので、まだ問題はいくつか残ってますが、
何とか頑張れば出来そうな光明が見えてきました。
プライベートPC上でやっていると(今はホットゾヌ上から書いていますが)あちこちのアプリも重くなるので、
折を見て、変換&計算処理専用のマシンを購入した方が良いのかも知れないと思い始めました。
色々とヒントを下さって、ありがとうございました。
356:デフォルトの名無しさん
07/07/09 23:45:14
VBAはvariant使わずにきちんと宣言するのとしないのでは実行時間がかなり違ってくるよね。
膨大な処理をするときは1ファイルあたりの処理時間をきちんと計ってコードを組むとかなり早くなったよ。
10倍ぐらいは変わった。
357:デフォルトの名無しさん
07/07/10 01:06:57
Sub JoinTime()
Cells(2, 3) = Cells(2, 1) & Text(Cells(2, 2), "hh:mm:ss")
End Sub
これを実行すると、
「コンパイルエラー::Sub またはFunctionが定義されていません。」
とエラーが出てしまいます。
どう対処すればよろしいでしょうか?
358:デフォルトの名無しさん
07/07/10 01:17:06
>>357
↓を付け足す
Function Text(a, b)
Text = Format(a, b)
End Function
359:デフォルトの名無しさん
07/07/10 01:25:40
>>358
できました。
すばやい、レスありがとうございました。
360:デフォルトの名無しさん
07/07/10 01:34:50
超初心者の質問で申し訳ないです。。
VBAを使って、画面に表示された方向キー(↑↓←→)を押して、1分間にどれだけ成功できるか・・・
のような感じのゲームを作ることはできないものでしょうか?
頭の中でふと浮かんだのですが、プログラムを組もうとすると進めなくて困っています。
もしわかる方おりましたら、可能か不可能かだけでも結構ですので教えてくださいm(_ _)m
361:デフォルトの名無しさん
07/07/10 01:42:30
>>360
URLリンク(cgi30.plala.or.jp)
362:デフォルトの名無しさん
07/07/10 01:48:41
>>361
誘導ありがとうございます。
スレ違いでした。失礼しました。
363:デフォルトの名無しさん
07/07/10 11:57:18
>>361
スレチだが、そこのCell雀の完成度の高さにびっくりした。
364:デフォルトの名無しさん
07/07/10 22:35:57
ExcelとVBAでマインスイーパー作ったりできますか
365:デフォルトの名無しさん
07/07/10 22:39:42
やる気と根気があればできるはず
がんばれ
366:デフォルトの名無しさん
07/07/10 23:20:05
暇で作った事あるけど同等のゲームならすぐ出来るよ。
UIまでコピーしようと思うとそれなりに大変だろうけど。
367:デフォルトの名無しさん
07/07/11 00:10:18
>>339
excelをそのまま基幹で使う会社
なぞ、どうぞ逝ってくれ
368:デフォルトの名無しさん
07/07/11 18:47:02
medianをVBAで使ってたら特定の数列で無限ループしやがるorz
しかも同じ数列単体で検証しても問題なし
しょうがないからロジックくんだがこんな経験したことある人いる?
XPでも2003でも再現した
数列ったってこんなんだぞ。0, 0, 0.6, 0
369:デフォルトの名無しさん
07/07/11 21:55:59
携帯から失礼します。
VBAはユーザーフォームを勉強し始めたレベルなのですが
Win32 API の存在を知り、エラー音とかに使ってみたくなりました。
具体的にどのように記述すれば良いでしょう?
ご教授いただけますか?
370:デフォルトの名無しさん
07/07/11 22:31:45
>>369
スレ違いもここまで来るか…
スレリンク(tech板)
嫌味ではなくVBAを勉強し始めたレベルでは意味不明だと思われ。
ざっと教授するだけで数百ページの本になる。
371:デフォルトの名無しさん
07/07/11 22:48:02
mciくらいならVBAでもすぐできるだろうに
372:デフォルトの名無しさん
07/07/11 23:10:39
ハマりました~どなたか助けてください~(´Д`;)
開発環境:
Windows 2000, Excel 2000
要件:
ダイアログ(フォーム)を使い、フォルダ名で、または新しいファイル名で、
後に使うファイル保存先パスを取得、変数に格納しておきたい。
追加事項:
保存先を指定してパスを取得するだけで、その時点ではファイルを開かない。
そこで、DialogオブジェクトやFileDialogについて調べているのですが…
・今一般的で情報の多いApplication.FileDialogは、2000にはないっぽい。
・MSDNでは、Dialogオブジェクトについての説明が極端に少ないっぽい。
・xlOpenFileでは、実現できないっぽい。xl~定数は使えたり使えなかったり。
等などで、どっぷりハマッてしまいました。
タスケテー
373:デフォルトの名無しさん
07/07/11 23:28:36
>>372
ちょっと邪道だけどこんなのでどうかな?
動いたらBrowseForFolderのオプションは調べてくれ。
Dim Shell
Dim Ret
Set Shell = CreateObject("Shell.Application")
Set Ret = Shell.BrowseForFolder(0, "選ばないか", 0)
If Not Ret Is Nothing Then
Debug.Print Ret.Items.Item.Path
End If
374:デフォルトの名無しさん
07/07/12 11:54:13
ごめん
範囲Aと範囲Bの重なっているセルの取得って
どうやるんだっけ?
プロパティかなんかであった気がしたんだけど
ヘルプ見てもみつからなかった(´・ω・`)
375:デフォルトの名無しさん
07/07/12 13:22:36
>>374
Intersect(範囲A,範囲B)
376:374
07/07/12 13:38:04
>>375
おぉありがとん(`・ω・´)
377:デフォルトの名無しさん
07/07/12 22:58:16
>>373
遅ればせながらレスありが㌧(・∀・)
なんか、GetSaveAsFileNameっていうまんま直球どストレートな
メソッド発見しますた~お騒がせしました~
378:デフォルトの名無しさん
07/07/12 23:35:57
Sub Bound()
ActiveSheet.UsedRange.Clear
Columns("A:AO").ColumnWidth = 2
n = 1
Range("A1").Select
Do While IsEmpty(ActiveCell.Offset(n, 0))
x = ActiveCell.Offset(n, 0).Row
If x < 2 Or 30 < x Then n = -n
For chien = 1 To 30
ActiveCell = ""
ActiveCell.Offset(n, 0) = "○"
Next chien
ActiveCell.Offset(n, 0).Activate
Loop
End Sub
上下運動を2回繰り返して止めるにはどうしたらよいでしょうか?
ご教授願います。
379:デフォルトの名無しさん
07/07/13 00:11:06
exit do
380:デフォルトの名無しさん
07/07/13 00:36:18
378です。
どういう風に入れたら良いでしょうか?
すみません、宜しくお願いいたします。
381:デフォルトの名無しさん
07/07/13 02:19:26
>>378
なにげに試したら楽しくなってきたので俺も適当に作ってみた
'API
Private Declare Sub Sleep Lib "KERNEL32.dll" (ByVal dwMilliseconds As Long)
Const UpperBound As Long = 2 '1以下はエラー
Const LowerBound As Long = 30
Const SleepTime As Long = 50
Const ico As String = "○" 'バウンドさせる文字
Const Col As Long = 1 '列(この辺は定数にしない方が斜めとかいけるから指定しない方が良さげ)
Private Sub Down(ByVal Speed As Long)
Dim r As Long
For r = UpperBound To LowerBound
Cells(r - 1, Col) = ""
Cells(r, Col) = ico
DoEvents
Sleep SleepTime + Speed
Next
End Sub
Private Sub Up(ByVal Speed As Long)
Dim r As Long
For r = LowerBound To UpperBound Step -1
Cells(r + 1, 1) = ""
Cells(r, Col) = ico
DoEvents
Sleep SleepTime + Speed
Next
End Sub
382:381の続き
07/07/13 02:33:11
Private Sub bound2()
Dim BoundCount As Long
For BoundCount = 1 To 10
Down -(BoundCount * 4)
'Downで表示されっばなのを削除
Cells(LowerBound, Col) = ""
Up -(BoundCount * 4)
'Downで表示されっばなのを削除
Cells(UpperBound, Col) = ""
Next
End Sub
updownの引数で加速と減速可能にっ!
この調子でいけばブロック崩しとかできんのかね?
で、378の質問に全く答えない俺w
なんてのは可愛そうなんで、
>>380
上下した時に「1回上下したとカウント」して
カウントが2になったらExit Doすればok
どこで1回上下したかを判断する場所は
自分でコード組んだならわかるっしょ?
383:デフォルトの名無しさん
07/07/13 09:46:41
>>381さん・・・
>378です。
学校の課題で・・・
for nextを使用して動いたマス目で2回動いた事にしていたのですが、
それでは不十分と言う事で・・・(TT)
試行錯誤して早7日目・・・
どうしようもなく、皆様にお知恵を拝借しようとした次第です。
宜しければ教えて下さいませ。
384:デフォルトの名無しさん
07/07/13 10:30:54
不十分の意味がわからない、どうしたいんだ
385:デフォルトの名無しさん
07/07/13 11:28:40
>>383
>If x < 2 Or 30 < x Then n = -n
反転の判定をしている、ここで処理してもらいたかったんじゃないのか?
386:384
07/07/13 14:36:56
俺は>>381じゃないが、そういうことならこれで
If x < 2 Or 30 < x Then n = -n: i = i + 1
If i > 3 Then Exit Do
387:デフォルトの名無しさん
07/07/13 20:01:34
会社での昼休み、
ウイルスバスターが動いててすごく重いけど、
どうしても直したいマクロがあって、開いていじってた。
PCがフリーズした。
PCの電源を切って再起動したら、マクロもろともExcelファイルが破損してた。
「アプリケーションの回復」でも回復できない、深刻な破損との事。修復不可能。
こういう時に限ってバックアップとってない。
マクロもエクスポートしてない。
仕方ないので、いちから作り直した。
バックアップは、きちんと取りましょうという教訓でした…
388:デフォルトの名無しさん
07/07/13 21:53:28
教訓というか初心者以外では常識だよね
というか、うちでは世代別バックアップを取るマクロをExcel起動と同時に自動で回しっぱなし
\backup\yyyy_mm_dd\FileName\[yyyy_mm_dd-hh_mm__ss]FileName.xls
にバックアップが自動保存され、前日以前の物があれば日付単位で個別圧縮(cab)して
退避ディレクトリにコピー、更に1週間以上前の物は退避ディレクトリの書庫は残して
バックアップディレクトリのファイルは削除
ここまでは自動で、退避ディレクトリの書庫を定期的にメディアに焼くのだけは手動
まあメディアに焼いたところで、トラブル時もHDD上の1週間分だけで復旧は事足りることがほとんどだけどね
389:デフォルトの名無しさん
07/07/13 21:55:37
FolderShareをつかって他のパソコンと同期させておくだけでも最低限のバックアップにはなると思う。
390:デフォルトの名無しさん
07/07/13 22:24:26
俺はソフトで差分バックアップしてる
重要なデータExcelだけじゃないし楽だし早い
391:デフォルトの名無しさん
07/07/13 23:27:17
>>381さん
>>386さん
>378です。
ご教授頂き有難うございます。
>>386さんのを使用して出させて頂きました。
有難うございました!
392:デフォルトの名無しさん
07/07/14 09:54:31
>>390
外部からだと作業の途中経過のバックアップは取れないからな
問題が起きたときに前回保存時まで戻されるのは勘弁してほしいってデータは
外部の汎用バックアップソフトではなく、内部のマクロで途中経過のバックアップを取った方がいい
393:デフォルトの名無しさん
07/07/14 12:56:32
バックアップとは言え、マクロ動かしっぱなしにしてたらメモリ食わない?
394:デフォルトの名無しさん
07/07/14 13:32:56
>>392
俺の使ってるソフト、圧縮機能はない
URLリンク(www.forest.impress.co.jp)
開いているファイルでもバックアップできるし作業途中で保存していればその分更新される
Officeのように自動保存機能があるソフトならより万全
途中経過が保存される前にPC固まったら駄目だけど、そのマクロも同じだろ?
395:デフォルトの名無しさん
07/07/14 18:04:44
>>393
当然食うよ
搭載メモリ量の10000分の1以下だから気にならないけどね
>>394
マクロの場合
> 作業途中で保存していれば
なんて条件は付かない
保存もマクロでやるからね
Officeの自動保存機能はバグあるし
396:デフォルトの名無しさん
07/07/15 10:15:02
VBA画面だとスクロールボタンが使えなくて不便だな。
ぐぐったら「Intelipoint 4.1を入れると直る」と出てきたけど、
うちのMicrosoftマウスはこのバージョンに対応してないしな。
397:デフォルトの名無しさん
07/07/16 12:01:06
Excel2000のVBAプログラミングでウィザード形式のユーザーフォームって
つくれますか? StarSuiteのBasicにはその仕様があるのですが、
VBAに関してはググってもなかなか直に解説してあるページがみつからなくて。
現在、同じサイズのユーザーフォームをいくつか用意してそれを順番に表示させる
ことで「ウィザードもどき」にしているんですが・・・・
398:デフォルトの名無しさん
07/07/16 20:33:23
>>397
コンテナになるコントロール使えば良いだけの話
これで解らなければあとはVBAではなくVBの分野なので
そっちの方向で勉強してね
399:デフォルトの名無しさん
07/07/17 00:11:19
>>398
どうも有難うございます。調べてみます。
400:デフォルトの名無しさん
07/07/17 10:11:14
学校の課題で、セルA1~A10 にそれぞれ10,20,30……100と表示し、その和をB1に表示するプログラムを作成せよ。
という課題が出て、試行錯誤してたのですが、詰まってしまいました。
ヒントとして、↓が出ていて、その通りにやったつもりなのですが、セルA1~A10にはゼロしか出てこなくてorz
1.次元数10の配列を宣言し、Forループを利用して数値(10~100)を作成する。
2.Forループを利用して和を計算する
3.Forループを利用して数値(10~100)を表示する。
4.和を表示する。
↓がいま現在のプログラムです。
Sub 課題1()
Const N = 10
Dim A(N)
For T = 1 To 10
A(N) = A(T) * 10
Next T
S = 0
For j = 1 To N
S = S + A(j)
Next j
For C = 1 To 10
Cells(C, 1) = A(N)
Next
End Sub
どなたかご教授願います。
401:A(T) * 10じゃなくてT * 10
07/07/17 10:40:03
>>400
それのどこがVBAの質問なのかと。basicの基本以下のレベルジャマイカ。
402:デフォルトの名無しさん
07/07/17 11:21:45
>>400
debug.printから出直せ。その方が君の為だ。
403:>>401 それを指摘するならA(T) = T * 10だな
07/07/17 11:27:02
>>400
ループ制御変数と個数の定数が混在しているぞ。
404:デフォルトの名無しさん
07/07/17 14:52:21
最近の学校の課題はエクセルVBAをやらせるのか…。
>セルA1~A10にはゼロしか出てこなくてorz
↑当たり前だ。403の名前欄を参照。
>Cells(C, 1) = A(N)
↑全部のセルに同じ値が出るに決まってるだろ。
まさかプログラマを目指してるとか言わないよな?
405:400
07/07/17 18:14:05
400です。皆さんのレスを参考に17:00から試行錯誤し直してやっと完成したので報告します。
下のプログラムで表示させることができました。本当、ありがとうございました。
Sub 課題1()
Const N = 10
Dim A(N)
For T = 1 To 10
A(T) = T * 10
Next T
S = 0
For j = 1 To N
S = S + A(j)
Cells(j, 1) = A(j)
Next j
S = 0
For c = 1 To N
S = S + A(c)
Cells(1, 2) = S
Next c
End Sub
406:デフォルトの名無しさん
07/07/17 18:19:26
Dim a(10)
For i = 1 To 10
a(i - 1) = i * 10
Next
s = a(0)
For i = 2 To 10
s = a(i - 1) + s
Next
For i = 1 To 10
Range("A" & CStr(i)) = a(i - 1)
Next
Range("B1").Value = s
407:デフォルトの名無しさん
07/07/18 09:54:41
>>405
どう見てもこの後ループを纏めることになるので、先回りしておけ。
408:デフォルトの名無しさん
07/07/18 13:21:11
開いていないファイルのセルデータをVBAで直接取得する方法ってありますか?
現状はセルに式を入力してから変数に代入、セルを削除
または該当ファイルを開いて取得、ファイルを閉じるみたいな感じです
409:デフォルトの名無しさん
07/07/18 13:27:58
バイナリ解析して直接描くならひらかずにどうぞ
410:デフォルトの名無しさん
07/07/18 13:44:57
>>408
そのファイルがCSVならそれほど難しくないでしょう。
411:408
07/07/18 14:12:48
>>409
難しくて私には分かりません
>>410
ファイルはCSVではなくEXCELブック形式です
ファイルを開けば
A = Workbooks(ファイル名).Sheets(シート名).Range(範囲)
で取得できるのでどこかを少し弄ればどうにかなるのかなと思ったんですけど・・・
412:デフォルトの名無しさん
07/07/18 14:21:39
内部的に開いていいなら(表示はしない)簡単だけど、全く開かずとなると無理っす
バイナリ解析するにも先ずはファイルをOpenしないと始まらないし
413:デフォルトの名無しさん
07/07/18 16:03:15
>>412
どうやら無理そうですね
開かずに済むセルに入力して・・・ の方法で処理しようと思います
ありがとうございました
414:デフォルトの名無しさん
07/07/18 18:48:05
>>408
VBAじゃないけど参照で良ければ。
='c:\Documents and Settings\hoge\My Documents\[book1.xls]Sheet1'!a1
とか
415:デフォルトの名無しさん
07/07/18 20:21:15
>>413
VBA以前のExcel4マクロ(だっけ)なら簡単にできるはず。
Excelの関数と同じくVBAから使用することも可能
ヘルプは英語版ならMSから無料で落とせる。
416:デフォルトの名無しさん
07/07/18 20:29:52
とりあえずサンプル見つけたので>Excel4マクロ
Cells(1, 1) = Application.ExecuteExcel4Macro("'C:\My Documents\[Book2.xls]Sheet1'!R1C1")
URLリンク(oshiete1.goo.ne.jp)
417:デフォルトの名無しさん
07/07/18 21:21:50
そのExecuteExcel4Macro使う方法が>>412も言ってる
> 内部的に開いていいなら(表示はしない)簡単だけど
の方法でしょ。でも、これだって開いてないわけではないので、この方法では嫌なんだとさ。
内部的に開いて良いなら他にもいくつか方法はあるんだけどね。
因みにExecuteExcel4Macroを使ってセルの値を取得する方法は
かなり有名で解説サイトはいっぱいあるから英語版ヘルプなんて必要無いが
空セルを取得すると空文字やEmpty値ではなく0が返ってくるという不都合がある。
つまり、数値の0が入ってるセルと何も入ってないセルを区別出来ない。
418:デフォルトの名無しさん
07/07/18 22:05:36
皆さん、MSOfficeのスキル高そうですけど、関係する資格などはお持ちですか?
私の勤める会社は、持っている資格を全て棚卸して一覧にまとめよ、なんて御触れが出ました。
ひけらかしたい奴は全部書くし、変なプロジェクトに引っ張られたくない人は応分に隠し、
こんなに資格もってんならウチにいなくてもなんとかなるだろう、とリストラの対象になりたくない人は適当に描いていました。
スキルを保有するのはいいが、ヘタに見せると悪影響があるなんて、初めて知った2007年の夏でした。
419:デフォルトの名無しさん
07/07/18 22:11:08
>>417
> この方法では嫌なんだとさ。
たぶん内部的に開くの意味よくわかってないだけだと思うが
>または該当ファイルを開いて取得、ファイルを閉じるみたいな感じです
これが嫌なんだろう
420:デフォルトの名無しさん
07/07/19 00:00:30
VBAで配列の宣言時に初期化ってできないのですか?
下のようにできると聞いたのですが、実際やってみると「=」が駄目なのか
コンパイルエラーになってしまいます。
Dim Moji() As String = {"ABC", "DEF", "GHI"}
421:デフォルトの名無しさん
07/07/19 00:37:15
VBならできるけどVBAは駄目です
422:デフォルトの名無しさん
07/07/19 11:03:09
そんなことはない
423:デフォルトの名無しさん
07/07/19 11:06:18
正確にはVBの2002以降ね
VBでもVB6では出来ないし、当然VB6準拠のVBAでも出来ない
VB6で出来ることはコントロールと特殊なオブジェクト絡み以外ほとんどVBAでも出来るから問題ないが
VB2002で大きく変わったので、VB2002以降用の解説読んでそれをVB6やVBAでやろうとして
出来なくて混乱しちゃう奴って結構居るみたいだね
424:デフォルトの名無しさん
07/07/19 11:13:42
Dim Moji() As Array("ABC", "DEF", "GHI")
425:デフォルトの名無しさん[
07/07/19 21:44:55
VB6でもArray使えば、配列の初期化できるのか。でも、多次元は無理なのかな
426:デフォルトの名無しさん
07/07/19 22:25:34
VBAでSub プロシージャでは値渡しも参照渡しもできるのですが
Func プロシージャでは値渡ししかできません。参照渡しのやり方ってどうやるのでしょうか。
427:デフォルトの名無しさん
07/07/19 23:29:02
ByVal?
428:デフォルトの名無しさん
07/07/19 23:29:40
ごめんちがた
429:デフォルトの名無しさん
07/07/20 00:00:33
>>426
普通にできるだろ
430:426
07/07/20 00:25:26
↓こんな感じの作ってやってみたけど、表示されるのは"A"
ちなみにFunction→Subに変えたらちゃんと"B"が表示されます。
使い方がまずいのでしょうか?
Sub test()
Dim tmp As String
tmp = "A"
func1 (tmp)
MsgBox tmp
End Sub
Function func1(ByRef tmp As String)
tmp = "B"
End Function
431:デフォルトの名無しさん
07/07/20 00:31:45
Sub test()
Dim tmp As String
tmp = "A"
c=func1(tmp)
MsgBox tmp
End Sub
Function func1(ByRef tmp As String)
tmp = "B"
End Function
432:426
07/07/20 00:45:38
>431氏の通りにしたらできました。
式にしないと駄目ということなんですかね。
433:デフォルトの名無しさん
07/07/20 00:46:22
func1 tmp
434:429
07/07/20 00:47:32
>>430
136 デフォルトの名無しさん mail:sage 2007/02/02(金) 00:10:24
> VBAは自分で作った関数を使う際、
> 引数にかっこをつけてはいかんのです。
ハズレ
自作関数の場合ではなく、基本的にSub、Functionプロシージャ(メソッド)を呼ぶ場合、
戻り値を取る場合とCallで呼ぶ場合以外は()を付けない。MsgBox関数の場合だとこんな感じで使う。
[1] MsgBox "test", vbOkOnly
[2] Call MsgBox("test", vbOkOnly)
[3] ret = MsgBox("test", vbOKCancel)
自作関数の場合でも戻り値を取る場合とCallで呼ぶ場合は()付けなきゃダメだし
自作関数じゃなくても、[1]のように使うときは()付けてはいかんのです。
ややこしいのは、引数一つの関数の場合。
[4] Inc hoge
[5] Inc (hoge)
Sub Inc(Value As Long)
Value = Value + 1
End Sub
[4]の方だと変数hogeが+1され、[5]の方だと変化しない。
引数一つの関数をCallを省略し引数に()を付けて呼ぶと、引数は値渡しになる。
基本的に参照渡し値渡しは呼び出される側で指定するので、[5]は殆ど使われない。
意味も知らずに間違って使ってる奴は居そうだけどな。。
435:デフォルトの名無しさん
07/07/20 01:12:19
回答ありがとうございます。
VB独特の仕様なんで覚えるしかないみたいですね。
また間違えそう・・・
436:デフォルトの名無しさん
07/07/20 01:20:28
func(tmp)
func (tmp)
とは違うだろ
下はc=func((tmp))
のようなもの
上のような書き方は存在しない
437:デフォルトの名無しさん
07/07/20 02:51:18
>>430
引数に何もしなければ参照渡し
()でくくると値渡し
Sub test()
Dim tmp As String
tmp = "A"
func1 tmp
MsgBox tmp
End Sub
Function func1(tmp As String)
tmp = "B"
End Function
438:デフォルトの名無しさん
07/07/20 06:55:09
つまり、外せる括弧は外せと言うことだな。
439:デフォルトの名無しさん
07/07/20 17:44:58
func1 -tmp
としたら誰もtmpで値が受け取れるとは思わないだろ
同じことだよ
440:デフォルトの名無しさん
07/07/21 18:13:02
つまり、外せる演算子は外せと言うことだな。
441:デフォルトの名無しさん
07/07/22 01:49:28
エクセルの処理を一瞬だけ止める命令ってどんなのがありますか?
調べたところ、waitを使って、現在時間を調べてそこから1秒待ちをする、などは分ったのですが、
私がやりたいのは、コンマ1秒だけ処理を止めるというものをやりたいんです。
ですが、いまいちコンマ何秒だけ処理を一時停止させるという方法が分かりません。
初歩的な質問で申し訳ないのですが、教えていただけないでしょうか。
442:デフォルトの名無しさん
07/07/22 02:44:42
>>441
Win32APIのSleep使えばいいだけだよ
㍉秒指定なので、コンマ1秒なら100㍉秒指定で
443:441
07/07/22 07:24:57
解決しました。ありがとうございます。
444:デフォルトの名無しさん
07/07/22 12:21:00
444
445:初心者☆
07/07/22 16:04:23
DataAdd関数のところで
「コンパイルエラー:
SubまたはFunctionが定義されておりません」
と出るのですが、なぜエラーになるのかがわかりません。
わかる方おしえてください。
ちなみに、
DataAdd("d", data_length, Now)
みたいなカンジで使ってます。
446:デフォルトの名無しさん
07/07/22 16:50:00
そんな関数あるのか?
447:デフォルトの名無しさん
07/07/22 16:56:25
>>445
クリティカルで答えを言ってやる。おまいさんが参考している本が分かった
DataAdd ×
DateAdd ○
こういうこった
448:デフォルトの名無しさん
07/07/22 17:10:15
教えて下さい。
10品目 月の入荷から各個人に日々の払い出しを行い。
入荷数から払い出しを引いた在庫数がわかるようなマクロはどうすればいいでしょうか?
シートを分けたいです。
449:デフォルトの名無しさん
07/07/22 19:24:12
エスパーじゃない普通の人間に判るように書け。
450:デフォルトの名無しさん
07/07/23 14:55:39
VLOOKUPで検索して参照している値を変更したいのですが
どうやったらいいのでしょう?
-------------
1 AAA
2 BBB
3 CCC
4 DDD
-------------
3 CCC
↑
3って入力すると右にCCCって出てくる
そのCCCをXXXって変えると元のデータのが
1 AAA
2 BBB
3 XXX
4 DDD
ってなるようにしたいです。VBA使わないと出来ないですかね?
なるべくExcel関数だけで作りたいのですが・・・
451:デフォルトの名無しさん
07/07/23 19:12:45
>>450
ここはVBAでやりたい人の為のスレだよ
まあExcelの本スレにも書かれている通り、関数では値の書き換えは出来ないので
どっちにしろVBAでやるしかないけどね
452:デフォルトの名無しさん
07/07/23 20:51:08
このスレ初めて見つけたときエクセルとVBAの質問スレだと思った。
スレタイいじったほうがいいんじゃないスかね
453:デフォルトの名無しさん
07/07/23 20:58:14
板見りゃわかるっちゃわかるけど、スレタイだけ見るとそうだね。
454:デフォルトの名無しさん
07/07/23 21:53:41
まあExcelでプログラム技術系の話と言ったらVBAしか無いもんな
455:デフォルトの名無しさん[
07/07/23 22:05:50
バイナリファイルを作るマクロ作成したんですが
常に新規作成で作ることできますか?
Open "ファイル名" For Binary As #1
↑こんな感じで最初やってみたんですが、新規ファイルがある場合でも
単純に頭から上書きするみたいで困っています。
456:デフォルトの名無しさん
07/07/23 22:49:33
kill
457:デフォルトの名無しさん
07/07/23 23:12:51
>>454
いやいやExcelとプログラムを絡めるだけなら、
オートメーションで他言語から操作するなんてこともあるぞ。
まあその言語特有の事情を除けば、VBAでやるのと何も変わらないが。
458:デフォルトの名無しさん
07/07/23 23:36:53
UserFormのUserForm_Initializeで変数と画面の
初期化をしていますが、ここのロジックを通ってUseeFormが
表示されたあと、画面をUnload Meしてブックを保存して閉じると、次回起動時に
「問題が発生したため、Microsoft Office Excelを終了します。
ご不便をおかけして申し訳ありません。」
と出て、強制終了してしまいます。
ただし、次の場合はエラーが出ずに起動できます。
・保存せずに閉じた場合。
・マクロを無効にして起動し、保存した場合(orしない場合)
・VBEを表示させて実行した場合。
デバッグしたらエラーにならず実行されるので、原因がつかめず困っています。
いろいろ手探りでやってみたところ、2回目の起動の時、
UseeFormにあるコントロールにアクセスすると落ちてしまうようです。
例えば、、
UserForm.lb_KUBUN.Caption = "" とか、
cb_Save.Enabled = True といった感じです。
UseeFormには200近いラベルがあります。
あとは22のフレームと、14のコマンドボタン、リストボックスとコンボボックスが1つずつで、
テキストボックスはありません。ブックの大きさは1Mくらいです。
Office Updateは最新状態にしてます。
最初は起動できるので、実行後の保存の時になんか悪いもんが残ったりしてるのかなぁという感じです。
みなさま、お心当たりあればどうぞご教示ください。
459:デフォルトの名無しさん
07/07/23 23:53:34
そのフォームをいい時と悪いときでエクスポートして比べてみたらいいんじゃ
460:458
07/07/24 00:24:55
エクスポートして比べてみたけど、同じでした。。
461:デフォルトの名無しさん
07/07/24 07:16:30
最小限の再現出来るソースを出せ
462:デフォルトの名無しさん
07/07/25 23:45:28
検索をするプログラムをもっと簡潔にしたいのですが。
いま2次元配列NK_ryuu(1 To 50, 1 To 15)で
NK_ryuu(x.1)にID
NK_ryuu(x.2)に項目A
NK_ryuu(x.3)に項目B
NK_ryuu(x.4)に項目C
と入っていてxは1から50まであります。
ここであるシートの中から項目ABC全部を持っている行を抜き出すのですが、
今は下のようになっていてforとifを2重3重に使っていてちょっと見た目が汚いです。
しかも項目やxが増えた場合に処理がものすごい勢いで重くなりそうです。
もうちょっと賢いやり方ありませんでしょうか?お願いします。
配列honban()に取得した行番号を格納しています。
463:462続き
07/07/25 23:46:08
Sub test()
With ActiveSheet
For x = 1 To 50
For i = 1 To 500
If .Cells(i, 2).Value = NK_ryuu(x, 2) Then
If .Cells(i, 3).Value = NK_ryuu(x, 3) Then
If .Cells(i, 4).Value = NK_ryuu(x, 4) Then
honban(j) = i
End If
End If
End If
Next i
Next x
End With
End Sub
464:デフォルトの名無しさん
07/07/26 08:24:32
すいません、質問をさせてください。
VBAではなく普通の関数なんですが、
3人の1ヶ月の勤務表があるとします。
A B C D E
1 Yさん Mさん Aさん
2 1日 0 2 休
3 2日 0 休 休
: :
31 30日 休 0 1
とした時、(勤務表の数字は出勤時間を意味しており、0が朝、1が昼、2が夕方から出勤)
E列にその日の出勤が1人の場合のみ名前を出力するようにしたい場合、
現在は=IF(COUNT(B2:D2)=1,INDEX($B$1:$D$1,1,MATCH(0,B2:D2,0)),"")
と入力しておりますが、
これを一つの関数で行うことはできるのでしょうか?
VLookupの場合テーブルでないとエラーがでるので、
あれば教えていただけないでしょうか。
よろしくお願い致します。
465:464
07/07/26 08:31:02
追記です。
出勤する人が1人の場合は、
必ず勤務は朝からになります。(勤務表には0が入ります。)
466:デフォルトの名無しさん
07/07/26 12:16:14
>>465
>464では何故いけないの?
つーか、「1や2が存在しない」ことと「0の人の名前を得る」ことの
両方を同時に満足するような関数なんてあるわけないじゃん。
467:デフォルトの名無しさん
07/07/27 01:13:41
VBAはいつまで存続するんでしょ
468:デフォルトの名無しさん
07/07/27 01:39:11
>>467
キミが痴呆になるまで
469:デフォルトの名無しさん
07/07/28 10:08:25
エクセルで、
テキストファイルの印刷
を実行する方法を
教えてくれませんか?
pdfと同じようにシェルでやろうとしたらダメでしたorz
470:デフォルトの名無しさん
07/07/28 19:38:44
Private Sub CommandButton1_Click()
For i = 1 To 48
If Cells(1, 1) = Cells(i, 4) Then Cells(1, 2) = Cells(i, 5)
If Cells(3, 1) = Cells(i, 4) Then Cells(3, 2) = Cells(i, 5)
If Cells(5, 1) = Cells(i, 4) Then Cells(5, 2) = Cells(i, 5)
If Cells(7, 1) = Cells(i, 4) Then Cells(7, 2) = Cells(i, 5)
If Cells(9, 1) = Cells(i, 4) Then Cells(9, 2) = Cells(i, 5)
If Cells(11, 1) = Cells(i, 4) Then Cells(11, 2) = Cells(i, 5)
If Cells(13, 1) = Cells(i, 4) Then Cells(13, 2) = Cells(i, 5)
If Cells(15, 1) = Cells(i, 4) Then Cells(15, 2) = Cells(i, 5)
If Cells(17, 1) = Cells(i, 4) Then Cells(17, 2) = Cells(i, 5)
If Cells(19, 1) = Cells(i, 4) Then Cells(19, 2) = Cells(i, 5)
If Cells(21, 1) = Cells(i, 4) Then Cells(21, 2) = Cells(i, 5)
If Cells(23, 1) = Cells(i, 4) Then Cells(23, 2) = Cells(i, 5)
Next
End Sub
セルの値があらかじめ用意しているリストのと一致すると、
特定の文字を入力しようと こういうのを作りました
で、うまくいったのですが、
これだとそれぞれ1つのセルにしか記入できません。
たとえば1列目で、Cells(1, 3)にも何か書きたい場合はどうしたらよいでしょうか?
質問の意味が分かりづらかったらスマソ
471:デフォルトの名無しさん
07/07/28 19:48:59
For i=1 To 48
For m=1 To 12
j=2*m-1
If Cells(j,1)=Cells(i,4) Then Cells(j,2)=Cells(i,5):Cells(j,3)="何か"
Next
Next
472:デフォルトの名無しさん
07/07/28 19:53:23
>>471
速攻レスありがとうございます。
今仕事中でこっそり送信してるんで、時間ができたらやってみたいと思います。
473:デフォルトの名無しさん
07/07/28 20:18:42
記法とかオブジェクトの基本的な質問がちょくちょく出てくるのを見るに
VBAからプログラミングに入った人はある程度理解出来てきたなと思う頃
初心に返ってヘルプを一通り眺めてみるのが良さそうだね。
ランゲージリファレンスのメソッド・キーワードあたりの意味が一通りわかった時とか、
ウォッチウィンドウの使い方を理解した時涙出そうになったのを思い出した。
チラ裏スマソ。
474:デフォルトの名無しさん
07/07/28 20:25:55
>>471
For m = 1 To 12
j = 2 * m - 1
↓
For j = 1 To 23 Step 2
475:デフォルトの名無しさん
07/07/28 21:10:24
470ですが
>>471 >>474氏 サンクス
今やって見たら解決しました。
:(コロン)を使うというのを初めて知りました。
特に仕事でVBAが必要というわけではないので、1年に一回くらいしか使わないのですが
たまに使うと初歩的なことも忘れてしまいます。
ちなみに競馬のデータ分析に使いましたw
1万レース近くあるのでVBAというかマクロというか分からんけど役に立ちます。
476:デフォルトの名無しさん
07/07/29 00:26:53
>>473
割と共感した
477:デフォルトの名無しさん
07/07/29 23:01:37 0
0~11までの数字をランダムに、かつかぶらないように代入したいんですが
以下のコードだと数字が代入されない場合があるんです。何が原因なんでしょう・・
__________________
n1k = Int(Rnd * 12)
Do
n2 = Int(Rnd * 12)
Select Case n2
Case n1k
Case Else
n2k = n2
End Select
Loop Until n2k = n2
Do
n3 = Int(Rnd * 12)
Select Case n3
Case n1k
Case n2k
Case Else
n3k = n3
End Select
Loop Until n3k = n3
478:デフォルトの名無しさん
07/07/29 23:09:29 0
書ききれないので・・実際はn8kまであります。
479:デフォルトの名無しさん
07/07/29 23:29:12 0
Empty = 0がTrueになるから。
その冗長的なコーディングにはやむを得ない事情があるの?
あと抜粋でもせめて宣言部は書こうよ。
480:デフォルトの名無しさん
07/07/29 23:37:30 0
n*kが数値型変数やVariant型変数の場合
Int(Rnd * 12)の結果が0ならCase Elseでの代入を行わなくても「n*k = n*」がTrueになるからでは?
そういうのは配列に順に数値を代入してからランダムソートするといいよ
というか、そうするのが普通だろ
481:デフォルトの名無しさん
07/07/29 23:51:51 0
{0,1,2,3,4,5,6,7,8,9,10,11}
{0,1,2,3,4,5,7,8,9,10,11}
{0,2,3,4,5,7,8,9,10,11}
{0,2,3,4,5,7,8,9,11}
こういうイメージで配列を操作せよ
482:デフォルトの名無しさん
07/07/29 23:51:52 0
>>480
>>477に便乗で悪いんだけど、
0~11までの数字をランダムに、かつかぶらないように代入したい
て時に俺は
Dim RndNum As Long
Dim NumCnt As Integer
'抜き出す数字の個数
NumCnt = 3
Set Dic = CreateObject("Scripting.Dictionary")
RndNum = Int(Rnd * 12)
Dic.Add RndNum, RndNum
Do While Dic.Count < NumCnt
RndNum = Int(Rnd * 12)
If Not Dic.Exists(RndNum) Then
Dic.Add RndNum, RndNum
End If
Loop
みたいなやりかたするんだけどダメ?
483:デフォルトの名無しさん
07/07/30 00:40:48
ダメではないけどDictionaryなんて使う必要ない
484:482
07/07/30 01:43:37
>>483
そか。
ちとランダムソートについて調べてみるよ
レスさんくす
485:デフォルトの名無しさん
07/07/30 02:31:58
全然詳しくないので質問させてください。
いつも仕事中にWebばかり見てる派遣クンが
「VBAがプログラムどおりに動かない原因を調べるのは僕の仕事ではありません。」
と言っています。
彼のVBAプログラムが動かないのを調べるのは誰の仕事でしょうか?
486:デフォルトの名無しさん
07/07/30 02:39:18
プログラムが失敗作と確定してるのだったら
そういうやつは辞めてもらえ
487:デフォルトの名無しさん
07/07/30 03:17:02
>>485
契約内容に因る
派遣ではなく業務請負なら間違いなくそれも彼の仕事のうちだけどね
一般的にはその派遣クンが悪いように見る人が多いかも知れないけど
契約内容によっては正しいことを言ってるかも知れない
それとこの質問において「Webばかり見てる」なんて情報は全く持って不要
彼の印象をなるべく悪くしようとしているようで浅ましい限りだ
488:デフォルトの名無しさん
07/07/30 10:34:02
vba おすすめ参考書は?
489:デフォルトの名無しさん
07/07/30 19:54:34
参考書とは言えないかもしれんが 「Excel VBA 実用サンプルコレクション」
異常にオブジェクト偏重なサンプル集だけどこの考え方は持っておくべきだと思う。
完全な入門ならちょっと敷居が高すぎるだろうけどね。
>>485って日本語の問題?動く物を作れで終了なんじゃw
490:デフォルトの名無しさん
07/07/30 19:59:21
セル範囲を画像化して保存する方法はありますでしょうか?
491:デフォルトの名無しさん
07/07/30 20:29:53
あるよ
492:デフォルトの名無しさん
07/07/30 22:57:49
素人な聞き方でスマソ
たとえば、
セルD1に「=A1&B1&C1」と入力したら「あいう」と表示されるとします。
(A1, B1, C1 にそれぞれ、あ、い、う が入っている)
セルD1 をセルD2に、paste spacial → values(*英語エクセルです)で
コピペしたら、セルD2には「あいう」というテキストが入ります。
このpaste spacial → values の作業を省略できるような関数があったら教えてください。
例えば、A1の値を「わ」に変えるだけで、自動的に 「わいう」というテキストの入ったセルを
ゲットできるようにしたいのです。
493:デフォルトの名無しさん
07/07/30 23:07:07
質問させてください。
UserForm上にComboBoxを配置して
Initializeで初期値とRowsourseによってリストを与えるようにしています。
ComboBoxのリストを開くと最初は一番上のリストの値から順に表示され、
一度リストから値を選択してComboBoxに入れ、
再度リストを開くとその値があらかじめ選択されており、
その値の前後が表示されるようになってます。
( 1 ~12月がリストにあり、5月を選び再度リストを開くと 5月が選択された状態で
リストをスクロールせずとも 3~ 7月の値が選択可能な範囲にある
ような状態です。)
最初からComboBoxの初期値の付近のリストを表示させるようにしたいのですが、
方法はありますでしょうか?
説明が不十分で分かりにくいかと思いますが、宜しくお願いします。
494:492
07/07/30 23:19:05
自己解決しそうです。
PASTE.SPECIAL 関数っていうのがあるみたいですね。
でも手元にある 2003 のエクセルにはないみたいですが・・・
調べてみます。
495:492
07/07/30 23:27:31
やっぱり分からなかった。
たぶんマクロでやるんですかね。素人レベルには難しいことならば諦めます。
496:デフォルトの名無しさん
07/07/30 23:28:20
Private Sub UserForm_Initialize()
ComboBox1.Value = "5月"
End Sub
497:デフォルトの名無しさん
07/07/30 23:30:30
>>496
ただ単にValueで値を持たせてもできないのですが・・
498:デフォルトの名無しさん
07/07/30 23:31:24
>>492
d2に=d1じゃだめなん?
499:デフォルトの名無しさん
07/07/30 23:34:48
>>497
五月になってない?
500:デフォルトの名無しさん
07/07/30 23:43:09
>>499
正確には1~12の値のみで初期値に5を入れて
ComboBoxの値は5になっている状態でリストを見ても
1(リストの一番上の値)から5くらいまでが表示された状態になってます。
要は値は入っていてもリスト上は何も選択されていない状態です
501:デフォルトの名無しさん
07/07/30 23:45:30
>>500
それは値は入っていても値は入っていない状態だからお手上げだな
502:デフォルトの名無しさん
07/07/30 23:55:44
>>501
お手上げですか
なにか手はないものでしょうか・・
503:デフォルトの名無しさん
07/07/31 00:03:14
>>498
はい。
家計簿を作ってるんですが、
1~12月までの費目別合計の推移を DSUM 関数で出しています。
=DSUM('1'!A:H,'1'!F1,分類!A1:A2) ←1月
=DSUM('2'!A:H,'2'!F1,分類!A1:A2) ←2月
=DSUM('3'!A:H,'3'!F1,分類!A1:A2) ←3月
(以下12月までつづく)
>>492 の例に当てはめると、セルD1に
=DSUM('1'!A:H,'1'!F1,分類!A1:A2)
と表示されています。
この数式を使えるようにするために、paste spacial → values の作業をしています。
「A1:A2」の部分だけを何度も変更できるように、
セルD1は複数のセルを&でつないでおり、「A1:A2」の位置には特定のセルを指定し、
そのセルに好きなセル範囲を書くだけでいいようにしています。
504:デフォルトの名無しさん
07/07/31 00:16:55
>>502
Private Sub UserForm_Activate()
Me.ComboBox1.DropDown
Me.ComboBox1.Value = 5
End Sub
こうゆうこと?
505:503
07/07/31 00:51:56
当初考えていたやり方じゃないけど解決しました。
有難う御座いました。
506:デフォルトの名無しさん
07/08/01 13:38:16
Excelからメールを送ろうとCDOで組んだのですが宛先があっていれば普通に送れるのですが、アドレスが間違っていて存在しないアドレスに送っていてもエラーが帰ってきません。
このエラーを得る方法はありますか?
507:デフォルトの名無しさん
07/08/01 18:43:08
あります
でもExcelの話じゃないので、ここでは聞かないでね
508:デフォルトの名無しさん
07/08/01 19:06:24
CSVをADOの「Driver={Microsoft Text Driver (*.txt; *.csv)};DBQ=~」で扱うのは
office2000以上だと標準で利用できますか?
参照設定の設定も不要でいいんでしょうか?
509:デフォルトの名無しさん
07/08/01 19:07:12
当然参照設定は必要
510:デフォルトの名無しさん
07/08/01 19:15:24
>>509
マジ?なんも設定しなくても使えたんだけど・・・
ちなみに何を設定すればいいんですか?
511:デフォルトの名無しさん
07/08/01 19:18:37
もしかしてCreateObjectで参照してる?
512:デフォルトの名無しさん
07/08/01 19:28:25
Private Sub CommandButton1_Click()
Set rs = CreateObject("ADODB.Recordset")
Con = ""
Con = Con & "Driver={Microsoft Text Driver (*.txt; *.csv)};"
Con = Con & "DBQ=C:\Documents and Settings\Administrator\デスクトップ\新しいフォルダ;"
strSQL = "select * from test.csv"
rs.Open strSQL, Con, 0 '0=adOpenForwardOnly
cols = rs.Fields.Count
Do Until rs.EOF
Line = ""
For i = 0 To cols - 1
Line = Line & rs(i) & vbTab
Next
Debug.Print Line
rs.MoveNext
Loop
End Sub
513:デフォルトの名無しさん
07/08/01 19:29:32
こんなん書いて 今家でも試したけど出来た
CreateObjectだね
CreateObjectだと参照設定しなくても出来るということでおk?
514:デフォルトの名無しさん
07/08/01 20:05:43
>>506
URLリンク(www.asahi-net.or.jp)
ググったら見つけました
515:デフォルトの名無しさん
07/08/01 22:14:09
エクセルを開こうとするといきなりインストールしだしてエラー表示がでました。
プロパティを開いてプログラムを見ると不明なアプリケーションとなっております。
これは何故でしょう?
またこれを解決する方法はどうすればいいのでしょうか?
516:デフォルトの名無しさん
07/08/01 22:17:30
>>513
そうだよ。それが遅延バインディング。
欠点として、参照設定してきちんと型を指定して使う早期バインディングより
速度が遅いと、確かヘルプに書かれているはず。
517:デフォルトの名無しさん
07/08/01 22:18:02
初心者です。
if,do,for等の分岐式や繰り返しコードを使うと必ずバグが出ます。
バグが出ないように皆さん何か心がけている事ってありますか?
518:デフォルトの名無しさん
07/08/01 22:21:59
参照設定しないと遅いのもあるけど、コーディングしにくくない?
519:デフォルトの名無しさん
07/08/01 22:55:03
参照設定ってexcelファイルにするの?
excel環境にするの?
520:デフォルトの名無しさん
07/08/01 23:05:13
ブック単位だな。
ちなみに、普通のVBだとプロジェクト単位。
521:デフォルトの名無しさん
07/08/01 23:47:31
>>515
VBA関係ねえ
522:デフォルトの名無しさん
07/08/01 23:53:15
>>520
㌧
523:デフォルトの名無しさん
07/08/02 07:40:47
ADOで
csvテーブル(Microsoft Text Driver接続)と
Excelシートテーブル(Microsoft Excel Drive?接続)の
SQLでの連結ってできる?
524:デフォルトの名無しさん
07/08/02 18:21:00
VBAでListViewとかTreeViewを組み込んで OLEDragDropとか使うのは、
VBがある環境じゃないとライセンス違反とか聞いたんだけど、ほんと?
なんかMSのページ見に行ってもどこに情報があるのか良くわからん。。
使えるのに使っちゃダメとかなんだったらひどい話だよなあ。
525:デフォルトの名無しさん
07/08/02 18:24:58
vbaでSQLite使う方法ある?
526:デフォルトの名無しさん
07/08/02 18:28:46
あるよ
527:デフォルトの名無しさん
07/08/02 18:33:07
どうやるのか教えて
528:デフォルトの名無しさん
07/08/02 21:21:54
>>524
> ライセンス違反とか聞いたんだけど、ほんと?
うん、ライセンス違反だよ
ListViewとかTreeViewはVB6ランタイムを入れるとVBAからも使えるようになるが、本来VB6ランタイムというのは有料ソフトの付属品
VB6で作ったソフトを動かす為に必要なので、特定条件下で無料再配布が許可されているが、当然、使用はライセンスに縛られた範囲になる
で、使用して良い範囲が、VB6を持ってない人(VB6ランタイムを借りてる人)ではVB6で作られたソフトからの利用のみで
VB6を持ってる人(VB6ランタイムを購入した人)は自分の環境内で好きなように使って良くて
VB6Proなどを持ってる人(VB6ランタイムとその再配布権を購入した人)は自環境内で好きなように使って良いのに加えて
自作ソフトに同梱して配布することも出来る
無料で配布されているとは言え、VB6を持ってない人には有料ソフトの一部を条件付きで貸してるだけということをお忘れなく
> 使えるのに使っちゃダメとかなんだったらひどい話だよなあ。
世の中、出来るけどやっちゃいけないことで溢れかえっているけど、こんな事にも気付いてないほどお子ちゃまなの?
おそらくピッキングが出来れば君の家にある君が所有権を持つ物品類を盗むことも「出来ること」だが
この「出来ること」をやっちゃダメだと法的に定めるのはひどい話なのかな?
君の所有物に対して、所有権において他者の使用を制止・制限出来るのと同じで
MSの著作物に対しても、著作権において他者の使用を制止・制限してるだけのことなんだけど
529:デフォルトの名無しさん
07/08/02 21:47:51
>>528
> 特定条件下で無料再配布が許可されているが、
おー、そういうからくりなのか。ぜんぜん知らなかった。
勉強になるなあ。ありがとう。
> 世の中、出来るけどやっちゃいけないことで溢れかえっているけど、
> こんな事にも気付いてないほどお子ちゃまなの?
お子ちゃまレベルなのは認めるよ。
趣味でスクリプト組んでいるんであって、
プロで開発やってるわけじゃないもん。
もうちょっと「だめであること」がわかりやすくなっていても
いいんじゃないか?と思ったよ。だめならだめでさ。
530:デフォルトの名無しさん
07/08/02 21:56:24
それを言うなら鍵あいてた家のトイレでウンコしていいかとかそんな所だろ。
どっちもどっちだし窃盗みたいにものすごく悪いって程ではないけど、一応ダメ。
見つかって話がこじれたり目に余るような有様だと裁判沙汰にもなるわなw
531:デフォルトの名無しさん
07/08/02 23:37:16
>>529
技術や知識レベルとかプロ意識の問題じゃなかろう
約束やルールを守れないのは子どもだってこと
ただまあ524がそこまで言われるようなことかと言うと
「そういうもんなんだから諦めな」で済むような気もする
532:デフォルトの名無しさん
07/08/03 00:20:16
そんなことよりvbaからSQLite使う方法教えろ
533:デフォルトの名無しさん
07/08/03 04:43:19
ググれカス!
534:デフォルトの名無しさん
07/08/03 21:25:19
vba sqlite odbc でぐぐって判らんかったら諦めれ
535:デフォルトの名無しさん
07/08/03 21:26:25
ブレークポイントでプログラム中断した時、変数にマウスポインタあてると
内容が表示されるのが表示されなくなりました
設定とかいじってないのに何ででしょう?
536:デフォルトの名無しさん
07/08/03 22:14:43
VBAを記述中にカーソルが勝手に戻ったり、コメントを記入中に勝手に変換確定されるのですが
どうすれば回避する事が出来るのでしょうか?
例えば
Sub | ←このような時に Sub| ←このようにカーソルが戻ってしまうんです。
わーくしー ←このように入力中に勝手に確定されるのです。
よろしくお願いします。
537:デフォルトの名無しさん
07/08/03 22:29:04
スペースが全角だから自動で半角になってるんじゃないか
538:106
07/08/04 07:49:36
'Sub |
539:デフォルトの名無しさん
07/08/04 10:42:33
助けてください。2列目以降をソートしたいのですが、
Range("A1").Sort _
Key1:=Columns("B") _
, Order1:=xlAscending _
, Header:=xlGuess _
, Orientation:=xlTopToBottom
だと、
実行時エラー'1004'
RangeクラスのAutoFilterメゾットが失敗しました。
Range("A1:L100").Sort _
Key1:=Columns("B") _
, Order1:=xlAscending _
, Header:=xlGuess _
, Orientation:=xlTopToBottom
だと、
エラーはでませんが、まったくソートがされません。
F8を叩くと、セルはA1を指しています。
同じファイルをマクロで実行したソースを貼っても駄目でした…。
よろしくお願いします。
540:539
07/08/04 10:45:32
↑すいません。
○RangeクラスのSortメゾットが失敗しました。
×RangeクラスのAutoFilterメゾットが失敗しました。
です。
541:デフォルトの名無しさん
07/08/04 15:47:25
決められた範囲内(セル内)のデータをcsvファイル形式でセーブしたいのですが…
どんなプログラムになるでしょうか?
542:デフォルトの名無しさん
07/08/04 16:10:48
>>542
マクロ記録でSaveAs...してみれば判ると思う。
543:542
07/08/04 16:11:49
>542は>>541ね。
544:536
07/08/04 19:19:49
最初にOption Explicitを入れたので、原因はそれっぽいのかな。
まだ、検証してませんが
545:デフォルトの名無しさん
07/08/04 19:51:05
>Option Explicitを入れたので、原因はそれっぽいのかな。
Option Explicitは常に入れているが、そんな話聞いた事が無い。
546:デフォルトの名無しさん
07/08/04 23:56:25
Sheet1
□ りんご
□ みかん
□ いちご
□ ぶどう
Sheet2
┌───┐
│りんご │
│みかん │
└───┘
図のようにシート1にあらかじめ入力されているデータを選択し
シート2にあらかじめ作成しておいた表の特定のセルに自動転記され
表が完成する。 という動作を行いいたいのですが
まずシート1でチェックボックスで選ばれた項目だけを
表に反映させるというのがわからないです。。
547:デフォルトの名無しさん
07/08/05 00:43:42
くそ天皇 くそ天皇 くそ天皇 くそ天皇
いい加減死ねっつってんだろ屑ニートくそ天皇が
相変わらず病的な粘着っぷりだな屑ニートくそ天皇が
毎日毎日毎日粘着出来て良いでちゅねくそ天皇
くそ天皇さっさと死にやがれゴミが
東京に在住している精神病珍米糞ニートくそ天皇君の末路
さっさと精神病院逝くか首吊って逝くか選べや糞天皇が
早く死ねよ糞ニート天皇が
粘着精神病屑ニート天皇君は自らニートくそ天皇であると公言しました
さっさと死ねやくそ天皇が
早く死ねっつってんだろ屑ニートくそ天皇が
お前みたいなゴミクズ天皇は息してるだけで空気が汚れるからさっさと死ねや
とっと死に晒せや糞ニート天皇が
548:デフォルトの名無しさん
07/08/05 01:09:41
>>546
Sheet1.CheckBox1でプロパティ値にアクセスできるし
changeイベントもあるからお好きなように
549:デフォルトの名無しさん
07/08/05 16:42:45
タスクみたいなタイマーで2時間に1回プログラムを実行させるにはどーすればいいの?
550:デフォルトの名無しさん
07/08/05 20:56:56
タスクを使えばいいんじゃね?
551:デフォルトの名無しさん
07/08/06 03:44:01
OSはVistaです。
エクセルで完成させた表を印刷しようとするとエラーになります。
通常のインターネットなどのページを印刷するのは可能なのですがエクセル・ワードだけはエラーがでてしまいます。
パソコンでプリンターの状態を見たら「アイドル」になったままで何をしても変わりません。
だれか助けてください。
552:551
07/08/06 03:45:26
スマソ。
板違いだった。
総合相談所スレにいってきます。
553:デフォルトの名無しさん
07/08/06 15:13:05
お世話になります。
accessからodbcを利用してプロシージャを実行させようとしているのですがエラーになって実行できません。
--ソースの一部----------------------------------
Dim tmp_qd As QueryDef
SQL = "exec プロシージャ_hoge"
tmp_qd.SQL = SQL
Set tmp_rs = tmp_qd.OpenRecordset()
------------------------------------
vbは良く分からない(初めて3日くらいです)のでこれでソースが足りるか分かりませんが、
上記の「tmp_qd.OpenRecordset()」でエラーが発生しています。
内容は
「 ODBC--呼び出しは失敗しました。 」
とダイアログに表示されます。
エラーの原因がなんだかわかりません。
お手数ですが、お願いいたします。
554:デフォルトの名無しさん
07/08/06 15:28:04
動いたら奇跡
555:デフォルトの名無しさん
07/08/06 15:53:57
>>554
他のコードです。
Dim db As Database
Dim qd As QueryDef
Dim rs As Recordset
Set db = CurrentDb()
qd.Connect = glcnst_ODBCConnect
qd.ReturnsRecords = True
qd.ODBCTimeout = 0
SQL = "exec pro_hoge"
qd.SQL = SQL
Set rs = qd.OpenRecordset()
何か文法等間違っている箇所があるのでしょうか?
お願いします。
556:デフォルトの名無しさん
07/08/06 17:39:57
currentdbはaccessでしか使えないし
sqlが何かわかってないし
どこが間違ってるかとかいうよりも
ちょっとずつしっかり勉強したほうがいいよ
557:デフォルトの名無しさん
07/08/06 18:58:04
>>556
了解しました
558:デフォルトの名無しさん
07/08/06 19:44:23
初めてカキコします。
スキルもないのに仕事を押し付けられた入社1年目の者です。
日報なのですが、日付を入力したら、その日の売上、仕入を表示できるようなプログラムはあるのでしょうか?
ご教授お願い致します
559:デフォルトの名無しさん
07/08/06 19:47:29
作ろうと思えば作れる。
ここは、そういうものを作る側のスレッド、板。
560:558
07/08/06 20:37:56
>>559
期限はないので勉強して作ってみます。
ありがとうございます
561:デフォルトの名無しさん
07/08/06 20:49:01
そんなん関数でやればいいじゃない
562:デフォルトの名無しさん
07/08/06 21:56:57
>>561
>日付を入力したら、その日の売上、仕入を表示できるようなプログラム
を関数で出来んのか?
563:デフォルトの名無しさん
07/08/06 22:20:15
>>562
横からだけど
関数で引っかかるのはどこだろう?
セルに日付を入れると別のシートにある売り上げと仕入れ
VLOOKUPでは駄目なのだろうか?
564:デフォルトの名無しさん
07/08/06 22:54:58
VBAを使って自分自身にジェクトのロック・アンロックをかけたいのですが
可能ならば教えてください
565:デフォルトの名無しさん
07/08/06 22:55:40
>>564
プロジェクトのロック・アンロックでした
566:デフォルトの名無しさん
07/08/07 09:43:03
>>564
可能だけど、それを自分で調べられないレベルの奴は
プロジェクト自体やモジュールをコードで弄るのはやめた方がいい
あと、やるならプロジェクトへのアクセス許可出さないとだめだからね
567:558
07/08/07 19:02:10
VLOOKUP関数で出来ました!
検索値を日報の日付の部分にしたら解決しました。
568:デフォルトの名無しさん
07/08/07 19:12:56
初めて質問させていただきます。
XML文書の妥当性チェックをXMLスキーマで行うため、以下のようにXMLSchemaCacheにaddしようとしたところ、②の段階でエラーが発生します。
①スキーマキャッシュオブジェクトの生成
Dim objScm As New MSXML2.XMLSchemaCache
②スキーマをキャッシュに追加
objScm.add "urn:bookList","C:\book.xsd"
実行時エラー スキーマのルート要素に対する定義が無効です。
どのようにすれば@ITの記事を参考にしてやっているのですが、どのようにして回避できるのかわかりません。環境はExcel2000, MSXML2.6を使用しています。よろしくお願いします。
569:デフォルトの名無しさん
07/08/07 20:55:54
MSXML2使うなら、これはExcelとは関係ないものなのでスレ違い
570:デフォルトの名無しさん
07/08/07 21:22:30
>>569
小さい野郎だな、静かにしろ
571:デフォルトの名無しさん
07/08/07 21:47:36
何でも斜に構えて、規律なんて糞食らえ、俺は大きな人間さ
というスタンスで居るのがカッコイイと思ってる年頃ってあるよねw
572:デフォルトの名無しさん
07/08/07 22:00:20
ゆとりはもう一度文章を読み返してから書き込もうぜ
573:568
07/08/07 22:01:44
>>569
XML総合と迷ったのですが、Excelマクロを用いてのXML操作ということで、ここはひとつお目こぼしを。
>>570
わたしのほうもスレ違いと言われて当たらずとも遠からずかもしれません。原因の一端は確実にわたしにありますので、あまりお責めにならないよう。
>>571
そういう時期は確かにありました。実際にカッコイイことはないと思うのですが、根拠レスに自分で自分をカッコイイと思える平和な時期だったのだと思います。
574:デフォルトの名無しさん
07/08/07 22:18:13
>>566
そー言わずになんかヒントちょうだい
575:デフォルトの名無しさん
07/08/07 22:25:08
>>573
だまってろカスブタ
576:デフォルトの名無しさん
07/08/07 23:25:53
Dim a, b
dim r as range
a = Split(Replace(r.Value, "@", " "), " ")
b = Split(Replace(r.Value, "a(0)", "*"), "*")
bはaで分割した最初の文字列を*に変換、*で分割といった感じにしたいのですが、
素人でよく分りません。よろしくお願いします。
577:デフォルトの名無しさん
07/08/07 23:30:25
"a(0)" -> a(0)
じゃだめか?
578:デフォルトの名無しさん
07/08/07 23:44:11
>>577
おお、できましたぁ!!!ありがとうございます~ペコリ
579:デフォルトの名無しさん
07/08/07 23:56:01
ただ、それだったら
a = "*" & mid$(r.Value,instr(r.Value,"@"))とかのが何ぼか軽いんじゃない?
(注:offsetの誤差は考慮してない)
580:デフォルトの名無しさん
07/08/07 23:57:13
あ、*でsplitしてるのか、ごめん勘違い
581:デフォルトの名無しさん
07/08/08 09:40:48
>>573
> Excelマクロを用いてのXML操作ということで
それはVBAの範疇じゃない
VB言語で[A]pplication(Excel)を操作するからVBA
これからAを取ったらVBなので、Excel付属のVBE使ったとしてもVBの分野
582:573
07/08/08 12:00:35
>>581
わかりました。他スレで質問させていただくことにします。お騒がせしました。
583:デフォルトの名無しさん
07/08/09 21:09:41
excelのvbaを使ってます。
ユーザーフォームで作成した複数のtextboxについて、コードを入力するとき
例えば
if textbox1 = ~ then
end if
if textbox2 = ~ then
end if
if textbox3 = ~ then
end if
などとせず
textboxの連番をうまいこと使ってまとめることってできないでしょうか?
584:デフォルトの名無しさん
07/08/09 21:21:27
あらかじめオブジェクト配列にでもセットしておけば?
585:デフォルトの名無しさん
07/08/09 21:21:57
>>583
~の内容とThenからEnd Ifの間次第なのに肝心な所を略してどうするの。
for i = 1 to 3
if Controls("textbox" & i) = ~ Then Stop
next
こういう事?
586:デフォルトの名無しさん
07/08/10 02:31:18 BE:703008239-2BP(218)
SolverAdd CellRef:=constraintCell.Address, Relation:=2, FormulaText:="1.00"
これで 拘束条件が 追加されないびょん
しかも、あるブックだけ・・・
どいうこと?
587:デフォルトの名無しさん
07/08/10 02:35:35 BE:390559853-2BP(218)
しかも、同じブックの その他のSolverAddは 動作するし・・・ なんなの? いやがらせ? > Excel 2003
For Each r In changeRange
SolverAdd CellRef:=r, Relation:=3, FormulaText:=0.0002
SolverAdd CellRef:=r, Relation:=1, FormulaText:=0.9998
Next r
は 動作するw
588:デフォルトの名無しさん
07/08/10 04:29:33 BE:1458089478-2BP(218)
"1.00" の代わりに "R1C10" にすると追加されたw
なんで0.0002や0.9998は問題ないのやら?w
589:デフォルトの名無しさん
07/08/10 04:44:49 BE:104149722-2BP(218)
"1.00"の代わりに 1 や 1# でも追加されないびょんw 0.999は追加されたw
変な ブックw
590:デフォルトの名無しさん
07/08/10 04:48:30 BE:416596782-2BP(218)
"1.00"の代わりに"0.999"にしたら追加されたw そんなに 1が嫌いなのか!
591:デフォルトの名無しさん
07/08/11 01:19:24
あまりにも単純な質問で申し訳ありませんが質問させてください。
VBAでユーザーフォームのテキストBOXにセルの内容を表記
させる事は普通には出来るのですが、セル内容が時刻の場合
上手くいきません。
セル(A1)がActiveとして10:00と入力されています。
それをtexttbox1に表記させるため
Userform1.textbox1.value = Activecell
とすると、表示されるのは「0.416666666666667」という不可解な
表記なんです。
「10:00」と表記させる方法をご教示下さい。
592:デフォルトの名無しさん
07/08/11 01:46:00
>>591
Userform1.textbox1.value = Activecell.Text
593:デフォルトの名無しさん
07/08/11 02:59:16
>>592
> >>591
> Userform1.textbox1.value = Activecell.Text
ありがとう御座います。セル側にtext指定するとは気がつきません
でした。本当に助かりました。
594:デフォルトの名無しさん
07/08/11 17:42:24
すみません、質問です。
マクロの閲覧などをロックしても、ある種のツールで解除出来たりしますが
これを回避する方法は、他のツールソフトなどを利用するしか、
手段は無いのでしょうか?
その場合、出来ればフリーで良いツールは有りませんか?
595:デフォルトの名無しさん
07/08/11 18:00:28
変数名をランダム&グローバルにして
クラス使わずすべて標準モジュールに記述
標準モジュールもランダムな名前で100個ぐらい作る
関数も全く関連性のないものを各々10個ぐらい用意
さらに関数もgoto文多用で1000ステップ
このくらいやれば自分も解析する気にならない
マジおすすめ
596:デフォルトの名無しさん
07/08/11 18:54:45
>>594
VBAプロジェクトの保護は、初心者の不用意な改変を防ぐ「ロック」であって
閲覧や漏洩を阻止する「セキュリティー」ではありません
そもそも、Excelは開発環境ではないのでソースの漏洩を防止しようとすること自体が間違い
Microsoftは強固なセキュリティーを付けることよりも、万が一パスワードを紛失しても、
膨大な時間を掛けて製作したマクロコードを失う結果に繋がらないように配慮しました
開発環境ではないExcelでは、ソースを書いたモジュール自体が、パスを付ける対象に組み込まれているので
モジュールのエクスポートなどをしていない状態でパスを紛失してパス外しが出来なかったら
コードを全て失うことになってしまうからね
その結果、普通にパスを掛けただけはもちろん、パス解除防止ツールでロックしても、
ちょっと面倒になるだけでパス外し自体は出来るようになっています
君が言う「ある種のツール」はコレ( URLリンク(passmaster.fujigoma.com) )
じゃないかもしれないけど、コレで「VBAパスワード保護」した程度ならちゃんと外せます
因みにコレくらいならVBAでも作れますよ
そして、コードが漏洩しない形でアドインなどを作りたい人には専用ソフトを用意しています
(Visual Studio Tools for Office)
あとは、専用ソフトを使ってでもセキュリティーを付けたいか、専用ソフトを使うくらいなら、
解除できる状態でも良しとするかはあなた次第なので、どうぞお好きなように
597:デフォルトの名無しさん
07/08/11 20:41:21
質問させてください。
会社で、エクセルを使って報告用紙の作成を命ぜられたのですが、
エクセルの知識は一般常識的なものしか持ち合わせていないので、
どなたかご教授願います。
C1の値が、A1~A5のいずれかの値と一致したならば、
E1に、その一致したA1~A5のいずれかのセルの右隣のセルに入力されている値(B1~B5のいずれか)
を表示する。
というような内容の関数を作りたいのですが、ネットで検索して1日悩みましたが、結局分かりませんでした。
私の予想では、IF関数とOR関数を使うような気がするのですが。。。
ちなみに関数は今まで使ったことがありません。プログラムの知識もありません。
どうぞ宜しくお願い致します。