Excel VBA質問スレ Part7at TECH
Excel VBA質問スレ Part7 - 暇つぶし2ch112:デフォルトの名無しさん
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の値が規定範囲内かどうか調べて、範囲外ならエラー
処理をする"コードを、イベントプロシージャ内に記述するだけです。

301:デフォルトの名無しさん
08/07/07 14:50:44
数値データから多項式係数を割り出すのにLINEST関数を使ってます。
でもExcelの仕様で、16項までしか対応しないみたいですよね。
VBA使えば255項とか分析できるのかな?
ググったけど、そういうニーズは無いみたい…。

302:デフォルトの名無しさん
08/07/07 15:44:22
そもそも16項もできたっけ? 最近のはできるのかな。
いずれにしても、多項式係数の意味が判っているなら自分で実装できるでしょ。

303:デフォルトの名無しさん
08/07/07 18:39:24
質問させて下さい。
OS:winXP SP2
EXCEL ver:2003

【質問内容】
数式1~3からVBAを使用して
ファイル名、シート名、セルをそれぞれ分割し変数に格納したいです。
どんな方法が適切でしょうか?

数式1⇒=[ブック]シート!$A$1
数式2⇒=[ブック]シート!'!$A$1
数式3⇒=[ブック]シート!!!'!$A$1


現在の処理はDoとMidを使用して左3文字目からIfを使って
1文字ずつ文字判断させています。

"]"がでたら3文字目から"]"の手前までブック名称⇒変数Aへ
"!"がでたら"]"の直後から"!"の手前までシート名称⇒変数Bへ
"!"の直後からはセル⇒変数Cへ

数式1では問題ないのですが、数式2、3みたいに
シート名称に"!"が含まれている場合にシート名称が正常に変数Bに格納されません。

Midを使って"'!"の場合にシート名称を読み込んだとしても、
数式2、3はそれで回避出来ても今度は数式1が認識できなくなってしまいます。

他に良い方法があるのかもしれませんが、全く思いつきません。
わかりにくい文章で申し訳ありませんが、
どうか、ご教授の程よろしくお願いします。

304:デフォルトの名無しさん
08/07/07 18:52:31
こちらのスレにて質問させて下さい。

ログファイルから各種括弧(または類するもの)→ () [] 【】 <> 《》 「」
で囲まれた文字列を取り出したいのですが、どのように処理すれば
よいのでしょうか?ログなので、取り出すのは任意の文字列です。

例:
***(aaa)** → aaa
[warning]*** → warning
月火【水】木金土 → 水

305:デフォルトの名無しさん
08/07/07 19:12:21
1 FINDで”(”の位置を検索する
2 FINDで”)”の位置を検索する
3 MIDで”(”と”)”の間を抜く
4 かっこの種類だけ繰り返す

306:デフォルトの名無しさん
08/07/07 19:47:05
>>303

$で判定するとか

307:デフォルトの名無しさん
08/07/07 20:40:17
>>304
regexp

308:デフォルトの名無しさん
08/07/07 20:50:48
シート名には「!」だけじゃなくて「$」や「'」、おまけに「[」や「]」も使える。
しかも、それはブック名にも当てはまる。
その辺は考慮しなくていいのかな?

309:303
08/07/07 20:57:11
>>306
"$"で判別しても大丈夫だとは思うのですが…
"$"も"!"もシート名称で使えてしまうので、
誰かがそんなシート名称を指定してしまった場合に
対処出来ない様な気がして敬遠してたのですが…


じゃあ…"'!"で存在しない場合に"!$"で判別すれば大丈夫かもですね…

なんだかわかった気がします!
ありがとうございました!

310:308
08/07/07 21:03:49
あーでも「[」とか「]」を使ったら参照できないな

> じゃあ…"'!"で存在しない場合に"!$"で判別すれば大丈夫かもですね…
「'!」とか「!$」を含む事もできるけどね・・・

311:303
08/07/07 21:58:56
>>308、310
あれ?"'"ってシート名称に使えましたっけ…じゃあ駄目じゃん俺_| ̄|○

ブック名称を格納するときは"!"を見ておらず"]"しか見ていないので
大丈夫かと思ってたんですが…やっぱ駄目ですか?

シート名称は"!"を名称として使用すると"'"が繋ぎ部分に加えられる為、
その辺りで判別しようかなと思ったのですが…どうすればよいのやら…

なにはともあれ、お答え下さってありがとうございました!

312:y
08/07/07 22:39:46
>>303

数式1~3がセル参照として成り立っており、かつ
参照先のブックが開いているという前提なら、
単純な方法があります。

(なお、参照先のブックが閉じられた状態では、>>303
 数式1~3のようなセル参照は普通はありえません。
 普通は保存して閉じるだろうし、保存して閉じれば
 数式は絶対パスを含む形に自動的に置き換わるからです。)

