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
超くだらねーことかもしれんが、適当な変数宣言の一般的な名称ってどんなもんがあるかね?
①たとえば、インテジャーなら?
②ロングなら何使う?
③レンジなら?
④ワークシートなら?
⑤ブーリアンなら?
俺は考えるのが面倒だからすぐバカみたいな変数宣言するので
とても人に見せれん。
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さんありがとうございます。
稼働日に連番をふればいいとのことですが手作業入力した日にたいしてどう稼働日
をふればよいのでしょうか?初心者ですみません・・・
145:143ではないが
08/06/15 08:45:42
連番をふるのは 手作業入力した日 じゃなくて 140で書いてるカレンダー の方でしょ。
普通のサラリーマンの勤務形態でいえば、1/1~1/3は年始休暇、1/4(金)が1、1/5,6が土日の休で
1/7(月)がやっと2、という風にカレンダーの隣の列の勤務日に最初に一連番号を入れておく。
先にそういうことをやっておいてから 手作業入力した日 が一連番号のどこに相当するのかを
調べて、3日前だったら-3した一連日に相当する日付が求める答えになる。
ただし、手作業入力した日 が休みの日だった場合は一連日がないので-3しようがない。
先に示された106で3日後の処理がちゃんと動くかどうかを先にすべきでは?
これを3日前にするのは一カ所 + を - に変更するだけなんだけど。
146:デフォルトの名無しさん
08/06/15 10:16:31
143
横レスやけど連番ふるのは無理やで~
145も言ってるけど該当した場合の処理が面倒や
147:デフォルトの名無しさん
08/06/15 10:31:41
日付 休日 連番 手入力した日 修正した手入力した日 3稼働日後
4/1 1 4/1 4/1 4/5
4/2 2 4/2 4/2 4/6
4/3 休 4/3 4/2 4/6
4/4 3 4/4 4/4
4/5 4 4/5 4/5
4/6 5 4/6 4/6
手入力した日が休日で、連番のない日だった場合は、直前の連番がある日を
修正後の手入力した日とする。3稼働日後は修正後の手入力した日の連番に+3すればおk
148:デフォルトの名無しさん
08/06/15 10:33:15
それより、休みの日の連番を空欄にするんじゃなく、直前の連番と同じにする方が
簡単かも
149:デフォルトの名無しさん
08/06/15 10:41:57
>>136
キーワードはともかく、Select Caseはbreakが要らないのが便利だと俺は思っている。
150:デフォルトの名無しさん
08/06/15 11:03:44
>147
日付を手入力するとき、その日付が休みなのかどうか調べる必要があるので(規則性がないらしく
離れた日付だと表をスクロールさせないとわからない場合もある)入力時の手間がかかります。
>148
連番に重複があったらあったで問題があります。
147の表で、3稼働日前 を調べるものとして考えてみます。4/3(休)の連番の列に2を設定
しておくと、仮に手入力した日(修正した手入力した日)が4/6(連番:5)の場合に、
5-3=2 ということで「下から上に」調べていくと4/3が先に該当してしまうんですね。
「上から下に」調べればいいんでしょうが、たった3日前を調べるのに先頭から順に調べていくのは
なんか無駄なような気がする。ちょっとうえのレスでは演算子の違いによるミリ秒の処理時間の違い
のことで論争になってたし。
151:デフォルトの名無しさん
08/06/15 11:59:36
全くの初心者の質問ですみません。
Sub syozoku()
Dim busyo As String
Select Case Range("C10").Value
Case "a"
busyo = "総務部"
Case Else
busyo = "正しいコードを入力してください"
End Select
MsgBox busyo
End Sub
これで、C10にaを入力しても、
メッセージボックスに”正しいコードを入力してください”とでます。
Office 2007 professional edition>Excel 2007、windows XPですが、
新たにDLなどが必要なのでしょうか。
152:デフォルトの名無しさん
08/06/15 12:14:27
>151
当方WindowsXPのExcel2003ですが、ちょっと確認。
セルC10に1バイト文字の a を入れているのか、2バイト文字の a を入れているのか、
区別してますか?
VBAソースにはどちらを指定していますか?
セルC10の隣(D10セル)あたりに =code(C10) の計算式を入れてみてください。
153:デフォルトの名無しさん
08/06/15 12:39:48
1バイトのAでもaでも2バイトのAでもaでも動くようにStrConvとかLCaseとかいろいろ使えばいいじゃん。
154:デフォルトの名無しさん
08/06/15 17:54:07
回答有難うございます。
>>152
>セルC10に1バイト文字の a を入れているのか、2バイト文字の a を入れているのか
これは区別しています。
>VBAソースにはどちらを指定していますか?
開いているすべてのブックに保存しています。
作業中のブックにするべきなのかも。
セルC10の隣(D10セル)あたりに =code(C10) の計算式を入れてみてください。
>やってみました。C10に100をいれると49が帰ってきました。
これが原因かも。codeについて調べてみます。
>>153
助言ありがとうございます。
調べてみますが、全くの初心者のためなんのことか分かません。
すみません。
155:152
08/06/15 18:19:46
>154
C10セルに a を入れたらどうなるのかを確かめてほしかったんだけど。
それから
>VBAソースにはどちらを指定していますか?
開いているすべてのブックに保存しています。
作業中のブックにするべきなのかも。
の件、誤解してます。VBAソースには a(1バイト)、a(2バイト)のどちらを
指定しているのかを尋ねたのです。ソースを記録している場所のことではありません。
あとは153さんが書いているように、大文字・小文字、1バイト・2バイトを
入れてもOKなようにするには工夫が要ります。153に示された関数(?)をググって
みてください。私もこの板を含むインターネットでずいぶん教えてもらいました。
がんばってください。
156:デフォルトの名無しさん
08/06/15 21:51:46
> 大文字・小文字、1バイト・2バイト
Option Compare Textを使うと簡単お手軽な気もするが諸刃の剣
モジュール分ければいいだけの話だけど
157:デフォルトの名無しさん
08/06/15 23:43:19
>>155,156
回答有難うございます。がんばってみます。
誤解していた件ですが、どちらも1バイトの文字に間違いありませんでした。
"a"ではなく、case 100 のように、数字で指定しても
case else 扱いになってしまうのです。
158:155
08/06/16 00:13:50
>157
うーむ、なんだろ。
考えられる原因としては、C10セルに a_ (_は半角スペースと思ってください)と入力したか、
VBAソースの方の"a"の aの前後どちらか(あるいは両方)にスペースが入ってしまったか、
とにかく比較するふたつが一致しないといけない。
C10セルの書式をプロポーショナルではない(Pのつかない)MS明朝なりゴシックの大きめの
フォントに設定して、本当に1バイト文字になっているかを確認してみてください。
それから 100 は数字としてなのか 3文字の"100"なのかでも変わってきます。 case 100 と
あるのであればC10セルにも数字の 100 と入力しないといけません。
こちらのExcel2003で151のソースを貼り付けてちゃんと 総務部 と表示されたので、ソースの
内容に間違いはないはずです。
159:デフォルトの名無しさん
08/06/16 01:12:48
>Select Case Range("C10").Value
>Case "a"
そのコードはちゃんとコピペでこのスレに張ったか?
この部分にスペルとか何か間違いないか?
160:デフォルトの名無しさん
08/06/16 01:19:09
出来損ないでスソマソン どうしてもIF文がうまくいかないでつ・・・
F3の値が6で割り切れないとき30行目を削除して割り切れたときはF4の値が6で
割り切れるかみて割り切れないとき40行目を削除ってこれじゃおかすぃ??
Sub limit()
If Range("I1").Value = 0 Then
Range("I1").Value = 1
If Range("F3").Value Mod 6 <> 0 Then
Rows("30:30").delete
Range("I1").Value = 1
Else
If Range("F4").Value Mod 6 <> 0 Then
Range("40:40").delete
Range("I1").Value = 1
Else
Rows("40:40").delete
Rows("30:30").delete
End If
End If
End If
End Sub
161:デフォルトの名無しさん
08/06/16 01:42:07
Sub limit()
If Range("I1").Value = 0 Then
Range("I1").Value = 1
If Range("F3").Value Mod 6 Then
Range("30:30").Delete
ElseIf Range("F4").Value Mod 6 Then
Range("40:40").Delete
Else
Range("40:40").Delete
Range("30:30").Delete
End If
End If
End Sub
162:デフォルトの名無しさん
08/06/16 01:48:40
>>151
シートの指定がされて無いけど、実行時のアクティブシートが違うとかは無いの?
163:デフォルトの名無しさん
08/06/16 09:15:05
>160
実行結果はどうだったの?
それから行削除の処理には関係ないけどI1セルへの無駄な代入文2カ所あり。
164:デフォルトの名無しさん
08/06/16 22:06:32
Sheet1の適当なセルにhogehogeと書いて
Sub test()
Dim r
Set r = Sheets("Sheet1").Range("a1:z50").Find(What:="hogehoge", LookAt:=xlWhole, SearchOrder:=xlByRows)
Set r = Sheets("Sheet1").Range("a1:z50").Find(What:="hogehoge", LookIn:=xlValue, LookAt:=xlWhole, SearchOrder:=xlByRows)
End Sub
を実行すると、
WindowsXP SP2, Excell2003 sp3では
1つ目のFindはちゃんと動きますが
2つ目のFindで
実行時エラー'9' インデックスが有効範囲にありません
と怒られます。LookInを指定すると怒られるようです。
WindowsXP SP3, Excell2000では問題なく意図したとおりに動きます。
Excell2003でもLookIn:=xlValueを指定したいんですが、どうしたらいいですか?
165:デフォルトの名無しさん
08/06/16 23:13:54
>164
こちら(XP sp2 Excel2003 sp3)でも同様の症状を確認しました。
対策は・・・誰か詳しい人頼みます。
166:デフォルトの名無しさん
08/06/16 23:21:34
LookIn:=xlValueをLookIn:=xlValuesとしてみなよ。
167:164
08/06/16 23:35:32
URLリンク(www.nbcom.co.jp)
Excell2000で動作を確認しました。Excell2003での動作は明日確認します。
>166
ありがとう
168:164
08/06/17 21:43:36
バッチリ動きました。
ていうか、LookIn:=xlValueで動くほうがおかしい。
もっと言えば、実行時エラーじゃなくて、コンパイル時エラーが出てもいい。
xlValueってグラフで使うやつらしい
169:デフォルトの名無しさん
08/06/17 21:45:25
いや、ただの定数だし・・・
170:デフォルトの名無しさん
08/06/17 22:52:11
>>169
定数を理解してたらこんなこと書かないって
>>168
イミディエイトウィンドウに
?XlValue
って打ち込んでEnterキー押してみ、正体分かるから
171:デフォルトの名無しさん
08/06/18 01:24:21
>>164
俺はFindメソッドにxlValueを使ってたDQNを知ってる。
グラフが好きだったから使ってたんだろう。
たまたま動作が同じだからって、たとえばSpecialCells(xlCellTypeConstants)の代わりにSpecialCells(xlFilterCopy)なんてやったら
ヴァカって言われるよな。
>>169
彼が言うようにグラフで使うときのために用意された定数なんじゃない?
x;lAxisTypeクラスってそうなのかな?
172:デフォルトの名無しさん
08/06/18 01:30:53
なんか164もDQNみたいな書き込みになったな。
すまんな
173:169
08/06/18 06:21:45
>>171
何のために用意されたにしても、ただの定数。
結局、メソッドの引数が不正だったってだけの話なんだから
コンパイル時エラーじゃなくて実行時エラーなのは当然でしょ、って話。
引数には変数や式も使えるんだし。
174:デフォルトの名無しさん
08/06/18 10:38:23
最近VBAを触りはじめたのですが、全く分かりません
指定されたファイルがあれば、そのファイルを現フォルダから別のフォルダへ移動させたい。
指定されたファイルが無い場合はマクロを終了。
ファイルを別のフォルダへ移動はできましたが、指定されたファイルを探すのが上手くできません。
別のサイトへ誘導でもかまいませんので、教えて下さい。
よろしくお願いします。
175:デフォルトの名無しさん
08/06/18 11:14:01
やだ
176:デフォルトの名無しさん
08/06/18 19:22:38
>>174
Sub test()
If Dir("c:\tmp.txt") <> "" Then
MsgBox "存在します。"
Else
MsgBox "存在しません。"
End If
End Sub
177:デフォルトの名無しさん
08/06/18 22:57:34
可能でしたらどなたか教えて頂けませんか・・?
Aエクセル起動時のUserForm1が起動して
他のエクセルに切り替えた時にそのUserForm1はHideします
その後、Aエクセルに切り替えた時に再びShowするのですが
UserForm1がアクティブになっているためAエクセルの編集を続行するためには
適当なセルをクリックしないといけません。
試しにShowする時にRange("A1").Select等を試すも結果は同じ
何とか解決する方法はありませんでしょうか?
178:デフォルトの名無しさん
08/06/19 10:02:27
>177
4行目の
その後、Aエクセルに切り替えた時に「再びShow」するのですが
この「再びShow」が問題では? Aエクセルの編集をするのであれば
「Hide」したままにしておけばいいだけでは?
それとも、
他のエクセルに切り替えた時にそのUserForm1はHideします
というのが、単に別アプリ(別のエクセル)が前面に出たから見えなくなっただけ
なのでは?
179:デフォルトの名無しさん
08/06/19 10:22:14
例えば指定の曜日とかは自動的にフォントを赤にしたりできるけど、
やっぱりマクロでも祝日はムリかな?
180:デフォルトの名無しさん
08/06/19 10:44:34
>179
曜日は7日周期だから計算で機械的にもとめられますが、
祝日は機械的にさだまっていません。有名なところでは春分の日、秋分の日。
さらに祝日は法律で定まったり日付そのものを変更したり(成人の日、体育の
日、海の日など)とあるので、エクセルなどに実装するのは無理です。
なので、祝日をマクロで実現するには祝日(たぶん振り替え休日も含めてと
思うが)をリストにしておいてマクロで該当する日をチェックして、エクセル表
の該当する日付のセルの塗りつぶしを行うという手順になります。
リストを用意できるか、リストの変更をどう行うかがカギです。
181:デフォルトの名無しさん
08/06/19 11:48:55
うい
182:デフォルトの名無しさん
08/06/19 13:50:15
>>179-180
URLリンク(www.h3.dion.ne.jp)
183:デフォルトの名無しさん
08/06/21 00:36:23
>>177です
この「再びShow」が問題では? Aエクセルの編集をするのであれば
「Hide」したままにしておけばいいだけでは?
UserForm1はAエクセルの作業時に役に立つボタン等を実装しているので
Showしておかないと不便なのです。。。
他のエクセルに切り替えた時にそのUserForm1はHideします
というのが、単に別アプリ(別のエクセル)が前面に出たから見えなくなっただけ
なのでは?
ちょっと当方の書き方が不十分だったのかもしれません
大前提としてAエクセルで作業中の時はUserFormはいて欲しく
他のエクセルに切り替えた時にはUserFormは不要なので
Private Sub Workbook_WindowDeactivate(ByVal Wn As Window)
UserForm1.Hide
End Sub
で隠します、そしてAエクセルに戻した時には
UserFormは必要になるので
Private Sub Workbook_WindowActivate(ByVal Wn As Window)
UserForm1.Show
End Sub
で、再び表示されるのですが、その時フォーカスは
UserForm側にいてセルにいないので
いちいち、セルをクリックしてフォーカスをセル側に切り替える必要がある
これが面倒なので、Aエクセルに復帰した時に
どうにかならないものか。。。。と思っています。
184:デフォルトの名無しさん
08/06/21 03:40:55
XP Excel2003での質問なんですが
If x = 1 Then GoTo LB1
ElseIf x = 2 Then GoTo LB2
と記述しているのに
「Elseに対応するifがありません。」と出ます。
間違っているところはどこなんでしょうか?
必要があれば追加文若しくは全文出します。
185:デフォルトの名無しさん
08/06/21 04:39:11
>>184
Thenの後は改行してみたらどうですか
186:デフォルトの名無しさん
08/06/21 10:45:43
>>185
おま…MSに消されるぞ
というかGotoなんか使うな
187:186
08/06/21 10:46:07
>>185
>>184
188:デフォルトの名無しさん
08/06/21 13:47:40
>>185
ありがとうございます!
その部分はそれで解決したっぽいです
189:デフォルトの名無しさん
08/06/23 13:26:30
Sub Copytest()
Sheet2.Visible = xlSheetHidden
Sheet3.Copy after:=Sheet1
Sheet2.Visible = xlSheetVisible
End Sub
こうやるとsheet3(2)がsheet2の後に追加されてしまいます
Sheet1の後(Sheet2の前)にSheet3のコピーしたいのです
要は隠されてるシートの前にシートのコピーを挿入したいんです
今はSheet2のVisibleプロパティを一旦HiddenからVisibleに、
copy処理してから再びHiddenに戻すという方法をとってるんですが
もっとスマートな方法はないものでしょうか?
190:デフォルトの名無しさん
08/06/23 14:51:32
>>186
俺はバンバン使ってたよ、20年前に、ポケコンで、懐かしい・・・
191:デフォルトの名無しさん
08/06/23 18:07:07
excel2007でマクロを今は亡きツールバーに登録するマクロが含まれるアドインを使ったら
消せなくなってしまった。消し方を教えてください。
この方法で追加したのを↓
Dim o_cmdbar As CommandBarControl
On Error Resume Next
Application.CommandBars("Worksheet Menu Bar").Controls("あ").Delete
Set o_cmdbar = Application.CommandBars("Worksheet Menu Bar").Controls. _
Add(Type:=msoControlPopup)
o_cmdbar.Caption = "い"
With o_cmdbar.Controls.Add(Type:=msoControlButton)
.Caption = "う"
.OnAction = "え"
End With
本来はこれ↓で消すはずだった。
Application.CommandBars("Worksheet Menu Bar").Controls("メニュー").Delete
192:デフォルトの名無しさん
08/06/23 18:08:24
↑だけど追記で。アドインっていうリボンの中に作られたメニューを消したい。
193:デフォルトの名無しさん
08/06/23 19:49:14
そりゃツールバーじゃなくてメニューバーだ
そしてそのコードじゃExcelのバージョンがいくつでもマトモに動かんよ
194:デフォルトの名無しさん
08/06/23 21:32:42
>>189
ただ単純にbefore:=sheet2で解決しない?
ただし、実際に動作確認してないから分からないけど。
195:デフォルトの名無しさん
08/06/23 21:39:50
>>194
実はそれも同じ結果になってしまいまして
どうしてもHideされたシートは自身の前位置を譲ってくれません
Worksheets.Addで追加する場合は問題ないんですけどね
なんなんだろう?
196:デフォルトの名無しさん
08/06/23 22:02:55
>>195
じゃあ、コピー処理した後に並べ替え処理したらどうかな?
197:デフォルトの名無しさん
08/06/23 22:20:50
ありがとう
並べ替えのループ処理に頼らなくても
一旦VisibleとHiddenを切り替えて、その間コピー処理することで一応解決はできてるんですが
なんだか不細工だなあと
仕様ということ納得します
198:デフォルトの名無しさん
08/06/24 18:16:18
>>197
その気持ちわかる、俺も別の件ですっきりさせようとしたがむりで仕様ということで納得した
199:デフォルトの名無しさん
08/06/25 22:00:12
VBAでセルの色などを変えようすると”実行時エラー 1004”と出てしまいます。
シートを保護してますが、そのセルのロックは外してます。
他に何か原因はあるでしょうか?
200:デフォルトの名無しさん
08/06/26 07:54:34
その部分のソース貼れ
201:デフォルトの名無しさん
08/06/26 10:05:57
こんなです
Private Sub Worksheet_Change(ByVal target As Range)
'雇用形態のセル
Dim formRange As Range
Set formRange = Range("A1")
'雇用形態のセルを塗りつぶしなしにする
With formRange.Interior
.Color = vbRed
End With
'オブジェクトの解放
Set formRange = Nothing
End Sub
202:デフォルトの名無しさん
08/06/26 10:49:48
質問です。よろしくお願いいたします。
あるセルに設定されている「入力規則」の値を全て取得することは可能でしょうか。
203:デフォルトの名無しさん
08/06/26 11:01:15
>>201
シートを保護するときに、"セルの書式設定"のチェックを入れないとダメなんじゃ。
204:デフォルトの名無しさん
08/06/26 14:39:34
>>203
2003とかならそうだと思う。状況からみて2003あたりを使ってそうだけど。
勘違いでなければ、2000あたりはそのチェック項目が無いような気がしたので、汎用性を持たせるなら一回シートの保護自体を解除して処理した方がいいと思う。
そして、処理終了後に再度、シート保護処理を実行する。
205:デフォルトの名無しさん
08/06/26 14:41:50
>>201
処理と説明が合ってないよ。
塗りつぶしなしにするって書いてるけど、処理自体は赤くするになってるよ。
206:デフォルトの名無しさん
08/06/26 16:15:33
>>203
うまくいきました。
ありがとうございます。
>>204
やはり、その方法の方がいいでしょうか。
ありがとうございます。
>>205
すみません。
207:デフォルトの名無しさん
08/06/26 16:38:53
二つのBookを用意して、呼び出し元から、呼び出し先Bookのシートにある
メソッドを実行したいと思いますが、出来ません。ご教授ください。
呼び出し元Book.xls
Sheet1
Workbooks.Open Filename:="呼び出し先Book.xls"
Set wk = ActiveWorkbook
Call wk.Sheets(1).DoExecute() 'エラー
呼び出し先Book.xls
Sheet1
Public Sub DoExecute()
Msgbox "Hello"
End Sub
実行時エラー40036:アプリケーションの定義またはオブジェクト定義のエラーです。
と表示されます。
208:デフォルトの名無しさん
08/06/26 16:59:59
俺の人生はエラーですがどうすれば直りますか
209:デフォルトの名無しさん
08/06/26 17:49:55
あるPublic関数を、ユーザー定義関数の用法でワークシート上から駆動させたとき、
関数内のWorkbooks.Openメソッドがうまく機能しない、という状況について、
ご意見を伺いに来ました。
ちょっと長文になってしまいましたが、聞いてください。
月ごとの売上データが保存されているExcelブックがあって、
それぞれ次のようなブック名で保存されています。
( 2007-04.xls, 2007-05.xls, 2007-05.xls … )
これらのファイル群から、ある特定の月の売上金額を抜き出す
Uriage関数を書いたんです。
たとえば #2007/4/1# を引数で渡すと、07年4月の売上金額が
戻ってくるような関数です。関数の中身はとても単純で、
1)渡された日付をもとにどのブックを開くべきか判断
2)そのブックを開く(Workbooks.Openメソッド)
3)必要な値を読み込む
4)ブックを閉じる
5)値をリターンする
という流れになっています。
この関数、他プロシージャから呼び出して使う分には、
問題なく動作し、なかなか便利です。
そこで、ユーザー定義のワークシート関数として使えるだろうか、
と思い、セルに次のように入力してみました。
=Uriage(2007/4/1)
しかし残念ながら エラー値 が戻ってきました。
処理をトレースしてみたところ、2)のところでブックが開きません。
どうやら、Workbooks.open メソッドは、ワークシート上の関数から
駆動させた場合は機能しないようなのです。
どうして、このような挙動になってしまうのでしょうか。
またこの他に、ワークシート上からではうまく機能しないメソッドを
ご存知の方はいらっしゃいますか。
210:デフォルトの名無しさん
08/06/26 18:39:18
これかな
URLリンク(support.microsoft.com)
211:デフォルトの名無しさん
08/06/26 19:08:07
>>208
一度、小学生にダウングレードして再起動
212:デフォルトの名無しさん
08/06/26 20:32:38
ハァハァしかけたけど、野郎なのか。だったら市ね
213:209
08/06/26 21:55:59
>>210
ありがとうございました。まさにそれです。
そういう仕様になっているということが
たいへん良く分かりました。
ちなみに、色々試してみたら、
テキストファイルのopen、read、closeは
ユーザー定義関数からでも上手くいくようですね。
Excelブックを開くより、読み込みがかなり速いので、
けっこう重宝しそうです。
214:sage
08/06/26 22:10:15
>>207
Sheetオブジェクトに記述されたプロシージャは、
そのSheetオブジェクト以外の場所からは呼び出せません。
他のブックからも呼び出せるプロシージャを作りたいなら、
まず標準モジュールを追加して、そこにPublic Subプロシージャを
記述します。
作ったプロシージャの呼び出し方については、
"Run"メソッドを検索してみてください。
215:デフォルトの名無しさん
08/06/26 22:56:58
A1からC1までをセル結合した状態でInputBoxを使用してA1~A3までを選択した場合に、
A1:C3になるのですが、これをA1:A3と取得する方法はありますか?ご教授ください
216:デフォルトの名無しさん
08/06/26 23:06:09
優秀な方に伺いたいです!
あるブックのシートにあるデータを計算して、
他のブックのシートにその結果を出力したいのですが・・・
'結果を書き込むブック
Set objWb = Workbooks.Open(strFileName)
このようにオープンすると本当に立ち上がって見た目がよくないです。
裏でオープンして出力できる方法はないでしょうか?
どうぞよろしくお願いします。
217:デフォルトの名無しさん
08/06/26 23:14:13
>>216
完璧に画面更新が止まってもいいならapplication.screenupdating=Falseを使用すれば開いてるところは見えないはず。
218:デフォルトの名無しさん
08/06/26 23:25:25
一つ教えていただきたいのですが、
12
24
35
46
2
34
とあった場合で、
最小値をこの中から探し出し、
その最小値の行番号を出す方法、
もしくは、載っている本を教えていただけますか。
お願いします。
219:教えてください
08/06/26 23:30:34
Excelが大好きな婦女子です。
もっぱらワークシート関数と記録マクロを駆使して
仕事で個人的に利用するささやかな入力フォームを作って楽しんでいますが、
最近ExcelのVBAとAccessに興味を持ち始めて独学中です。
そこで質問ですが、ExcelとAccessのVBAが使いこなせるようになったら
"プログラマ"として食って行けるでしょうか?
他の言語は全くわかりません。
現在のところ自分としてはOffice使いに毛の生えた程度の"プチグラマ"
だと思っています。
派遣社員でも、正社員でも構わないのですが、諸事情により
残業が月10時間程度しか出来ません。
VBAオンリーのプログラマでデスマ(すなわち残業)を避けて生きていくことは
可能でしょうか?
誰かVBAプログラマの現状を教えてください。
220:デフォルトの名無しさん
08/06/26 23:30:35
>>217
はい、ありがとうございます!
これを使ってなんとか工夫してみます!
221:デフォルトの名無しさん
08/06/27 00:49:59
>>218
もっと簡単な方法があるかもしれないけど、俺はプロじゃないからすぐ思いつくのはこの程度かな。
もし良かったらどうぞ。変数も今、適当に付けたから分かりにくいのはごめんね。
Sub 最大表示()
Dim MyRow As Integer
Dim MyRng As Range
Dim Res As Integer
Dim AnsRow As Integer
MyRow = Range("A65536").End(xlUp).Row
Res = 0
For Each MyRng In Range("A1:A" & MyRow)
If Res < MyRng.Value Then
Res = MyRng.Value
AnsRow = MyRng.Row
End If
Next MyRng
MsgBox AnsRow, vbOKOnly + vbInformation, "結果"
End Sub
222:デフォルトの名無しさん
08/06/27 01:14:34
>>221
素早い回答ありがとうございます。
早速使わせていただきます。
223:デフォルトの名無しさん
08/06/27 01:22:57
俺が婦女子だったら、VBAプログラマなんて、この世に生まれて来た
価値が何ら見いだせないような悲しい人生しないで、男に頼んで
バンバン子供産んで婦女子ならではの人生を謳歌するけどな。
224:デフォルトの名無しさん
08/06/27 01:45:30
>>221
早速参考にして、
作ることができました。
ありがとうございました。
225:デフォルトの名無しさん
08/06/27 10:23:26
質問があります
VBAで一週間後の日付を出すやり方がありましたら
教えてださい。お願いします
226:デフォルトの名無しさん
08/06/27 11:41:23
Sub test()
Range("A1").Formula = "=TODAY()+7"
End Sub
227:デフォルトの名無しさん
08/06/27 12:50:27
ツールからマクロの記憶を使いグラフを3つ作成して、VBAで設定し表示する事が出来たんですが、全て同じ箇所、重なって表示してしまうんです。
個別に位置を指定して表示する方法ありますか?
228:デフォルトの名無しさん
08/06/27 14:19:01
セルに設定されている、「入力規則」を取得する方法を知りたし。
229:デフォルトの名無しさん
08/06/27 17:35:08
>>227
'1つ目のグラフの位置設定(???は位置を示す数値)
ActiveSheet.ChartObjects(1).Top = ???
ActiveSheet.ChartObjects(1).Left = ???
'ChartObjects(2)、ChartObjects(3)に対しても、個別に位置を設定する。
230:デフォルトの名無しさん
08/06/27 17:50:47
>>228
vba validation moug で検索
231:デフォルトの名無しさん
08/06/27 17:57:33
>>219
> "プログラマ"として食って行けるでしょうか?
> VBAオンリーのプログラマでデスマ(すなわち残業)を避けて生きていくことは
> 可能でしょうか?
無理、世の中そんなに甘くない
事務職で"ちょこっと重宝"されるくらいで"優遇"すらされない
VBAは君ごときでも使えることからも解るように、使える奴は婦女子の中にも腐るほど居る
他言語一切ダメで、基礎から学んだわけではなく行き当たりばったりで覚えたような奴なら尚更
まぁ、OfficeはOfficeでもVSTOを完璧に使いこなせたら、それだけで食っていけるけどな
それこそ残業云々どころか出社すらせず在宅労働で食っていける
とはいえ、身に付けるだけで食っていけるような技術は、君ごときが容易に手に出来るものじゃないけどな
232:デフォルトの名無しさん
08/06/27 19:13:55
>>230
ありがとうございます!
233:デフォルトの名無しさん
08/06/27 20:16:03
Userformから呼び出したSubプロシージャ内で
処理を終わらせるにはどうしたらいいですか?
今は戻り値で判定するのに
functionで呼び出しています。
イベントプロシージャに戻らない方法を
教えてください。
234:デフォルトの名無しさん
08/06/27 21:41:24
> 今は戻り値で判定するのに
> functionで呼び出しています。
その方法で良いわけだが
> イベントプロシージャに戻らない方法を
> 教えてください。
無いけど
なんでそんなことをしたがるのかねぇ
初心者の考えることはわからん
235:デフォルトの名無しさん
08/06/27 21:44:31
Endじゃないの?
236:デフォルトの名無しさん
08/06/27 22:04:52
233の説明通りならEndは違う
237:デフォルトの名無しさん
08/06/27 23:49:12
XPとWin2000でexcel2000を利用しています。
ユーザーフォームのcommandbuttonではあまりに味気ないので
マウスクリックやエンターキーの両方でフォーカスを取得して操作できる
画像で出来たボタンを作りたいと考えています
(マウスオーバーで色が変わり、クリック時にボタンを押したような画像に差し換わる)
使えるイベントの都合的にframeに背景画像を指定するなどいろいろ考えたのですが
どうもうまくいきません(画像が切り替わらない・エンターキーを押しても他のコントロールに抜けられない等)
何かよい知恵もしくはもっと適切なコントロールオブジェクトはないでしょうか?
238:デフォルトの名無しさん
08/06/28 00:30:05
>>224
ならよかったよ。
処理が最大値検索になってるのは意地悪したわけじゃないよ…。
最小値を勘違いして最大値で作っちゃった。ごめん。
239:デフォルトの名無しさん
08/06/28 04:03:14
>>219
単価が安いのを我慢できるんなら。
>>231のように、必死で新規参入を妨害しないとやっていけないくらい、
誰にでもできるし、実際たいしたことない。
240:デフォルトの名無しさん
08/06/28 05:59:40
>>234
初心者ですみません。
代替案など教えて頂けないでしょうか?
よろしくお願いします。
241:デフォルトの名無しさん
08/06/28 18:22:42
H段の階段を「1段」あるいは「1段飛ばし」で上る。上り方は何通りあるか?
これはどのような構文を使ったらいいんでしょう?
242:デフォルトの名無しさん
08/06/28 18:52:01
VBAはプログラムじゃないだろ
243:デフォルトの名無しさん
08/06/28 18:52:27
6段の階段なら
1-6段飛ばしの6通りってことか
244:デフォルトの名無しさん
08/06/29 00:15:51
>>242
うん、VBAはプログラムそのものではなくプログラム"言語"だね
更に言えばプログラム言語の中のマクロ言語に該当するものだな
245:デフォルトの名無しさん
08/06/29 08:06:57
>>241
一段飛ばしする回数をnとすると
(n+H-n*2)!/(n!*(H-n*2)!)
通りになる
nを0からH\2までループして結果を足す
246:デフォルトの名無しさん
08/06/29 10:55:55
>>243
アホスwwwwww
247:デフォルトの名無しさん
08/06/29 22:20:05
>>233
呼び出された処理の最後で
Application.Quitすればいいと思う。
初心者のうちはけっこうこの命令を
知らないからね。入門書にも出てこないし。
248:デフォルトの名無しさん
08/06/29 23:53:22
いいわけないだろ
ApplicationをQuitしてどうするよw
249:デフォルトの名無しさん
08/06/30 00:00:48
>>248
IF文などの中で強制的に処理を打ち切るには
Application.Quitしかないと思う。
ExitSubだと呼び出し元に戻ってしまうからね。
250:デフォルトの名無しさん
08/06/30 02:02:31
マクロを編集する時に、例えば赤のフォントにしろと言われても色番号が分からないの
ですが、どうしたらいいでしょうか?
どなたか教えてください。
251:デフォルトの名無しさん
08/06/30 04:12:46
>>250
例えば、A1を赤に塗ってみてイミディエイトウィンドに
?range("A1").interior.color
又は、
?range("A1").interior.colorindex
などと打ち込んでEnterキーを押してみる
252:デフォルトの名無しさん
08/06/30 11:03:07
誰から赤のフォントにしろって言われるの?
253:デフォルトの名無しさん
08/06/30 11:47:58
色の設定画面のトコをプリントスクリーン>ペイントに貼り付けて切り取って拡大してA4に印刷
手持ちの教本にあった番号表を直接マジックで書き込んで目に付くとこに張ってるアナログ最強
以外と見つからないんだよ色番号表。これは下の二段が無い
URLリンク(www.geocities.jp)
254:デフォルトの名無しさん
08/06/30 16:06:37
>>250
マクロ記録使って実際にその色でセルに色をつければいいだけ。
そしたら番号なんかすぐに分かる。
255:デフォルトの名無しさん
08/06/30 19:24:11
>>249
だからってApplicationをQuitしちゃだめだろ
処理を終わらせたいのであってApplicationを終わらせたいわけじゃないんだからw
256:デフォルトの名無しさん
08/06/30 19:26:41
だからEndでいいんじゃないの?
257:デフォルトの名無しさん
08/06/30 20:28:20
┐(゚~゚)┌
258:デフォルトの名無しさん
08/06/30 20:30:31
だからExit Subの代わりにEndを使えばそこで処理は終わるだろ。
変数は初期化されるがな。
259:デフォルトの名無しさん
08/06/30 20:57:57
>>258
EndってEnd Subのことでしょ?
それだと処理は終わるけど呼び出し元に制御が戻ってしまう。
>>233は呼び出し元に戻らずに終わりたいって言ってるんだからさ。
そのためにはApplication.Quitしかないって。
260:デフォルトの名無しさん
08/06/30 21:26:56
>>259
そのEndじゃないよ
でもEndもApplication.QuitもNGだけどな
261:デフォルトの名無しさん
08/06/30 21:43:22
>>259
違うって。End知らないの?
Exit Subの代わりにEndを書いてみなよ。
そこで処理が終わるから。
ただPublic変数も含めて初期化されるけどね。
セルにでも値を置いておけばいいんじゃないの?
262:デフォルトの名無しさん
08/06/30 21:52:18
戻ってもいいようなプログラムにすればいいのに
263:デフォルトの名無しさん
08/06/30 21:54:02
戻った後でfunctionの返す値によってExit Subするのが普通だろうね。
Endとかは他の処理にも影響が出てくるからあまり使うものじゃない。
264:デフォルトの名無しさん
08/07/01 00:00:49
すみません リストの入力規則で
リストを指定するのですが、 リストのまん中ぐらいを最初に表示したいので
す どうすればよいでしょうか。
265:デフォルトの名無しさん
08/07/01 00:50:47
VBAの課題が全くわからないので教えてください。
はじめて質問させていただきます。
課題1:国語、数学、理科、社会の50人分の点数が掲載してあります。このデータを用いて次の処理をするプロシージャを完成させなさい。国語、数学、理科、社会の50人分のデータの平均点、偏差値を画面上に表示する。
課題2:出席番号が変化するデータに対して、国語、数学、理科、社会の平均点、偏差値を画面上に表示する。
ちなみにデータは
b2に出席番号 c2に国語 d2に数学 e2理科 f2社会と入力されてます。
次にb3~b52にNo.1~No.50の出席番号 c3~c52に国語の点数 d3~d52に数学の点数 e3~e52に理科の点数 f3
~f52に社会の点数が入力されています。
点数は問題に関係ないと思うのでここでは書きません。
また、表示にはメッセージボックスを使うようです。
この2つの問題のプロシージャを教えていただきたいです。
どうかよろしくお願いします。
できれば、プロシージャ1行ごとに簡単な解説も付けてもらえたら嬉しいです。
266:デフォルトの名無しさん
08/07/01 01:26:46
>また、表示にはメッセージボックスを使うようです。
ゲラゲラ
267:デフォルトの名無しさん
08/07/01 03:34:26
>>251,>>253
ありがとうございます。
>>252
FOM出版に言われましたW
268:デフォルトの名無しさん
08/07/01 07:13:09
>>266
わからないから笑って誤魔化すんですね(^-^;)
>>265お願いします。
269:デフォルトの名無しさん
08/07/01 07:44:27
宿題(しゅくだい)は自分(じぶん)でやりましょう。
270:デフォルトの名無しさん
08/07/01 07:50:32
>>265
>>1★5
271:デフォルトの名無しさん
08/07/01 08:11:00
実際なんとなくやったのがこれです。
Sub 国語平均()
Dim 平均 As Single
Dim 偏差値 As Single
和 = Application.WorksheetFunction.Sum(Range("c3:c52"))
数量 = "50"
平均 = 和 / 数量
MsgBox 平均
End Sub
偏差値は定義してますが、計算式がわからないので入力していません。
50人分の偏差値はどうだせばいいのでしょうか?
いろいろ失礼なことを言って申し訳ございませんでした。
明日までの課題ですから焦っていました・・・
272:デフォルトの名無しさん
08/07/01 09:22:30
>>264
「入力規則のリスト」はドロップダウンリストという分類の物で
ドロップダウンリストには入力規則のリスト、フォームツールのコンボボックス、
オブジェクトのコンボボックスなどいろいろあるが
手軽な代わりにあまり弄れないのが入力規則のリスト、
多少面倒はあるがいろいろ弄れるのがオブジェクトのコンボボックス
入力規則のリストでは君の望むことは基本的に出来ないから
オブジェクトのコンボボックスを使いましょう
DropButtonClick イベントで ListIndex プロパティを (ListCount \ 2) にしてやれば
全項目中の真ん中が、表示されるリストのトップにくるようになる
>>271
> 偏差値は定義してますが、計算式がわからないので入力していません。
> 50人分の偏差値はどうだせばいいのでしょうか?
「計算式」というのは数学の問題であって、Excelの問題でもVBAの問題でもない
つーか、ワークシート関数として用意されてるわけだが…
それにしても酷いコードだな
最近では小学校でも算数ではなく数学なんだっけ?
273:デフォルトの名無しさん
08/07/01 10:19:42
>>272
酷いコードですか…ならどういう風なコードにすればいいか教えていただけないでしょうか?
まず自分はコードがわからないんですけどね…
274:デフォルトの名無しさん
08/07/01 10:51:49
>>271
WorkSheet関数を使うのなら、averageとstdevを使えばOK.
>>273
例えば数量に文字列をセットするなんて、論外だ。
275:デフォルトの名無しさん
08/07/01 11:02:37
>>274
なるほど。
つまり、出席番号の1~50も数式?を使ってやった方がいいんですね。
そのやり方も考えてみます。
関数も今は学校なので家に帰ったら試してみます。
276:デフォルトの名無しさん
08/07/01 19:36:30
小学校からやり直した方がいいよ
277:デフォルトの名無しさん
08/07/01 21:38:04
>>250
>>251 >>253 でOKだと思いますが、私からも補足。
Range("a1").Font.Color = vbRed
という書き方もできます。
vbRedは、カラー定数(ColorConstants)と呼ばれるもの。
他にvbBlack、vbBlueなど基本的な8色がカラー定数として
定義されているので、赤青黄ぐらいの区別なら、
これを使ってコーディングするのが楽だと思います。
8色の内容については、
VBAEditorから[表示]→[オブジェクトブラウザ]で
オブジェクトブラウザを開き、"ColorConstants"で
検索してみてください。
278:デフォルトの名無しさん
08/07/01 21:47:52
カラー定数はVBではいいがVBAでは罠がある
人には奨めない方がよろし
279:デフォルトの名無しさん
08/07/01 22:19:02
>>278
横からすんませんが、「VBAでは罠がある 」というのは何でしょう?
280:y
08/07/01 22:27:26
>>237
CommandButtonの背景画像を切り替えてみてはどうでしょうか?
CommandButton1.Picture = LoadPicture("画像ファイルのパス")
で、指定した画像に変わります。
画像を3つ用意して、
(1.通常時 2.マウスオーバー時 3.クリック時)
以下のイベントのタイミングで切り替えます。
初期設定 →1
CommandButton1.MouseMove →2
CommnadButton1.MouseDown →3
CommandButton1.MouseUp →2
UserForm1.MouseMove →1
281:277
08/07/01 22:30:01
>>278
えっ、何ですかそれ!?
私も知りたいので、教えてくれませんか。
バージョンによって定数が示す値が違うとか?
282:237
08/07/02 15:46:14
>>280
ありがとうございます
実はCommandButtonコントロールを使う方法は真っ先に思いついたのですが
背景画像を変えても「四角い輪郭」までは消えないせいでどうにも残念な外観になってしまい
意味がありませんでした。
試行錯誤しましたが最終的にlabelコントロールを4つCommandButtonの輪郭の上に貼って
隠すことにしました(環境の違い等でズレたりしないかが一番心配)
283:y
08/07/02 22:27:45
>>282
私もPictureコントロールで試してみましたが、
確かにうまくいかないですね。
MouseDownイベントプロシージャ内で、
LoadPictureメソッドが正しく機能しないようですが、
こういう仕様なんでしょうかね。
Labelで輪郭消しとは、すごい力技!
284:デフォルトの名無しさん
08/07/03 12:55:09
>>281
俺はエクセルVBAを趣味で使ってるだけだから断定できないが
エクセルは2003まで56色しか使えなかったからカラー定数使っても
56色の中の似た色に変換されてしまうからではないかと思う
(カラーパレット変えれば対応できると思うが同時に使えるのは56色って事かな・・・)
285:デフォルトの名無しさん
08/07/03 20:27:16
6行目中ほどに配置したコマンドボタンが、左右への列移動に伴って、同様にして左右に移動
=画面の中ほどにコマンドボタンがいつもあるようにする。
には、どう書いたらいいですか?
今は、検索して探したものを元に、
commandbottun1 bottun=1 bottun=2で移動するだけで画面からすぐ、隠れてしまう状態です。
よろしく、お願いします。
286:デフォルトの名無しさん
08/07/03 21:47:25
>>285
>画面の中ほどにコマンドボタンがいつもあるようにする。
コマンドボタンがD列にあるとして
range("D6").select
activewindow.freezepanes = true
287:デフォルトの名無しさん
08/07/03 23:09:38
>>286 レス、サンクス。
ただ、それは、「ウィンドウ枠の固定」のことですよね。
説明が拙かったですが、求めているのは、例えば、アクティブセルが右に5列移動したら、
コマンドボタンも同様に5列移動するという内容のものです。
288:デフォルトの名無しさん
08/07/04 08:31:48
>>287
SelectionChangeイベントでActiveCellからOffset指定でコマンドボタンの移動位置を決めれば良い
でもツールバーをフロートで使った方がスマートだな
289:y
08/07/04 21:14:06
>>287
>>288さんの言うようなやり方もありますが、
CommandButtonを貼り付けたUserFormを表示させておく方法もあります。
(この場合UserFormのShowModalプロパティはfalseにしておくこと)
どちらがいいかは場合によりけりだと思います。
ユーザー定義のツールバーを使うやり方は、Excel自体の環境を
変えてしまうので、他人に配布したりする場合には検討の余地が
あります。でも個人で使う分には、コンパクトだし、
好きな場所にドッキングできるので、とてもスマートです。
290:デフォルトの名無しさん
08/07/05 07:52:39
2007でツールバーなくなっちゃったしねー
291:デフォルトの名無しさん
08/07/05 15:12:18
しねとはどういう事だ
292:y
08/07/06 00:04:10
>>290
職場の機種更新で、私も2007を使い始めたばかりですが、
ツールバーが使えなくなっちゃったんですか...
日本語の音声読み上げもオミットされたみたいで
ちょっぴり残念。
脱線ごめんね
293:デフォルトの名無しさん
08/07/06 01:55:10
VBAからCommandBarオブジェクト等は使えるんだけど、
実際に表示されるのはツールバーじゃなくてリボンのアドインタブなんだー
タブを切り替えて使わなきゃいけないから面倒なんだよねー
294:デフォルトの名無しさん
08/07/06 02:38:55
それを手でクイックアクセスツールバーへ追加ってできなかったっけ?
295:デフォルトの名無しさん
08/07/06 07:41:46
うん、個人使用でPersonal.xlsbに登録する類のマクロならそれでいいんだけどねー
296:デフォルトの名無しさん
08/07/06 19:11:47
VBAの初心者で 困っています。
どなたか教えて頂けるとありがたいのですが
ユーザーインターフェースで
西暦(1900年から2100まで) 月(1から12月) 日(1から31日)
をそれぞれテキストボックスに入力し
ボタンを押したら
曜日を表示させる(テキストボックス?)
というのを作ろうとしているのですが よく分かりません。
具体的には 西暦 月 日 を入力して そこから曜日を割り出す計算式(プログラム)と
うるう年の場合の計算式(プログラム)
が分かりません。
あと 入力するテキストボックスに 規定値いがいの値を入力した場合のエラー表示
もよく分かりません...。
すいません くだらない質問で...m(_ _)m
ただ 本当に困っています。
どなたかアドバイス、参考例など教えて頂けるとありがたいのですが
よろしくお願いしますm(_ _)m
297:デフォルトの名無しさん
08/07/06 19:21:32
エクセルならWEEKDAY関数で曜日返してくれなかったっけ???
298:デフォルトの名無しさん
08/07/06 21:11:04
曜日によって処理を変えるとかではなく
曜日を表示させるならWeekday関数+WeekdayName関数だな
ついでに年月日を別々のテキストボックスに入力させるならDateSerial関数も必要かな
> あと 入力するテキストボックスに 規定値いがいの値を入力した場合のエラー表示
> もよく分かりません...。
いろんな手法があるので「プログラム 入力制限」とか「VB 入力規制」とかでググろう
アルゴリズムの話なので、VBA以外での話でも応用出来るからね
でも、年、月、日くらいなら、コンボボックスをリスト選択のみの設定で使う方法もある
299:y
08/07/06 22:02:51
>>296
年・月・日から、曜日を求める方法はいくつかありますが、
大筋は>>298です。まずは次の関数について調べてみてください。
・DateSerial関数 ・Format関数
これらの機能が理解できたら、次のコードが何をしているかわかるはずです。
(うるう年でも問題ありません)
Sub youbi()
Dim year As Integer
Dim month As Integer
Dim day As Integer
Dim theDate As Date
Dim youbi As String
year = 2008
month = 7
day = 1
myDate = DateSerial(year, month, day)
youbi = Format(myDate, "aaa")
MsgBox youbi
End Sub
(続く)
300:y
08/07/06 22:03:31
(続き)
UserForm上のTextBoxに入力されるべき値の範囲を制限する方法について
ですが、まずは新しくUserFormを作って、必要なTextBoxやCommandButtonを
配置するところまではできていますか。
TextBoxに値が入力された時点で値をチェックしたいなら
TextBoxコントロールのChangeイベントを、
CommandButtonが押された時点で値をチェックしたいなら
CommandButtonコントロールのClickイベントを調べて、
イベントプロシージャについて理解してください。
あとは、"TextBoxの値が規定範囲内かどうか調べて、範囲外ならエラー
処理をする"コードを、イベントプロシージャ内に記述するだけです。