Excel VBA質問スレ Part7
at TECH
1:デフォルトの名無しさん
08/06/04 22:56:59
すまんが2の人テンプレやって
ExcelのVBAに関する質問スレです
質問前に 【 >>2-3 】 あたりを良く読むこと
前スレ スレリンク(tech板)l50
★1 質問テンプレ(雛形)は用意しませんが、OSとExcelのバージョンは必ず書きましょう。
★2 ExcelのVBA以外の部分に関する質問はNGです。
但し、VBA無しでも出来ることだが、あえてVBAでやりたいって物に関してはOK。
★3 ExcelのVBE(Visual Basic Editor)を使うとしても、VBAの分野以外に関してはスレ違いです。
VBAとは、『Visual Basic for Application』の略で
Application
├Workbooks
|└Workbook
| ├Worksheets
| |└Worksheet
というApplication以下のオブジェクトを、VB言語で操作するものを指します。
例えExcel付属のVBE(Visual Basic Editor)を利用しようとも、このApplication以下のブックやシート、
セルやオブジェクト等を操作するもの以外はVBA分野の話ではないので、ここでは聞かないでください。
★4 とりあえず、Excelのインスタンスを作らずにVB6で出来ることは全てスレ違いだと思ってください。
★5 レベルはどうあれ、ここはプログラマ用の板スレです。プログラマとは、自分でプログラムを組み
コードを書く人の事なので、自分でやるきは全く無く、丸投げしようって人はお断りです。
ヒントを貰えばあとは自力でなんとかしますって人のみどうぞ。
2:デフォルトの名無しさん
08/06/04 22:57:51
過去スレ
01 スレリンク(tech板)
02 スレリンク(tech板)
03 スレリンク(tech板)
04 スレリンク(tech板)
05 スレリンク(tech板)
3:デフォルトの名無しさん
08/06/04 23:00:00
早速ですが
エクセルでVBAの
プログラムで001.csv-999.csvまでのCSVファイルを順に読んでアクセスDBに
入れたいのだが
まず変数 csvnameでCSVファイルを読み込むにはどうすればいいのですか?
4:デフォルトの名無しさん
08/06/05 00:35:48
Accessでやれ。
はい、次。
5:デフォルトの名無しさん
08/06/05 11:00:07
どうやったら彼女が出来ますか?
6:デフォルトの名無しさん
08/06/05 15:17:33
>>5
VBAを習得してからの私はそれはもうモテモテです
7:デフォルトの名無しさん
08/06/05 15:39:54
>>4
エクセルでのやり方が解らないからって代替を強制すんな無能
8:デフォルトの名無しさん
08/06/05 17:44:40
>>7
>>4ではないが、この要件にExcelをかます意味ある?
ExcelVBAが得意な人がわざわざExcelVBAでやるならわかるけど、
ExcelVBAが使えないならAccessVBAなりVBなりの質問掲示板で質問するべきでは?
9:デフォルトの名無しさん
08/06/05 18:16:24
>>8
バカじゃねえのか?
エクセルVBAでって指定してんだから、意味なんかお前が勝手に判断すんなボケ
10:デフォルトの名無しさん
08/06/05 18:22:48
アクセスって立ち上げるの面倒くさい。
11:デフォルトの名無しさん
08/06/05 18:25:03
>>8
まぁまぁ、そんなイライラせずに仲良くやろうよ(^^
そんで、なんでわざわざExcelVBAを使いたいんだーい?
12:デフォルトの名無しさん
08/06/05 18:57:26
全スレ>>998
ありがとうございました。 パターン 「.*?」 の正規表現ですっきりできました。
13:3
08/06/05 19:05:53
自己解決しました。
14:デフォルトの名無しさん
08/06/05 19:23:04
チェックボックスをONにしたらOffset(0,10)に"1"を入れる方法教えて下さい
15:14
08/06/05 19:46:24
できたからいいわw
16:デフォルトの名無しさん
08/06/05 20:20:32
ExcelVBAで、g解決しました。
17:デフォルトの名無しさん
08/06/06 02:16:52
>>11
あるよ。
以上。
はい、次。
18:デフォルトの名無しさん
08/06/06 20:37:48
教えてください・・
エクセルVBAで質問です
二次元配列で例えば、ab(a、1)=10だとして
変数wk-hensuに、1が入っていたとします
wk-hensuの1を使って二次元配列の10の値を
取得したいのですが、どうすればよろしいですか?
19:デフォルトの名無しさん
08/06/06 20:46:47
さっぱり意味がわからない
20:デフォルトの名無しさん
08/06/06 20:57:35
>>18
ab(a、wk-hensu)=10
こうですか!?わかりません!
21:デフォルトの名無しさん
08/06/06 22:23:45
Dim STMM As Worksheets
Dim STEE As Worksheets
Set STEE = Sheets("平面" & CStr(a%))
Set STMM = Sheets("データ" & a%)
オブジェクトがはいらん。なんで?
なにがいけないのか?
22:デフォルトの名無しさん
08/06/06 22:26:43
>>18
>>20
これが正解だと思われ
23:デフォルトの名無しさん
08/06/06 22:32:51
>>22
それだと取得できないぞ。
24:デフォルトの名無しさん
08/06/06 22:35:11
>>23
そうだね
ab(a、wk-hensu)=10 じゃなくて
新しい変数=ab(a、wk-hensu) だね
25:デフォルトの名無しさん
08/06/07 00:02:54
>>21
>なにがいけないのか?
変数の型
26:デフォルトの名無しさん
08/06/07 08:25:59
コレクションがよくわからん。
最近、VBも使うようにしてるので、オブジェクトSetも努力しているんだが、
たとえばこの>>21のケースのように、
sheetsを特定して格納したい、workbookを特定して格納したい、
ってときはどんなオブジェクトを宣言すればよろしい?
rangeオブジェクトのときは、cell範囲指定すれば入ることはわかるがどーちがうのかな・・
頼むヒントを
27:デフォルトの名無しさん
08/06/07 08:56:31
いや、ヘルプ見ろよ
28:デフォルトの名無しさん
08/06/07 10:12:07
折れにはよくはわからんが、
Dim STMM As Worksheet
Dim STEE As Worksheet
で、だめかな?
29:28
08/06/07 10:16:26
worksheetsとsを付けたから跳ねられていると推測しただけ。
30:25
08/06/07 13:41:08
>>26
worksheets型はワークシートコレクションオブジェクト
使い方は、
dim ws as worksheets
set ws= thisworkbook.worksheets
ってカンジ
まず、worksheets型変数の使い道はない
worksheet型はワークシートオブジェクト
使い方は、
dim ws as worksheet
set ws = thisworkbook.worksheets("Sheet1")
ってカンジ
普通はこっち
31:デフォルトの名無しさん
08/06/07 17:11:46
セルのA1からA10と、B1からB10に数値が入っています
これをgolf(9,9)配列に入れたい場合はどうすればいいですか?
初心者なのでよくわかりません。お願いします
32:デフォルトの名無しさん
08/06/07 17:43:44
>>31
>golf(9,9)
10×10=100要素あるけど、どこに入れたいの?
dim golf() as variant
golf()=range("A1","B10").value
って方法もあるよ
33:デフォルトの名無しさん
08/06/07 17:57:57
>>32
ありがとうございます!
できました
もうひとついいですか?
先ほどの続きで
エクセルをイメージしています
A B C
1 0 0 10
2 0 1 11
3 0 2 12
4 0 3 13
5 0 4 14
6 0 5 15
7 0 6 16
8 0 7 17
9 0 8 18
golf(0,0)=10
golf(0,1)=11
・
・
とプログラムで打つのが面倒なので、簡単に配列にセル値(ここでいうC列)を
代入できることは可能ですか?
34:デフォルトの名無しさん
08/06/07 19:06:54
>>33
dim i as long
for i=0 to 9
golf(0,i)=cells(i+1,"C").value
next i
35:デフォルトの名無しさん
08/06/07 19:35:17
>>34
インデックスが有効範囲にありませんとでますが
どうしたらいいでしょうか?
36:デフォルトの名無しさん
08/06/07 19:50:11
golf(0,i)=cells(i+1,3).value かな
37:デフォルトの名無しさん
08/06/07 19:53:26
>>35
golfを適切に宣言してますか?
>>36
??
38:デフォルトの名無しさん
08/06/07 19:54:38
"C"でも行けるよ
golfをちゃんとdimしてないんだろ
39:38
08/06/07 19:55:13
おっとすまんかぶった
40:35
08/06/07 20:00:22
golfはdim golf() as variantと宣言しています・・・
41:デフォルトの名無しさん
08/06/07 20:27:07
うん、それじゃダメだね
42:デフォルトの名無しさん
08/06/07 20:27:44
>>40
この場合は dim golf(9,9) で宣言する
43:35
08/06/07 20:36:53
できました!!ありがとうございます!
44:26
08/06/07 21:28:31
おお、ありがとう。
なるほどWorksheetで宣言するのか。入った入った。これでキレイなコーディングに一歩近づいた。
さっき超アツイ事をしった。
Inputbox関数
Application.Inputboxメソッド
後者のメソッドはTypeが指定できるぜ!
45:デフォルトの名無しさん
08/06/08 09:54:38
ブックAとブックBが開かれているときに、
ブックAからブックBのmacro1()を実行したい場合
call ブックA.xls!macro1
でいいのでしょうか。
46:デフォルトの名無しさん
08/06/08 10:08:31
やってみれば済む話だろう
47:45
08/06/08 11:31:11
それが、最近も出来ていたと思うんですが、今回、コンパイルエラーで跳ねられた。
!の所をさして、修正候補 又は( という具合で。
どうも、文法的に勘違いをしていたようなので、訊いてみました。
現実には、.runで解決済みですが。
48:デフォルトの名無しさん
08/06/08 13:19:15
ならば>>45の回答は「だめ」
49:デフォルトの名無しさん
08/06/08 22:06:40
超くだらねーことかもしれんが、適当な変数宣言の一般的な名称ってどんなもんがあるかね?
@たとえば、インテジャーなら?
Aロングなら何使う?
Bレンジなら?
Cワークシートなら?
Dブーリアンなら?
俺は考えるのが面倒だからすぐバカみたいな変数宣言するので
とても人に見せれん。
TAROU
UNKO
MANKO
DEVILMAN
RAOU
KENSIROU
とかよ。
数年たっても自分のクセなんで、クチャクチャな宣言でも自分はわかるんだよね、これが。
50:デフォルトの名無しさん
08/06/09 00:00:34
>>49
型はさておき、その変数が指すものを表現する名前がいいんじゃないか。
太郎くんのことを表現したいのならTAROUでも差し支えないと思う。
51:デフォルトの名無しさん
08/06/09 00:14:40
個人オンリーのものなら好き勝手に
会社とかで、んな変数名にしていやがったら、張り倒すけどな。
52:デフォルトの名無しさん
08/06/09 06:57:39
一般的な変数名なんてループに使うi、j、kくらいだべ
53:デフォルトの名無しさん
08/06/09 13:21:18
TZEF2101
CMED9301
54:デフォルトの名無しさん
08/06/09 23:08:23
>>51
当然会社のやつ。俺以外はVBAの変数を理解しているやつがいないからやっちまった。
>>52
ループでそれらの変数は使うのかな?
俺の場合、ループの時はインテジャなら大体a%,b%とかで適当に回す。
なんかだれがみてもわかるような変数や構文のコツがあるかな。
たとえばプライベートサブやらを Callするときは必ず全角文字を使うとか、コメントをつけまくるってクセは付けてる。
55:デフォルトの名無しさん
08/06/09 23:14:34
ループは俺もi、j、k、l、Index、この辺だな
てか会社でそんなあほなことは絶対にやめておけ
どんな業種か知らんがたいてい知らん振りしてるだけでけっこう知ってる人はいるもんだ
56:デフォルトの名無しさん
08/06/09 23:15:10
VBAをかなり理解してるやつ(ステートメント、条件式、階層の完全理解くらい)とか身近な人間でいる?
会社とか大きな組織とか行くと多少のVBAプログラムされているものは見るが、
バグの固まりみたいなもので、共有して使っているのが不思議なものしかみたことない。
手順書すらなくて、非常に困る。
俺的にはこんなものはプログラムではない、と思うんだが、そんなこと偉そうに言える立場ではないので
我慢してヒマを見てはコードを改造しているが、似たような境遇の人はいないかい?
57:デフォルトの名無しさん
08/06/09 23:21:20
>>55
以後気をつけます。 しっかし、変数名考えるのめんどくせぇーなー。
ところで、自分はあんまりやったことないんだが、↓
dim I(100) as Long
↑これってインデックス付きの変数Iを100個宣言してるんだよね?
で、代入するときは
I(1)=1
I(2)=5 とかで。
この番号ふった大量の変数Iを活用するには当然ループさせるときに効果を発揮すると思うんだが、
俺を相手してくれる暇人が居るならば、具体的になんか適当なコードを書いてみせてくれんかな?
58:デフォルトの名無しさん
08/06/09 23:28:11
Dim i(1 to 10) As Integer とか俺はけっこう使うぞ
59:デフォルトの名無しさん
08/06/10 00:55:39
配列を効率的に使いこなせるようになったら脱VBA初心者
と、個人的に思ってる
やっとこのレベルあたりで独力で多少役に立つモノ作れるようになるんじゃない?
60:デフォルトの名無しさん
08/06/10 02:39:35
マスタのシートの表で0という値が入力された場合に
特定のシートを非表示にさせるには
どのようにすればよろしいのでしょうか?
61:デフォルトの名無しさん
08/06/10 02:50:43
>>60
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address(False, False) = "A1" Then
Select Case Target.Value
Case 0
Sheet2.Visible = xlSheetHidden
Case 1
Sheet2.Visible = xlSheetVisible
End Select
End If
End Sub
62:p2134-ipbf1308souka.saitama.ocn.ne.jp
08/06/10 10:29:29
63:デフォルトの名無しさん
08/06/10 11:36:10
創価ktkr
64:デフォルトの名無しさん
08/06/10 18:00:38
>>49はスゲーと思う。
俺なんて適当でも、ハンガリアン表記?ってやつの呪縛から逃れられない。
かといって、確実に誰でもわかるかっていったらどうなのか微妙な中途半端さ
何にもないところからデビルマンとかケンシロウが出てくるお前ってスゲーな。
65:デフォルトの名無しさん
08/06/10 20:51:58
RPGのキャラの名前はデフォのままってタイプだな>>64は
66:デフォルトの名無しさん
08/06/10 21:53:09
変数名とか普通にi、j、k…で十分じゃね?
67:デフォルトの名無しさん
08/06/10 22:14:36
regexpについて質問させてください。
動作的な問題では無く、何とか動かしてはいるのですが、気になることがあります。
executeメソッドは、マッチしたものを”コレクション”に格納して行くと説明文にあります。
通常のコレクションの場合、デフォルトだと MyCollection(1) から格納されて行くと記憶しておりますが、
regexpのexecuteで格納されて行くコレクションには、MyMatch(0) から格納されております。
漠然と、配列は (0) から、コレクションは (1) から、と覚えていたのですが、
regexpの”コレクション”は、VBAで定義する通常のコレクションとは異なる物なのでしょうか。
また、(0)から格納されているので、実は配列なのかと思い、joinを試したのですがダメでした。
そこで for でまわして、 MyArray(i) = MyMatch(i) と、一度配列に再格納してからjoinを行っております。
この方法について、何か最適化の手立てはありますでしょうか。
なにとぞご教授をよろしくお願いします。
68:デフォルトの名無しさん
08/06/11 00:02:07
>>67
CollectionとMatchCollectionは別物
名前が似てるからって勝手に同一視してはいけない
ていうか、DictionaryオブジェクトみたいにKeysとかItemsとかって
プロパティがあればJoinも可能だけど、MatchCollectionには
ItemとCountしかプロパティが無いんだからどう考えても無理
>MyArray(i) = MyMatch(i) と、一度配列に再格納してからjoin
どうせループするんだから配列に格納してからJoinなんてせず、
ループしながら連結すればいい
69:デフォルトの名無しさん
08/06/11 07:45:48
Dateadd使っての日付計算で困っています
シート:
A列には”注射”という文字を入れるようにします。
B列には1月1日から12月31日まで入っています。
C列はB列の90日後を入れるようにします。
D列はC列の3日前を入れます。・・・としたいのですがその3日の間A列に”注射”が入っていたらその日を入れずに3日前にしたいのです。 稼働日みたいな感じでしょうか・・・・どうしたらよいでしょうか?お願いします。
例としてB列の「1月1日」の90日後はC列「3月31日」でD列は通常「3月28日」が入っていますがB列「3月30日」の左のA列に”注射”があったらそこを無視して「3月27日」と入れたいのです。
DateaddじゃなくてDo
While〜でC列の日付より3日前にした方がいいのでしょうか…そしてA列に注射の文字列がない場合?すみません…どうしていいのかちんぷんかんぷんです…Sub count()
Dim i As Long
Dim lastrow As Long
lastrow = Range("B1").End(xlDown).Row
For i = 1 To lastrow
Cells(i, 3).Value = DateAdd("d", 90, Cells(i, 2).Value)
Next
For i = 1 To lastrow
Cells(i, 4).Value = DateAdd("d", -3, Cells(i, 3).Value)
Next
End Sub
説明が下手なのでもしよかったら実際作ったものを見ていただいた方が分かるかもしれません。
URLリンク(briefcase.yahoo.co.jp)
70:デフォルトの名無しさん
08/06/11 13:35:29
>69 こういうことですか?
A B C D
−−−−−−−−−−−−−−−−−−−−−−−−−
1 空白 2008/1/1 =B1+90 =IF(A91="注射",C1-4,C1-3)
−−−−−−−−−−−−−−−−−−−−−−−−−
2 空白 =B1+1 =B1+90 =IF(A92="注射",C2-4,C2-3)
−−−−−−−−−−−−−−−−−−−−−−−−−
3 空白 =B2+1 =B1+90 =IF(A93="注射",C3-4,C3-3)
−−−−−−−−−−−−−−−−−−−−−−−−−
−−−−−−−−−−−−−−−−−−−−−−−−−
90 空白 =B89+1 =B90+90 =IF(A180="注射",C90-4,C90-3)
−−−−−−−−−−−−−−−−−−−−−−−−−
91 注射 =B90+1 =B91+90 =IF(A181="注射",C91-4,C90-3)
−−−−−−−−−−−−−−−−−−−−−−−−−
単に90日後の行のA列の値で判断できるのであれば、IF関数でいいけど、
「その3日の間A列に”注射”が入っていたらその日を入れずに」ということ
であれば、88日後の行、89日後の行もA列に"注射"があるかどうかを
調べる必要がありますね。作業列を使えばいいようです。 次?に続きます。
71:デフォルトの名無しさん
08/06/11 13:52:02
88〜90日後の3日間の「注射」の有無をみるのであれば作業用の3列を組み合わせる方法がいいかと思います。
A B C D E F G
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
1 空白 2008/1/1 =B1+90 =C1-SUM(3,E1:G1) =IF(A89="注射",1,0) =IF(A90="注射",1,0) =IF(A91="注射",1,0)
−−−−−−−−−−−−−−−−−−−−−−−−−
−−−−−−−−−−−−−−−−−−−−−−−−−
89 注射 =B88+1 =B89+90
−−−−−−−−−−−−−−−−−−−−−−−−−
90 空白 =B89+1 =B90+90
−−−−−−−−−−−−−−−−−−−−−−−−−
91 注射 =B90+1 =B91+90
−−−−−−−−−−−−−−−−−−−−−−−−−
上記の例では、A89とA91が「注射」なので、E1とG1が1、F1は0なので、D1の値は3月26日に
なります。
72:デフォルトの名無しさん
08/06/11 14:50:38
>>70
VBA質問スレですが…
73:70,71
08/06/11 15:07:32
>72
そうでしたね。しかも71まで書いちゃって。おはずかしい。
ではVBAで
D列の値を設定する部分をこうしたらどうでしょう。
ループ用変数 j as long を追加したうえで、69のソースの下から4行目から3行分を
For i = 1 To lastrow
Cells(i, 4).Value = DateAdd("d", -3, Cells(i, 3).Value)
追加 For j = 88 to 90
追加 if Cells(i + j, 1).value = "注射" Then
追加 Cells(i, 4).Value = Cells(i, 4).Value - 1
追加 end If
追加 Next j
Next
調査範囲の3日間について、注射という文字があれば各1日ずつ前の日付になります。
74:67
08/06/11 21:42:37
>>68
レスありがとうございました。
お教えの通り、
cells(i,2).value = cells(i,2).value & vblf & myMatch(j)
のような形で連結させる事ができました。
本当にありがとうございます。
75:デフォルトの名無しさん
08/06/11 23:27:58
>>68
まさかループしながら&演算子で連結しろって言ってないよな?
76:デフォルトの名無しさん
08/06/11 23:31:12
>>75
勿論そのつもり
何でまさかなのかわからん
77:デフォルトの名無しさん
08/06/12 00:39:15
OSはXPでエクセル2003です。
二つの正の整数の公約数を全て求め、
セルに一つずつ表示させるようなプログラムをVBAで作りたいのですが、
a = InputBox("正の整数を入力してください。")
If a < 0 Then
MsgBox ("正の整数を入力してください。")
End If
Cells(1, 1).Value = a
b = InputBox("正の整数を入力してください。")
If b < 0 Then
MsgBox ("正の整数を入力してください。")
End If
Cells(2, 1).Value = b
If a < b Then
a = c
Else
b = c
End If
For e = 2 To c Step 1
f = a Mod e
Cells(5, c).Value = f
g = b Mod e
Cells(6, c).Value = g
Next
End Sub
ここまで書いて挫折しそうです。どなたかアドバイスをいただけませんか?
78:デフォルトの名無しさん
08/06/12 01:07:46
>>77
間違ってたらすまん
Dim a As Long, b As Long, c As Long, e As Long, f As Long
On Error Resume Next
Do
a = Application.InputBox("正の整数を入力してください。", , , , , , 1)
If a = -1 Then Exit Sub 'ループ脱出用 -1を入力したら終了
Loop Until a > 0
Do
b = Application.InputBox("正の整数を入力してください。", , , , , , 1)
If b = -1 Then Exit Sub
Loop Until b > 0
On Error GoTo 0
If a < b Then
c = a
Else
c = b
End If
Range("A1").Value = a
Range("A2").Value = b
f = 1
For e = 2 To c
If a Mod e = 0 Then
If b Mod e = 0 Then
Cells(f, "B").Value = e
f = f + 1
End If
End If
Next
79:デフォルトの名無しさん
08/06/12 01:08:04
ユーザフォームを表示したいので、以下のようにやったのですが、エラーになります。
Private Sub XXX()
Dim DlgInst As UserForm1
'インスタンス作成
Set DlgInst = UserForm1
'表示する。
DlgInst.Show
Unload DlgInst
End Sub
実行時エラー'424'
オブジェクトが必要です。
自分の理解では
CUserForm1 * pDlg;
pDlg = new CUserForm1;
pDlg->Show();
pDlg->SendMessage(WM_CLOSE);
というつもりで書いたのですが。。
VBAの場合、どうやってユーザフォームを表示するのが正しいのですか??
80:デフォルトの名無しさん
08/06/12 01:10:55
>>78さんありがとうございます。
参考にさせていただきます。
81:デフォルトの名無しさん
08/06/12 01:12:59
>>79
VBAではダイレクトに UserForm1.Show
Unload は UserForm1 のコマンドボタンのクリックイベントなどに書く
その場合は一般的に、 Unload UserForm1 では無く、 Unload Me と書く
82:デフォルトの名無しさん
08/06/12 01:16:29
>>69です
どうも要件が私自身混乱してしまって・・・C列に入る日付とかは度外視してください。
とにかく入っている日付を3日前倒します。
条件はA列を参照しもし文字が入っていなければ稼働日とみなす 文字があればそういった日を抜かし
3日前倒す としたいんですがうまくいきません 別サンプル作ってみたけど・・・ダメでした
Sub count()
Dim i As Long
Dim j As Long
Dim lastrow As Long
Dim ctr As Long
lastrow = Range("D12").End(xlDown).Row
For i = 12 To lastrow
Cells(i, .Value = DateAdd("d", 30, Cells(i, 4).Value)
Next
For i = 12 To lastrow
j = lastrow
Do While Cells(i, .Value <> Cells(j, 4).Value
j = j - 1
If j = 0 Then Exit Sub
Loop
Do While ctr < 4
If InStr(1, Cells(j - 1, 7).Value, "病院", 1) = 0 Then
ctr = ctr + 1
End If
j = j - 1
Loop
Cells(i, 11).Value = Sheets("Sheet1").Cells(j, 4).Value
ctr = 0
Next
End Sub
83:デフォルトの名無しさん
08/06/12 01:22:50
>>82
>Cells(i, .Value
コレは何を意味してんの?
84:デフォルトの名無しさん
08/06/12 01:22:54
>>81
ありがとうございます。
UserForm1は型であるという私の考え方が間違っていて、
UserForm1は型であり、オブジェクトのインスタンスであると考えるのがVBAなのでしょうか?
(どうせシングルスレッドだし、複数のインスタンスは作れないから?)
うーーーーん
VBAムズカシイ
85:84
08/06/12 01:27:10
とおもったけどやっぱり同じエラーが。
よく見たらUserForm1.Initializeで変な記述してたのが原因でした。
86:デフォルトの名無しさん
08/06/12 01:31:13
>>84
いや、VBAのUserFormは特別扱いだと思う
難しく考えると腹立つと思うよ
インスタンスという考え自体を意識しないでいいように設計されているんだと思う
VBA使いの98%(単なるオレの偏見)はインスタンスが何かも理解してない上に
インスタンスという言葉さえ知らないと思う
New すれば複数のインスタンスも作れるんじゃないかな?(未確認)
あくまでも、個人的な見解です
87:デフォルトの名無しさん
08/06/12 01:35:50
>>85
VBEの ツール - オプション - 全般 - エラートラップ を クラスモジュールで中断
にチェックすると幸せになれるよ
88:デフォルトの名無しさん
08/06/12 02:06:33
>>86
なるほど。わかりました!深く考えないことにします
>>87
早速やってみます。ありがとうございました
89:デフォルトの名無しさん
08/06/12 07:08:00
>>82です
なんかコピペしたら消えてました・・・
>Cells(i, 8).Value です
90:70,71,73
08/06/12 07:51:25
要件をはっきりさせましょう。
A列:通常は空白であるが、「注射」などの文字(数字も?)が入ることがある
→何かはいっていた場合に「別の行の」D列に影響する
B列:連続した日付が入る(仮定として、B2セルに2008/1/1から366日分入っているものとする。)
C列:B列の90日後の日付が入る、ということでしたが、
「C列の日付は度外視してください」とは、ここはD列の日付設定に関係しないということですか?
D列:通常ならばB列の87日後の日付が入るけど、
B列の90行下方のA列が空白でないとき
条件 B列の88〜90行下の3行のA列のうちひとつでも空白でないとき
B列の88〜90行下の3行のA列のうち空白でないセルの数だけ
処理 通常のD列の日付を前倒しする。
条件は3通りのうちどれですか? 上の要件になにか誤りがありますか?
91:デフォルトの名無しさん
08/06/12 12:16:59
要件がかなり自分でもわからなくなってしまったのでもっと単純にしてみました。文章下手ですみませんが分かりやすくなりましたでしょうか?
VBAで*稼働日後の日付を出すとする。
A列には日付2008/1/1〜2009/3/31まで入っています。
B列には『休』とお休みに該当した日をいれます。(土日とは限らない)
例として1月1日(A1セル)が休みとしたらB1セルに『休』と入れお休み表にします。
C列には適当な日を手入力します。(規則性は全く無し)
D列はC列の3稼働日後を入れたいです。
AやB列からどうスキャンし3稼働日後を出したらよいのか…ちなみにアドイン関数は無いので使えません…よろしくお願いいたします。
92:デフォルトの名無しさん
08/06/12 12:24:29
稼働日に連番を振るのがいちばん簡単だな
93:デフォルトの名無しさん
08/06/12 12:32:15
回答ありがとうございます。
すみません。連番をふるとはどういうことでしょうか?初心者なので検討がつきません…
94:デフォルトの名無しさん
08/06/12 12:41:04
つまりだな
日付 休日 連番
4/1 1
4/2 2
4/3 休
4/4 3
4/5 4
こんな感じ。4/1の3稼働日後は1+3=4だから連番が4の4/5になる
95:デフォルトの名無しさん
08/06/12 15:01:55
印刷しようとする時にそのシートに"菓子"という言葉が無かったら印刷せず、
msgboxにて"菓子がありません"と表示するにはどうすれば良いんだよ、おしえろマクロヲタども
96:70,71,73,90
08/06/12 18:00:46
>91
70,71,73,90です。最初(69番の書き込み)から90日後云々が消えちゃいましたが・・・
それから3営業日「前」の日付を求めたい、とあったのが今度は3営業日「後」の日付を
求めるんですか?
では、A列にカレンダー(1月1日〜12月31日)、B列に何かデータがあれば休みという前提で、
C1セルに日付を入力したら3営業日「後」の日付を求めるということで考えてみます。
C1セルの日付がカレンダーの何行目になるのかは、
Cells("C1").Value - Cells("A1").Value + 1 で求められます。A1セルを1/1としてます。
単純に3日後であれば3行下のA列の値でいいんですが、B列に何かあったらさらに1行下となるので、
ループを利用します。
Dim Tate As Long, i As Long
Sub D_day()
Tate = DateDiff("d", Cells(1, 1).Value, Cells(1, 3).Value) + 1
i = 0
Do
Tate = Tate + 1
If Cells(Tate, 2).Value = "" Then 営業日だけ
i = i + 1 カウントアップ
End If
Loop Until (i > 2) 3営業日になったらループ脱出
Cells(1, 4).Value = Cells(Tate, 1).Value
End Sub
これでどうでしょうか?
97:70,71,73,90
08/06/12 18:11:56
96の続き
求める日付はD1セルに出力するようにしてますが、69の書き込みからいくと
基準日はC1のような固定ではないのかな?
何をしたいのかがイマイチよくわからない。
98:デフォルトの名無しさん
08/06/12 18:50:30
なんつーか・・・
いい加減にしろ
99:デフォルトの名無しさん
08/06/12 19:20:34
すいません95ですがホント教えてくれ
100:デフォルトの名無しさん
08/06/12 19:28:58
>>99
| ̄``''- 、
| `゙''ー- 、 ________
| ,. -‐ ''´ ̄ ̄`ヽ、_ /
|, - '´ ̄ `ヽ、 /
/ `ヽ、ヽ /
_/ ヽヽ/
/ / / / / / ヽハ
く / /! | 〃 _/__ l| | | | | | | ||ヽ
\l// / | /|'´ ∧ || | |ー、|| | | l | ヽ
/ハ/ | | ヽ/ ヽ | ヽ | || /|ヽ/! |/ | ヽ
/ | ||ヽ { ,r===、 \| _!V |// // .! |
| || |l |ヽ!'´ ̄`゙ , ==ミ、 /イ川 |─┘
| ハ|| || | """ ┌---┐ ` / // |
V !ヽ ト! ヽ、 | ! / //| /
ヽ! \ハ` 、 ヽ、__ノ ,.イ/ // | /
┌/)/)/)/)/)/)/)/)/)/)lー/ ` ー‐┬ '´ レ//l/ |/
|(/(/(/(/(/(/(/(/(/(/│|| |\ 〃
r'´ ̄ヽ. | | ト / \
/  ̄`ア | | | ⌒/ 入
〉  ̄二) 知ってるが | | | / // ヽ
〈! ,. -' | | ヽ∠-----', '´ ',
| \| | .お前の態度が | |<二Z二 ̄ / ',
| | | _r'---| [ ``ヽ、 ',
| | | 気に入らない >-、__ [ ヽ !
\.| l. ヽ、 [ ヽ |
ヽ| \ r' ヽ、 |
101:デフォルトの名無しさん
08/06/12 19:45:00
VBA最近勉強し始めたものです。ネットで入門とかいろいろあさったですがよくわかりませんでした(汗)
質問1.マクロに登録したショートカットやVBAのプログラムって、指定ファイルの指定シートだけで有効にするにはどうすればよいのでしょうか?
VBAの画面で、左に出ているオブジェクトのSheet1とかに目的のプログラム書いただけでは駄目なのでしょうか?
例えば、「セルA1の内容を消去」をCtrl+zに登録したとき、同時に他のエクセルファイルやシートを選択時、Ctrl+zでも
「セルA1の内容を消去」が実行されないようにしたいです。
質問2.同じセルで入出力兼用にするにはどうすればいいですか?後、入出力で同じセルのフォントを変えることできますか?
例えば、B1=A1+5は必ず成り立つとして、先にA1に10を黒字で入力したらB1に15という数字が赤字で表示され、また先にB1に
7を黒字で入力したらA1に赤字で2よ表示されるみたいなのがやりたいです。
恐らく、すごく初歩の質問だと思いますが、誘導でも構いませんので何かご教授いただければありがたいです。
よろしくお願いします。
102:デフォルトの名無しさん
08/06/12 19:51:27
VBAでプログラムに興味もったがExcelVBAでなんでもできすぎて他のに興味がいかない。
103:デフォルトの名無しさん
08/06/12 20:26:18
>101
マクロのはじめの方にカレントブック、カレントシートを取得する部分を書いて、
処理を許可する対象のブック、シートと同じなら処理を続ける、異なるなら
マクロを終了するという分岐を入れたら?
ブック名とシート名の取得は↓を参考にしてください。
Sub test_sub()
MsgBox ("処理対象のブック名は : " & ActiveWorkbook.Name)
MsgBox ("処理対象のシート名は : " & ActiveSheet.Name)
End Sub
104:デフォルトの名無しさん
08/06/12 21:21:19
>101
質問2の方
以前のスレのFAQを参考にしてみました。
シートに以下のマクロを書いて、適当なセルに数字かなにか入れてみてください。
セル位置と入力した内容をメッセージボックスに表示する処理です。
Private Sub Worksheet_Change(ByVal Target As Range)
Dim adr As Variant, naiyo As Variant
Application.EnableEvents = False
adr = Target.Address
naiyo = Target.Value
Application.EnableEvents = True
MsgBox ("セル位置:" & adr)
MsgBox ("セル内容:" & naiyo)
End Sub
セル書式の設定はマクロの記録をやってみてね。
以上
105:デフォルトの名無しさん
08/06/12 21:43:20
>>96さんありがとうございます。
今までの書き込みは全て”リセット”という意味で書きました。
問題を単純化し応用したいためです。なので90日は要件から外しています。
私自身の要件がしっかりしてなくてすみません。
A列:日付2008/1/1〜2009/3/31
B列:休みの印を付ける欄(4月1日が休みだったらその横にあるB列に「休」と入れるだけ
C列:何日後といった規則性は全くありません ”手作業”で適当に日付入れるところです。
D列:C列の3稼働日を出すセルです。
方法がどうしたらよいか想像がつきません。
このような結果が欲しいというのを見てもらった方がいいかもしれません。
URLリンク(briefcase.yahoo.co.jp)
106:デフォルトの名無しさん
08/06/12 22:35:46
>105
こんなんでどうですか?
ところで、アップされたブックのファイル名はなんだったんですか?文字化けしてたようですが。
Option Explicit
Dim Tate1 As Long, Tate2 As Long, c_shift As Long, i As Integer
Sub sample()
c_shift = 2 ' A2からカレンダー始まる
Tate1 = 2 ' B列の開始行位置
Do
If IsDate(Cells(Tate1, 3).Value) Then ' C列の値が日付かどうか
Call D_day(Tate1)
Tate1 = Tate1 + 1
Else
Exit Do ' 日付じゃなければ処理を終わる
End If
Loop While (1)
End Sub
Private Sub D_day(w_Tate As Long)
Tate2 = DateDiff("d", Range("A2").Value, Cells(w_Tate, 3).Value) + c_shift
i = 0
Do
Tate2 = Tate2 + 1
If Cells(Tate2, 2).Value = "" Then '営業日だけ
i = i + 1 'カウントアップ
End If
Loop Until (i > 2) '3営業日になったらループ脱出
Cells(w_Tate, 4).Value = Cells(Tate2, 1).Value ' D列に出力
End Sub
ところで、実際にアップされたブックで実行してみたら、結果が異なる部分がありました。
C3セルの2月10日の3稼働日後は2月15日ではありませんか?(2月13,14日は
「休」ですよ。)他にもいくつも結果が異なっている部分があります。というかほとんど。
107:デフォルトの名無しさん
08/06/12 23:16:26
>>102
俺もそう。
内側からの操作の方がやりやすいし、外からやりたい時だけ無料のVBで
適当に動かせば問題なし。
強いて言えば、シートをスクロールさせるプログラムを組み込まないと画面が見づらい程度か。
108:デフォルトの名無しさん
08/06/12 23:26:57
>>105です ありがとうございます。
なんとか光明が見えてきましたが・・・
If Cells(Tate2, 2).Value = "" Then '営業日だけ
で実行時エラー1004 アプリケーション定義またはオブジェクトのエラーがでました。
当方Excel97を未だに使用なので原因はこれですか?
ファイル名は稼働日.xlsです。根本的に3稼働日の数え方が間違ってました・・・すみません
109:105
08/06/12 23:44:04
>107
Excel97は久しく使ってない。 けど変な動きをするのであれば
コメント部分は消してください。'の前の空白も含めて。
110:109
08/06/12 23:45:55
間違えた。
>108だった。
もう寝る。
111:デフォルトの名無しさん
08/06/13 09:06:00
>>76
普通は&演算子で連結しない。
だんだんサイズを大きくしていくのはメモリ確保に時間をとられる。
112:デフォルトの名無しさん
08/06/13 10:37:33
>>110さんありがとうございます。やっぱりバージョンみたいでした。これを応用して3稼働日前やってみてますがうまくいきませぬ…なんでだ…(;_;)
113:106,109,110
08/06/13 12:46:24
>112
Excel97でも問題ないです。現に、1997年ものの日立フローラ(Windows95,Excel97)で
試してみましたがエラーにはなりませんでした。ソースに間違いがあるはず。
Option Explicitを先頭に入れてますか?これで変数の間違いはチェックできます。
自分のフローラは液晶一体型デスクトップですが、昔のパソコンは丈夫ですね。
当時実売価格50万以上もした代物です。Linuxでも入れて見ようかと思ってたとこでした。
114:デフォルトの名無しさん
08/06/13 14:18:02
>>111
言ってることはわかるが、コードのエレガントさを取るか
0コンマ0何秒を惜しむかの個人の好みの問題かと
> 普通は&演算子で連結しない。
コレは無い。普通にやる
115:デフォルトの名無しさん
08/06/13 14:26:35
>コレは無い。普通にやる
ダメだこりゃ。
116:デフォルトの名無しさん
08/06/13 15:36:12
>>111
なるほど、俺も最初はわからなかったがそういうことか。言語が内部でどう処理するか考えてるつもりだったが…
メモリ確保のことまで考えてなかった、教えてくれてありがとう。ループのときは気をつけよう。
VBAのスレなのに言語の仕組みとか機械語とか知ってる人がいるとは…
うかつなこと書き込めないな。ちなみに今回この板の初書き込み。
117:デフォルトの名無しさん
08/06/13 20:31:28
>>115
いや、時間がかかるってのは確かだし認めるよ
しかし、実測してみたが100文字を100回(計1万文字)を1万回試行して差は5秒程度
100文字を100回連結しても差は1万分の5秒(0.5ms)だよ
この為に格納用の配列変数を要素分確保して、Excel2000(Excel2002?)から採用のJoin関数を使うのと、
文字列変数を1つ用意してループで直接連結して最初(又は最後)の余計な連結記号を削除するのは、
どちらが正解って問題なのかな?
118:デフォルトの名無しさん
08/06/13 20:56:23
Excelのマクロごときでそんな細かい事を気にする奴は神経症
119:デフォルトの名無しさん
08/06/13 21:14:19
Textボックスにフォーカスがあたったときに、
あるTextボックスの場合は日本語入力をONにして、
別のTextボックスの場合は日本語入力をOFFにしたいのですが、
そういう制御は可能ですか?
120:デフォルトの名無しさん
08/06/13 21:37:38
自己解決
URLリンク(www.vba-world.com)
すんまそん
ここで書いてありました
121:デフォルトの名無しさん
08/06/13 21:52:13
>>120
Excel2000以降ならJoin関数が簡単だし、それより前のバージョンならMidステートメントがデフォ
122:デフォルトの名無しさん
08/06/13 22:38:47
>>121
Mid関数の方だよね?
123:デフォルトの名無しさん
08/06/13 23:20:18
VBAで作成したファイルが、エクセル終了しないと開けませんorz
拡張子がtxtだと開けるのですが・・・
124:デフォルトの名無しさん
08/06/13 23:27:02
>>121は、たとえばA1:A50000に各6文字あるデータを","で連結してみりゃ&演算子がいかに遅いかわかる。
1文字の区切り文字での連結なら>>124が書いてるMidステートメントが最速で、次がString型の一次元配列に格納しなおしてからJoinだ。
Midステートメントが0.15秒、Strng型の一次元配列に格納してからJoinが0.2秒なのに対して&演算子は約:52秒。
125:デフォルトの名無しさん
08/06/13 23:40:29
>>127
Midステートメントそんなに速い?
どうやったらJoinより速くなるんだろ?
まだまだ俺は修行不足だな。
まぁ俺は手軽なJoinしか使うつもりはないけどな。
126:117
08/06/14 00:13:09
>>124
納得しました、ごめんなさい
半年ROMるよ
127:デフォルトの名無しさん
08/06/14 05:07:57
50000回の結合とかどんな場面だよ
128:デフォルトの名無しさん
08/06/14 05:10:37
まあぶっちゃけマクロごときで2,3秒遅くなっても問題ない
129:デフォルトの名無しさん
08/06/14 07:15:27
>>122
Mid関数じゃなくてMidステートメント
ただしVB6まで使える技法で.NETでは速くならない。
130:デフォルトの名無しさん
08/06/14 07:34:17
>>125
バリバリにチューニング工夫してやっと速くなるが、普通にやるとJoinが速い。
連結はJoinが普通だね。
131:デフォルトの名無しさん
08/06/14 09:57:34
キモ
132:デフォルトの名無しさん
08/06/14 10:33:49
向上心のないやつは自分の知らないこと書かれると気分が悪くなるよなw
133:デフォルトの名無しさん
08/06/14 10:47:22
貧民的プログラミングってやつだねえ
がんばれよ
134:デフォルトの名無しさん
08/06/14 10:48:02
>>130
まさか必要な長さの文字列を最初用意するとき、String$関数使って(6+1)*50000-1個の","を用意するんじゃないよな?
それならMidが速いのは俺でもわかる気がするが。
それとも2回ループ回してもMidが速いの?
135:デフォルトの名無しさん
08/06/14 11:07:58
MidはさておきJoinは貧民的じゃねーな。
ってか昔はMidは常識だったんだが。
136:デフォルトの名無しさん
08/06/14 13:58:58
MidとかLeftとかきもいよ。
いーかげんベーシックなんて捨ててほしい
上っ面だけお化粧(?)して実態はただのパクリで出来た言語の呪縛
パくるしか脳のないゲイつ君。
化粧かどうかも怪しい。
既にC言語で解決されてきたポインタやステートメントなどの言語仕様を
なぜ新たに別のキーワードでリプレイスするのか。
その結果、脳内置換しながらプログラムする不便さだけしか感じない。
switch文をselect caseにしたからって何か良いことあるのか考えてほしい
MSはもっと意味のある新しいものを作れよ
137:デフォルトの名無しさん
08/06/14 14:06:16
>>134
各セルが6文字ときまってりゃそうするが、何文字かわからなくても動くように2回ループ。
Len関数は最初のループで使うだけ。
2回Lenを使ってもたいして時間はかからんが。
138:134
08/06/14 17:10:15
>>137
そうなのか。
色々やってみるが、どうも俺の実力じゃJoinより速くならん。
諦めてJoin使うことにする。
139:デフォルトの名無しさん
08/06/14 17:55:03
>>112です色々ありがとうございます。要件を変えてみて3稼働日前を出したいのですがうまくいきません。
3稼働日前がでるつもりで計算をしているのですが何故か3稼働日以上マイナスしてしまっています。
また閏年の所を空欄にしているのですが空欄にしてしまうためおかしくなってしまいます。
どなたかご教示いただけないでしょうか。(泣)
URLリンク(briefcase.yahoo.co.jp)
Dim Count As Integer
Dim k As Long
Dim n As Long
n = 12
Do While Cells(n, 7) <> ""
k = DateDiff("d", Range("D12"), Cells(n, 7)) - 2
Count = 0
Do
If Cells(k, 6) <> "休" Then
Count = Count + 1
If Count = 3 Then
If IsDate(Cells(k, 7)) Then
Cells(n, 8) = Cells(k, 4)
End If
Exit Do
End If
End If
k = k + 1
Loop
n = n + 1
Loop
End Sub
140:106,109,110,113
08/06/14 18:43:44
>139
106のままではだめですか?
カレンダー(連続した日付)は連続してないとだめです。うるう日をあけるとおかしくなります。
1月1日の日付を表す数値(39083)とG列に入れた日付を表す数値(G12ならば39112)の差を元に
G列に入れた日付がD列のどこになるのかを計算で求めているからです。カレンダーが連続して
ないのであれば、G列に入れた日付がD列のどこになるのかを求める処理も加えなければなりません。
ソースをみましたが、これで動きますか?
Do While Cells(n, 7) <> "" は Do While Cells(n, 7).Value <> "" でしょう。
他すべて .Value が抜けてますよ。
「何故ここで止まってしまうか理解できません」は、Cells(21,7).Value が ""で、ループ継続の
条件からはずれるからです。G列に空欄がありうるのであれば、ループの終了条件を明記したうえで
3日前の日付を求める処理をIf文で実行しないようにすべきです。
もう一度105で示されたブックと106の内容で試してみてください。エクセル97で動くことは
私の1997年ものPCで確認してます。ただし、各ソースの左側の空白は2バイト空白を入れている
のでタブなり半角スペースで置き換えてください。そしてG列は空白セルを入れないようにしてください。
141:106,109,110,113,140
08/06/14 18:52:25
よく見たら、また3日「前」になっている。おちょくられているような気がするのでもうやめた。
あとは自分で考えて!
142:デフォルトの名無しさん
08/06/14 20:55:21
横レスだが、質問回答は誰が誰でかよくわからないwww
おそらく、if文の判別式が正しく動いてないだろうから、自分で調べるのが最善。
定義と判別式がマッチしていないから、要求された動きが出来ていないと読んだよ。
143:デフォルトの名無しさん
08/06/14 21:00:02
だから稼働日に連番をふればいんだってば
144:デフォルトの名無しさん
08/06/15 02:27:04
本当にすみません。私自身がグチャグチャで混乱して迷惑をかけてしまって・・・
>>141さん本当に親切に考えていただいて感謝しています。
>>112であるように似たような課題を与えていただいて逆のバージョンの「前」を
応用して作ってみていたわけですがどうもうまくいかず。
出来るだけ自分の物にしようと試みたのですがそれが逆に迷惑をかけてすみません。
本当におちょくってはいないので許してください。
>>143さんありがとうございます。
稼働日に連番をふればいいとのことですが手作業入力した日にたいしてどう稼働日
をふればよいのでしょうか?初心者ですみません・・・
次ページ最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
4679日前に更新/336 KB
担当:undef