■考え方
数式1~3はいずれもセル参照なので、
参照先のRangeオブジェクトを得ることができます。
そこから、Parentプロパティを使って、
親シートおよび親ブックを割り出します。

■具体例
Book1とBook2が開いていて、
Book1のセルA1に
=[Book2]Sheet1!$A$1
という式が設定されているとします。

Dim rg as Range
Dim adr as String, sh as String, bk as String

Set rg = Range(Thisworkbook.Sheets("Book1").Formula)
adr = rg.Address
sh = rg.Parent.Name
bk = rg.Parent.Parent.Name



313:デフォルトの名無しさん
08/07/07 22:51:52
Nameと同一かどうかはわからないけどな

314:デフォルトの名無しさん
08/07/07 23:17:54
>>311
"'"は繋ぎ部分だけじゃなくて先頭にも加えられない?っていうかつまり"'"で囲まれない?

315:303
08/07/07 23:41:30
>>312
仰る通り、現在開いているブック対象にしています。
後々、フォームに組み込もうと思ってまして…
アドインにせずに単体ツールとして運用する予定なので、
必要なファイルは予め開いていて貰うつもりで作っています。


教えて頂いたコードですが、何故か上手く動きませんでした…
Formulaの記述でストップしてしまいます…
(当方2003を使用しています。)
Formuraってバージョン依存ありましたっけ…?
もっとよく調べてみます…


>>314
シート名称からの指定ですと、確かに先頭に"'"は付きますが、
ブック名称からの指定や、フルパス指定だと先頭には"'"はつかないようです。

316:303
08/07/08 00:06:35
>>312
サンプルが動きました!
一度Variantで取り出してからRange指定しなきゃ駄目だったみたいです。

これがあればいちいち変なループ処理を組み込まずとも、
それぞれの名称を獲得できますね!

いやはや勉強不足でご迷惑をおかけしました…
皆さん、本当にありがとうございました!!

317:デフォルトの名無しさん
08/07/08 09:36:50
regexp使えば楽だったね。

318:デフォルトの名無しさん
08/07/08 11:47:39
>>302
>>301です。
VBAでworksheetfunction.linestってのがあった。
これで実装してみたけど、やっぱり16項までが限界だったみたい。
バージョンは2003です。

以上、報告まで

319:デフォルトの名無しさん
08/07/08 15:37:59
初歩的な質問なのですが、ブックを超えて操作をさせようとするとどうしても上手く動きません。

book2.xlsを開き

book1.xls の sheet2 A1 の内容を

book2.xls の sheet1 A1 に書き込む

とするにはどう書けば良いのか教えて下さい。

どなたかお願いします。

OS XP
EXCEL2000

320:y
08/07/08 16:17:05
>>303

ごめんね。>>312のコードはだいぶ変でした。
Rangeオブジェクトを取得する行は正しくは

Set rg = Range(ThisWorkbook.Sheets("Sheet1").Range("a1").Formula)

でした。でも、自分なりに解決できたとのこと、何よりです。



321:デフォルトの名無しさん
08/07/08 16:23:58
emoji1 = InStr(ActiveCell, "か")
emoji = Mid$(ActiveCell, emoji1, 3)
emojip = Worksheets(2).Cells.Find(emoji).Offset(, -1)
ActiveCell.Replace what:=emoji, Replacement:=emojip
このようなマクロで activecell="あかきくお" emoji="かき"だった場合に
置換した後はactivecvell="かきこ"
となってemoji以前がそっくり削られてしまいます
どのように書けばactivecellの中のemojiだけを置換できるのでしょうか?

322:デフォルトの名無しさん
08/07/08 16:28:48
>>319
ヒント。

Workbooks.Open ("C:\2.xls")
Workbooks("2.xls").Sheets("sheet1").Range("A1").Value = Workbooks("1.xls").Sheets("sheet2").Range("A1").Value

後は自分で考えれ。

323:デフォルトの名無しさん
08/07/08 16:42:09
>>321
それだけじゃ emojiip に何が代入されてるのかも分からないよ。
察するに sheets(2) にデータテーブルを持たせてるのかな。 
"かきこ" も、何故でしょうか。

ちょっと頭がボーっとしてるんで、私が読みきれてないだけだったらごめんね。

それと、位置を代入してる変数に emoji1 だと訳が分からなくなるから気をつけた方がいいかも。


324:デフォルトの名無しさん
08/07/08 16:57:17
>>323
ありがとうございます、やはりポイントだけ書き込んでも分かりづらいですよね;
そしてすみません、"かきこ"ではなく"かきお"でした;

sheets(2)はおっしゃる通りで絵文字変換表があります。
A列絵文字を入力して B列絵文字に変換しようと考えたコードなのですが
A>Bはうまくいったものの、戻すのも作ろうとコード丸写しから改編しB>Aのものを動作させると
代入したい部分だけでなくセルの前半ごと変換されてしまいました。

自分用の小さなものなので、変数名は手抜きしています;

325:デフォルトの名無しさん
08/07/08 17:38:48
うーん。先ずはもっと小さく組んで、それが上手く行ったら大きくして行かないとデバッグ出来ないかもなぁ。
具体的に言うと、変数には予め代入してしまう。
ActiveCellじゃなくて、変数で文字列を代入しておくといいね。
あと、findする列が決まってるならば、cellsで全体から検索ではなくて、columnsで指定した方がスマートです。

dim hoge as string
dim emoji as string
dim emojiip
hoge = "あかきくお"
emoji = "かき"
emojiip = sheets("sheet2").columns(2).find(emoji).offset(0,-1)

まず、ステップインでF8を押しつつ1行ずつ実行して行って、emojiipに目的の物が代入されたかをチェック。
その後で、
hoge.replace what:=emoji , replacement:=emojiip

こんな感じで、どこにおかしい部分があるかを少しずつ調べて行くと良いですよ。




326:321
08/07/08 18:06:54
>>324 済みませんでした
B>A 変換は置換対象の頭に"*"が含まれていて、ワイルドカード扱いになっていたみたいです。
なので前半がそっくり削れていたんですね;;
こういう場合は*以前を別変数に収めておいて、変換後くっつけると言うようにするしかないのでしょうか?

327:デフォルトの名無しさん
08/07/08 18:08:37
もう面倒だからRegExpでreplaceしちゃいなYO!!

328:デフォルトの名無しさん
08/07/08 18:09:11
うそです

329:314
08/07/08 19:17:00
>>315
ああ、うん、ブック名込みで囲まれるみたいだからシート名だけ見ると後ろだけだね
まあもうどうでもいいね

330:67
08/07/08 21:43:58
inStrとmidで出来るからやってるんだろうけど、
個人的には正規表現使った方がスマートだと思うんですわ。

あまり正規表現が好まれない理由って何なんでしょうか。

331:デフォルトの名無しさん
08/07/08 21:52:46
つーか、好みどうこう言えるのは、自分で解決できる奴の特権
人に聞くなら実用上不都合が無ければ良しとするべき

332:デフォルトの名無しさん
08/07/08 22:02:37
303です。
>>320
わざわざ修正後のコードをあげて下さりありがとうございました!
おかげさまでファイル取得が楽になりました。

>>329
すみません…読解力が足りませんでした…
当初の処理だと既に開いているファイル名称を対象に
ブック判断用文字列"]"
⇒"]"が見つかればシート判断用文字列"'"を直後から探す
⇒"'"が見つかれば直後からアドレス
という風に左側から一文字ずつIFを階層にさせていたため、
最初に"'"があったとしても"]"が見つからない限りブック名称とする処理をしてました。
ファイル名で"]"は入力できなかったはずなので
ブック名称は間違えようがないと思って作ってました。

…今考えると凄まじくめんどくさい処理ですね。

そんな感じなので"]"の前にある"'"は処理上認識しないからと頭の中で完結させてました。

ともあれ、アドバイスありがとうございました!
もっと勉強しておきます…

333:y
08/07/08 23:17:27
>>330
私の場合ですが、正規表現は何となく苦手なんです。
2~3回のテストではうまくいくようでも、実際に
いろいろな文字列を処理させてみると、どうやら論理的に
穴があるらしく、意図した結果が得られないことが
よくあります。

表現が回りくどくなっても、文字数や位置をもとに単純な
条件分岐を積み重ねる作りにしておくと、事前チェックや
デバッグの際に、各行をトレースして細かいレベルの動作を
明示的にチェックでき、個人的にはとても安心です。

向き不向きもあるようで、人によっては正規表現でひょひょいと
書いてしまう方もいます。「この式で大丈夫」と確信できるのは、
正規表現の動作を頭の中でシミュレートできるからなのでしょう。
とても羨ましいです。


334:デフォルトの名無しさん
08/07/09 01:56:20
配列操作の練習を兼ね、CreateObjectで一時的に作成したシートに
コンボボックスのデータを転記し、ソートした後に配列に書き戻す…
といった事を考えたのですが、

Set myWorkbook = CreateObject("Excel.Sheet")

とした途端、元ブックのウィンドウサイズが変わってしまいます。

Application.ScreenUpdating = False では防げないようなのですが、
どうすれば挙動が見えないようにできるでしょうか?

335:デフォルトの名無しさん
08/07/09 02:23:28
ボタンを押すと、変数にA3にある変数を1足したいのですが、

Cells(1, 3).Value = "Cells(1, 3).Value" + "1"

とやっても、増えてくれません。
特に変数は使っていませんが、どのようにすれば、変数の値を増やすことができるのでしょうか?

336:デフォルトの名無しさん
08/07/09 02:59:18
>>335 " ← を取ってみ

337:デフォルトの名無しさん
08/07/09 03:03:43
>> 335 A3にある変数て何?
セルA3の値なら Cells(3,1).Value Cells(1,3).Value だとセルC3だぞ

338:335
08/07/09 03:11:38
変化がありませんでした、私の条件式に問題があると思います。

Sub 今日の日付()

' A1が今日の日付で無ければ、通し番号を1にして、A1値を今日の日付にする

If "Cells(1, 1).Value" <> Date Then
Cells(1, 3).Value = 1
Cells(1, 1).Value = Date
ActiveSheet.Name = Format(Date, "yyyymmdd")

' 今日の日付であれば通し番号を増やす
Else

Cells(1, 3).Value = Cells(1, 3).Value + 1

End If

End Sub

こんな感じです、ボタンを押したら、今日か過去か日付を判断して、
過去なら(つまりはテンプレシートをコピーした直後)
通し番号を1にして、A1の日付を今日に、

すでに今日作っているなら、
通し番号を2にして、シート名を「20080709-2」と「ハイフンと通し番号」を付け加えたかったのです
(ここはまだまだ難しくて未実装)


339:335
08/07/09 03:13:00
ちなみに、最初のifで日付が今日で無いときは処理がうまくいっています。
日付が今日なら、どうやらelse以降が実行されていないようです。

>>337
たしかに変数なんて使っていませんね、すいません。

340:デフォルトの名無しさん
08/07/09 07:24:02
なぜCells(1, 1).Valueを"で囲む?

341:デフォルトの名無しさん
08/07/09 07:39:37
>>338
>340の言うとおり。
Ifのすぐ後ろのCellsを""で囲んでいるのをとる。

342:デフォルトの名無しさん
08/07/09 10:06:13
>>304
Sub test()
Dim hoge, hogematch, piyo, hitpat, moji As String
Set hoge = CreateObject("VBScript.regexp")
moji = "月火【水】木金土"
hitpat = "【.*】"
'hitpat = "\(.*?\)" '最小マッチ、\(でエスケープ
'hitpat = "\[.*\]" 'メタ文字でググるとgood
With hoge
.Pattern = hitpat
.ignorecase = True
.Global = True
End With
Set hogematch = hoge.Execute(moji)
piyo = hogematch(0)
piyo = Replace(piyo, "】", "") '加工例1
piyo = Replace(piyo, "【", "")
'piyo = Mid(piyo, 2, 1) '加工例2
Debug.Print (piyo)
End Sub

343:デフォルトの名無しさん
08/07/09 10:13:44
コメントは適当に消してね

344:304
08/07/09 13:10:31
できました!ありがとうございます!

345:デフォルトの名無しさん
08/07/09 16:38:09
ぬお。エクセルで正則表現使えたのか!
恥ずかしながら知らなかった・・・。
横からマジ感謝。

346:338
08/07/09 18:09:41
>>340
>>341
くはー、できました!
ダブルクォートで囲むと意味が変わるのですね。
連番で上がりました。

あとは、シート名に連番をつけていくのが目標です。
VBA楽しいですね、
手作業で面倒だった、EXCELが自分専用の便利ツールになりますね。

347:デフォルトの名無しさん
08/07/09 18:57:16
ExcelがEXILEにみえてきた

348:デフォルトの名無しさん
08/07/09 19:18:04
しばしディスプレイから目を離し、遠くの緑をみつめよう~。

349:デフォルトの名無しさん
08/07/09 22:50:21
Excel2007
WindowsXPsp2

「ズームボタンが押された状態で」印刷プレビューを開くにはどうしたらいいですか?

350:デフォルトの名無しさん
08/07/10 00:31:43
Excel-VBA は楽しいだろうが、Excelそのものはあんまし
楽しいものじゃないと思う

351:デフォルトの名無しさん
08/07/10 09:29:53
ワードとかパワポなんて仕事でも使ったことねえ

352:デフォルトの名無しさん
08/07/10 11:17:53
「Excelで文章書く奴は初心者」



ってのはよく言われる事だが実際には
全然そんなこと無いと思う。
寧ろWordで作る意味が分からない。


353:デフォルトの名無しさん
08/07/10 11:38:39
winXP。EXCEL2003
並び替えでの質問ですが、
2008年6月30日
2008年6月2日
2008年6月27日
の文字列としてあるデータを並び替えで昇順にしたいんですが
マクロの自動記録時には正確に
2008年6月30日
2008年6月27日
2008年6月2日
となりますがそのマクロを実行すると
2008年6月30日
2008年6月2日
2008年6月27日
となってしまいます。
コードは
Columns("B:H").Select
Selection.Sort Key1:=Range("B1"), Order1:=xlDescending, Header:=xlNo, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, SortMethod _
:=xlPinYin, DataOption1:=xlSortTextAsNumbers
どこをどうやればうまく行くのでしょうか?

354:デフォルトの名無しさん
08/07/10 11:39:56
age

355:デフォルトの名無しさん
08/07/10 11:47:56
>>352
だよな
会社で扱うファイルのうちワードなんて1割もない

356:デフォルトの名無しさん
08/07/10 12:02:41
取り扱い説明みたいなものを書くのにはWordは楽だよ。
これで、アウトラインプロセッサ機能がもう少し使い易ければもっといいのだけれど。
まぁ、原稿用紙が美しいと思う日本人にはExcelで型に填めるのが好きな人が多いのは判らんでもないけど。
数式やコードが入るような文章書くときにも、レイアウトをそれほど意識しないでもいいのは助かるしね。
まぁ、よほどのことがない限りPowerPointは使わないけれど。

357:y
08/07/10 17:44:33
>>353
並べ替えを記録する際、きちんと「昇順」を選択していたのなら、
Order1はxlDescendingではなくxlAscendingになっているはずです。

また、自動記録時にその結果になるためには、
「並べ替えの前に」ダイアログボックスで
「数値とテキスト形式の数値を分けて並べ替えを行う」を
選択しているはずです。
その場合、DataOption1はxlSortTextAsNumbersではなく、
xlSortNormalとして記録されるはずです。

以上から、記録したマクロではないマクロを実行している可能性
があります。もし、自動記録を何度か繰り返したのなら、
いくつか似たようなマクロができてしまっていると思いますので、
よく確かめてみてください。




358:y
08/07/10 19:02:56
>>352
たぶん、この手の初心者のことを言っているのでは。
URLリンク(d.hatena.ne.jp)
...誰でも最初は初心者なので仕方ないですが...

Excelは、横幅の描画単位がかなり曖昧です。
セルの書式設定を「折り返して全体を表示する」に
したとき、編集画面ではきちんとセルの中におさまっていても、
プレビューで見るとはみ出て切れてしまったり、
セル幅とグラフオブジェクトの幅が、やはりプレビューで見ると
だいぶ違ったりするのは、やはり文書向きのソフトではないと
感じてしまいます。

でも、Excelも便利だと感じるときもあって、その1つが
行間隔を直感的にリサイズできる点。
Wordにも、行間隔スライダーみたいなツールが実装されたら
すごい便利なのに、といつも思います。

359:デフォルトの名無しさん
08/07/10 19:43:32
> 1つのシートに、縦に表1と表2が並べてあるドキュメントなのですが、
> 表1に列を追加しようとしたところ、当然ながら表2にも列が追加されてしまう

これは当然じゃないだろ…

360:y
08/07/10 21:15:15
>>349

私の知る限り、プレビュー画面を拡大するメソッドはVBAには
実装されていません(というより、プレビューが開いている間は
VBAの実行が一時的に停止しています)。

力技ですが、ショートカットコマンドを利用する方法があります。
普段はショートカットコマンドを使っていますか?
例えば、[Alt][W][F]の順でポンポンポンとキー入力すると、
ウィンドウ枠の固定ができる、といったような機能です。

うちのExcelは2003なのですが、[Alt][F][V][Z]でプレビュー画面が
ズームされます。これをVBAでは、

SendKeys "%fvz"

と表現できます。詳しくはSendKeysステートメントを調べてみてください。
ただしこれは、Excel2003までの場合です。
2007でも2003以前のショートカットの大部分は生きているので、
このステートメントをそのまま使えるかもしれませんが、
できれば2007のショートカットコマンドを調べて実装したほうがいいでしょう。

なお、SendKeysはアクティブなアプリケーションに対して有効です。
マクロをVBAEditorから実行すると、VBAEditorに対してSendKeyしてしまうので、
実行するときは必ずExcelから実行してください。

361:デフォルトの名無しさん
08/07/10 22:36:32
>>357
降順のコードからコピーしてました。
xlSortTextAsNumbers、xlSortNormal
どちらで試しても日付順にはなりません。

自動記録でなパターンを順番に記録して
実際にマクロを実行しても一度も日付順にはならないのです。
EXCELの仕様(不具合)と見たほうがいいのかな?



362:デフォルトの名無しさん
08/07/10 23:05:54
バグだの仕様だの、ってのは簡単に言ってはいかんのだ。
それを言った時点で全てが終わりってくらい重く考えないといかんよ。

プログラムは言われた通りの事”しか”やらないんだからね。

363:y
08/07/11 06:21:02
>>361

あ、すみません。>>357の私のレスに間違いがありました。
DataOption1についてはxlSortTextAsNumbersでOKでした。
訂正します。

でも、それでもうまくいかないのですか。
(うちではうまくいくのですが...)

364:デフォルトの名無しさん
08/07/11 08:27:27
俺はDataOption1とかの使い方は知らないが、そこを無視すると
"2008年6月2日"
"2008年6月27日"
この文字列の大小は9文字目の"日"と"7で"比較されるから、上の方が大きくなるのは当然じゃないのか?
バグでも何でもないと思うんだが。

文字列を日付として大小比較するなら
"2008年06月02日"
"2008年06月27日"
という形の文字列にしないとまずいんじゃないのか?

"2008年12月6日"
"2008年6月30日"
これだと下の方が大きくなるからね。

文字列の大小比較するより、データ、区切り位置、日付でシリアル値に変換した方がいいと思うがね。

365:デフォルトの名無しさん
08/07/11 08:45:49
ちょっと訂正
この文字列の大小は9文字目以降の"日"と"7日"で比較されるから


366:y
08/07/11 17:06:01
>>364
「数値に見えるものはすべて数値として並べ替えを行う」は
意外に賢くて、日付と解釈できる文字列はシリアル値として
解釈し、並べ替えてくれます。
"2008年12月6日" → 39788
"2008年6月30日" → 39629
と読まれて、きちんと6月が先頭に来ます。
ただし、"2008年0月4日"みたいな変なのは、日付を表す
シリアル値として解釈できないので、昇順で並べ替えても
12月より後ろに来ます。

>>361
...でも正直なところ、>>364の意見に賛成です。
シート上の日付文字列を、どうしても文字列のままにしておかなければ
ならない理由が特になければ、シリアル値に変換してしまった方が
いいかと。日付文字列→シリアル値の変換は、DateValue関数
で簡単にできます。変換さえすれば、昇順の並べ替えも
全く問題なくできるようになるでしょう。


367:364
08/07/11 18:29:15
>>366
トンクス。
「数値に見えるものはすべて数値として並べ替えを行う」ってのがあるのか知らなかったよ。
俺の2007の並び替えのオプションじゃ見つからんのだが....。
VBAにはDataOption1とかあるから、ちゃんと実装してるんだろうけど。

それはおいといて>>353のコードで降り順にソートすると、
"2008年6月2日"
"2008年6月27日"
これは>>353のいうようにこの通りに並ぶね。
きちんとシリアル値に解釈できてたらそんなことないはずだけどね。
そんなおかしなオプションは使わないことだろうね。


368:364
08/07/11 19:00:54
2007でいろいろ試してみたが、
"2008年6月2日"のような形式の文字列は、DataOption1:=xlSortTextAsNumbersで数値としてみてないらしいぞ。
"2008/6/2"というような形式の文字列なら、きちんとシリアル値と解釈して並び替えるようだが。
VBAでは"2008年6月2日"のようなローカルな形式はサポートしてないんじゃない?

369:y
08/07/11 19:54:57
>>368

「数値に見えるものはすべて数値として並べ替えを行う」オプションは、
2003以前のバージョンでも、普段のソートダイアログには出てきません。
セル書式が文字列になっているセルを含むセル範囲を基準に並べ替えを
行う場合に限り、「並べ替えの前に」ウィンドウが開き、その中にあります。

うちのはExcel2003ですが、上記の方法でうまく並べ替えできます。
2007では何かが変わってしまったのでしょうか...

"yyyy年m月d日"の形の文字列は、少なくとも2003のVBAでは解釈可能です。
たとえばDateValue("2008年6月2日")とすると、
正しく39601が返されます。
ひょっとして2007では、これもエラーになってしまいますか?
だとすればサポートされなくなったのかも...
職場のPCにExcel2007が入ったので、今度自分でも試してみます。

何にしても、Excel的にはシリアル値+書式指定にしておくのが
一番ですね。


370:364
08/07/11 20:08:18
うーむ、2007ではセル書式が文字列になっててもそういうウィンドウは開かないみたいね。
それからMsgBox CLng(DateValue("2008年6月2日"))とすれば2007も39601が返るよ。

とにかく>>353のいうように"2008年6月2日"って形式だと、あのコードではうまくいかないね。
昔、記録マクロが動かないことってNumberFormatで確かあったなぁ。
今回も似たようなことじゃないかな?



371:y
08/07/11 21:22:09
>>370
参考までに、Excel2003ではこうなります。
URLリンク(www2.uploda.org)

>>349
2007の印刷プレビューについて、今日職場で試してみたら、2003以前とは
全然挙動が違うようですね。
2003以前ではプレビューを開くと必ず標準状態で開きましたが、
2007ではプレビュー画面を拡大状態で閉じると、次回表示したとき
拡大状態で開いてしまうようです。従って、お望みの動作は、残念ながら
SendKeysステートメントを使っても得られないようです。


372:デフォルトの名無しさん
08/07/12 00:32:36
おれ、こういうの気持ち悪いので
いったんテンポラリバリアントで取得してタイプネーム確認する 特に日付

373:364
08/07/12 07:59:20
>>371の動画はダウンローダー使ってるせいか見れなかったが、2007でもオプションで「ふりがなを使わない」にしたらやっと「数値に見えるものはすべて数値として並べ替えを行う」のウィンドウが出たよ。
aaa bbb
2008年6月3日 2
2008年6月30日 1
2008年6月28日 3

A列の書式が文字列のこのようなデータで記録マクロをとってみたが、下のような今まで全然見たこともないようなコードだった。
Sub Macro1()
' Macro1 Macro
Range("A1:B4").Select
ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Add Key:=Range("A2:A4"), _
SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:= _
xlSortTextAsNumbers
With ActiveWorkbook.Worksheets("Sheet1").Sort
.SetRange Range("A1:B4")
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlStroke
.Apply
End With
End Sub
これはきちんと動くようだ。

374:364
08/07/12 08:00:09
続き

そこで2003用の下のようなコードを書いて走らせてみたが、全然期待したようには動かんね。

Sub foo()
With Range("A1").CurrentRegion
.Sort Key1:=.Range("A1"), Order1:=xlDescending, Header:=xlYes, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, SortMethod _
:=xlPinYin, DataOption1:=xlSortTextAsNumbers
End With
End Sub

>>353は2003で作ったマクロを2007で走らせたんじゃないの?

375:364
08/07/12 08:09:14
上の「期待したようには動かん」は、期待したようには並ばないって意味だから。

376:ちはる
08/07/12 18:44:39
regexpも良いけど、like演算子も状況によっては悪くないのよ!!!!
ぷんぷん!!!!!

Sub aho()
'3の倍数と3の付く行はアホになります。
Dim i
For i = 1 To 1000
If i Like "*3*" Then
Cells(i, 1).Value = "アホ"
ElseIf i Mod 3 = 0 Then
Cells(i, 1).Value = "アホ"
End If
Next
End Sub

もうジメジメして嫌になっちゃうわ。

377:デフォルトの名無しさん
08/07/13 11:18:51
Shellの挙動がおかしくなった。最近Windows Updateしたあたりからだと思う。
例えば、
Shell "C:\Documents and Settings\Ore\デスクトップ\hoge.bat"
が、急に動かなくなった。

実行エラー5
プロシージャの呼び出し、または引数が不正です。だって。

7月のパッチをアンインストールしても直らない。
原因わかる人いますか?


378:377
08/07/13 11:21:12
環境は、Xp + Excel 2003 です。

379:デフォルトの名無しさん
08/07/13 14:19:42
>Shell "C:\Documents and Settings\Ore\デスクトップ\hoge.bat"
>が、急に動かなくなった。

うそこけ。動くわけなかろ

380:デフォルトの名無しさん
08/07/13 15:23:02
> 379

そこは、動かない訳を書かないと。

Vista + Excel 2007で、
Shell "C:\Users\Ore\Desktop\hoge.bat"
は、動くね。


381:デフォルトの名無しさん
08/07/13 16:42:04
WinXP(アップデート済) + Excel 2003 だと動かなかった。
C直下のものでも。exeファイルなら動くね。

382:デフォルトの名無しさん
08/07/13 23:36:02
377です。

381さん、ご協力ありがとう。
ちなみに、hoge.batの中身は、何か書いてないとダメなようです。

例えば、
dir
pause
のような感じです。念のため。

あと、別のPC Xp Sp2 + Excel 2003 では、動くのを確認しました。
やっぱり、今月のパッチかな?


383:381
08/07/13 23:43:52
ああ、確かに書けば動くね。

384:デフォルトの名無しさん
08/07/14 17:37:05
質問です。1~4の順にプログラムを進めたいと思っています。

1.メッセージボックス「セルを選んでください」。
2.メッセージボックスのOKボタンを押す。
3.シートに戻り、任意セルをクリックする。(セルが選ばれるまで先の処理に進まない)
4.選ばれたセルの情報を取得。

環境はExcel2000 WinXPです。

このような処理をしたいのですが、
どういう考え方で進めたらよいでしょうか?
よろしくお願いします。


385:デフォルトの名無しさん
08/07/14 17:53:59
Sub test()

MsgBox "セルを選んでください"

End Sub

386:デフォルトの名無しさん
08/07/14 18:01:01
>>384
結構厄介だと思うので、もっと楽にできるU/Iで作ってみてから挑戦するといいと思う。
当然ではあるが、>385では2番までしか実装されていない。

387:384
08/07/14 18:09:53
>>385
書き方が悪くてすいません。でもちょっとワロタ
メッセージボックスを出した時だけ、直後で選ぶセルの情報を取得したいんです。

>>386
厄介ですか。
Worksheet.SelectionChange やAPIでなんとか出来ないかなあと思っていたんですけど・・


388:って書くと、知らないのに書くなとか書かれるんだろうなぁw
08/07/14 18:11:43
>Worksheet.SelectionChange やAPIでなんとか出来ないかなあと思っていたんですけど・・
それが判っていて、厄介じゃないと思うなら自分でやってみてくれ。
説明するのも厄介だぞ。

389:デフォルトの名無しさん
08/07/14 18:28:53
InputBoxメソッドで
Typeを8でどうさ?

390:384
08/07/14 19:06:52
>>388
いえいえ。どうもありがとうございます。
知っているから厄介だと分かるのだと思います。
別の考え方や参考になる意見を聞けたらいいなあと思ってました。
説明も厄介であれば仕方ないです。

>>389
なんだかよさそうですね。
タイプ8にこんな機能があったとは・・
とりあえずそれでやってみます。

>>386さんの言うとおりU/I使ってあんまり欲張らないで
ちょっとずつやっていくほうがいいみたいですね。

みなさんホントどうもです。聞いてよかったです。





391:デフォルトの名無しさん
08/07/14 19:13:25
>385もあながち悪くないと思った暑い夕暮れ

392:y
08/07/14 22:03:21
>>384
SelectionChangeイベントを使う場合の考え方:
パブリック変数を用意し、イベント許可フラグとして用いる。
イベント発生時、イベントプロシージャの冒頭で
イベント許可フラグが立っているか否かを判定し、
プロシージャの内容を実行するか、何もせずにプロシージャを抜けるか
分岐させるようにしておく。
こうしておけば、普段はSelectionChangeイベントが発生しても
何もせずに終わるが、「セルを選んでください」表示後にフラグを
立てれば、次のSelectionChangeイベントでプロシージャの内容が
実行される。
ここでセルの情報を取得し、最後にフラグを元に戻しておく。
---------

ここまで書いておいて何ですが、
明らかに>>389のやり方のほうが優れています。

393:デフォルトの名無しさん
08/07/15 00:05:38
1.メッセージボックス「セルを選びましたか?」
2.メッセージボックス「本当にいいんですか?」
3.メッセージボックス「いいんですね?」
1のところでなれたら使うボタンを追加しとくとか


394:デフォルトの名無しさん
08/07/15 00:29:36
質問があります。
複数のワークシートにまたがった複数範囲の標準偏差を計算するため、最初はUnionでそれぞれの範囲のRangeを纏めて最後にWorksheetFunction.StDevで
計算するコードを書いてみたのですが、エラーが発生しました。
どうもUnionでは異なるワークシートのRangeは纏められないようで、何か別のいい方法は無いかと探しています。

例えば以下の例は、Sheet1の各列の中から、数値が10個以上ある列だけをUnionで纏めて標準偏差を求めるものです。

Dim myRange As Range, myMultipleRange As Range

Set myMultipleRange = Nothing

For Each myRange In Worksheets("Sheet1").Columns
If WorksheetFunction.Count(myRange) >= 10
If myMultipleRange Is Nothing Then
Set myMultipleRange = myRange
Else
Set myMultipleRange = Union(myMultipleRange, myRange)
End If
End If
Next myRange
If Not myMultipleRange Is Nothing Then
MsgBox WorksheetFunction.StDev(myMultipleRange)
End If

このような標準偏差の計算を、1つのワークシートの列だけでなく、ワークブック内のワークシート全体から、
10個以上数値がある列を調べて標準偏差を計算するような方法を探しています。
ただしワークシートの個数は決まっていません。
どのような方法を使えば上手く計算することが出来るのでしょうか?
環境はWindows XP、Excel2003です。
よろしくお願いします。

395:デフォルトの名無しさん
08/07/15 08:48:16
>>394
作業シート作って(予め非表示で用意しておいても良いし、処理前に作成して処理後に削除しても良い)
そこに必要な値を書きだして計算する

またはワークシート関数を使わずに、普通に計算してもいいかもな
標準偏差関数のサンプルなんて腐るほどあるから、わざわざVBAから
ワークシート関数(WorksheetFunction)呼ばなくてもどうにでもなる

396:デフォルトの名無しさん
08/07/15 12:45:01
ここで解説してくれる優しい方々は、やっぱりエクセル1級持ってるのかですな?

397:デフォルトの名無しさん
08/07/15 12:56:23
そんなもの持ってるやついるの?

398:384
08/07/15 13:02:18
>>392
レスどうもです。
「セルを選んでください」の表示前にあったセル位置の情報しか取得出来なくて、

>3.シートに戻り、任意セルをクリックする。(セルが選ばれるまで先の処理に進まない)

この3番のユーザーの入力待ちがどうしても出来ません。

>>393
どうもです。
連続した作業になるので、メッセージボックスは1度だけにしたいんです。





次ページ
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch