[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 2chのread.cgiへ]
Update time : 05/30 05:22 / Filesize : 296 KB / Number-of Response : 978
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

Excel VBA 質問スレ Part23



1 名前:既定のプロパティさん mailto:sage [2012/01/29(日) 00:05:13.16 ]
01 pc11.2ch.net/test/read.cgi/tech/1054356121/
02 pc11.2ch.net/test/read.cgi/tech/1168308855/
03 pc11.2ch.net/test/read.cgi/tech/1180192018/
04 pc11.2ch.net/test/read.cgi/tech/1189814602/
05 pc11.2ch.net/test/read.cgi/tech/1197448064/
06 pc11.2ch.net/test/read.cgi/tech/1205231499/
07 pc11.2ch.net/test/read.cgi/tech/1212587819/
08 pc11.2ch.net/test/read.cgi/tech/1219673793/
09 pc11.2ch.net/test/read.cgi/tech/1228372971/
10 pc12.2ch.net/test/read.cgi/tech/1235332603/
11 pc12.2ch.net/test/read.cgi/tech/1241885130/
12 pc12.2ch.net/test/read.cgi/tech/1247566074/
13 pc12.2ch.net/test/read.cgi/tech/1254281104/
14 pc12.2ch.net/test/read.cgi/tech/1262748898/
15 pc12.2ch.net/test/read.cgi/tech/1271261239/
16 hibari.2ch.net/test/read.cgi/tech/1280045912/
17 hibari.2ch.net/test/read.cgi/tech/1289182437/
18 hibari.2ch.net/test/read.cgi/tech/1298240666/
19 hibari.2ch.net/test/read.cgi/tech/1305754555/
20 hibari.2ch.net/test/read.cgi/tech/1312435844/
21 hibari.2ch.net/test/read.cgi/tech/1316931607/

前スレ:
Excel VBA 質問スレ Part22
toro.2ch.net/test/read.cgi/tech/1322400978/


231 名前:デフォルトの名無しさん mailto:sage [2012/02/16(木) 23:37:49.90 ]
>>230
>>225がコントロールツールボックスのボタンの場合じゃないのか

232 名前:デフォルトの名無しさん mailto:sage [2012/02/17(金) 08:00:18.97 ]
>>229
アドインって .xla のこと?
.dll のように、色んなワークブックからCallされる自分用関数をまとめておくとか。
でも、キャッシュみたいのがかかっていて結果不定になるので、デバッグ面倒だよ。

233 名前:デフォルトの名無しさん mailto:sage [2012/02/17(金) 17:43:41.83 ]
>>232
229です。

>結果不定になるので、デバッグ面倒だよ。

なんか扱いが大変そうだな・・・
教えていただきありがとうです

234 名前:デフォルトの名無しさん mailto:sage [2012/02/17(金) 17:52:06.19 ]
>>232
> でも、キャッシュみたいのがかかっていて結果不定になるので、デバッグ面倒だよ。
んなこと全然無い。

アドインのメリット。
例えば、社内用の勤怠計算を行うマクロを書いたとする。
そのマクロが入った、データ入力用シート入りのBookを社員に配布する。
配布した後で、バグが見つかって修正したり、機能を追加したりしたくなったらどうする?

「マクロが入った、データ入力用シート入りのBook」だと、もうデータ入力済みの場合、
全員のBookをまるごと取り替えることはできないから、マクロ部分だけ入れ替える必要がある。

これを、「勤怠計算を行うマクロ」が入ったxlaと、データ入力用のBookに分けておくと、
xlaを更新したら全員に配布して、ファイルを入れ替えてねで済む。

もちろん、他言語のライブラリ同様、ライブラリとしてのメリットは全て持ってる。

235 名前:デフォルトの名無しさん mailto:sage [2012/02/17(金) 19:17:34.63 ]
関数について質問です

1日  名前A  条件1
1日  名前B  条件2
8日  名前C  条件1
8日  名前D  条件2
8日  名前E  条件1
8日  名前F  条件2

とシート1にデータがあり、別シートのリストに8日で条件2に合致する名前だけを
上から順に(空白行無しで)抜き出す場合、どのような関数を使えば出来るでしょうか?
IFでやろうとするとどうしても不一致の行が空白になってしまいます。
お力添えをよろしくお願いします。

236 名前:デフォルトの名無しさん mailto:sage [2012/02/17(金) 19:53:43.47 ]
>>235
VBAでではなく、ワークシート関数でってなら

Excel総合相談所 100
toro.2ch.net/test/read.cgi/bsoft/1325935411/l50


237 名前:デフォルトの名無しさん mailto:sage [2012/02/17(金) 20:33:56.12 ]
なにそのタライ回し。いつもより多く回ってるんじゃないの。

238 名前:デフォルトの名無しさん [2012/02/17(金) 20:43:07.85 ]
このスレはいつもこうだよ


239 名前:デフォルトの名無しさん [2012/02/18(土) 01:22:32.32 ]
チェックシートを作成したく、
表の右に設置したボタンを押すと隣接するセルの背景色が変化するものを作っています。

ボタンの数が100程度あるのですが、ボタン1つ1つに以下の関数を格納するのには非常に手間がかかります。

Private Sub CommandButton1_Click()

With Range("A2").Interior
.ColorIndex = 36
.Pattern = xlSolid
End With

End Sub

Private Sub CommandButton2_Click()

With Range("A3").Interior
.ColorIndex = 36(省略)

一括で設定する方法はありませんか?




240 名前:デフォルトの名無しさん mailto:sage [2012/02/18(土) 01:26:54.85 ]
修正です
誤 With Range("A2").Interior

正 With Range("A2:C2").Interior


241 名前:デフォルトの名無しさん [2012/02/18(土) 01:31:10.99 ]
× チェックシートを作成したく、
○ チェックシートを作成したいのですが、

日本語は大切にね

242 名前:デフォルトの名無しさん mailto:sage [2012/02/18(土) 01:34:56.42 ]
>>239-240
スレ違いな答えになるけど、条件付き書式を使ったほうがいいかと。
書式を「"○"」、条件付き書式として0より大きいなら背景色を設定とかやれば、
1を入力してやればチェックって感じに出来ると思う。

243 名前:デフォルトの名無しさん mailto:sage [2012/02/18(土) 01:42:17.46 ]
>>239
コマンドボタンはどのセルに配置してあるの?
D列のセル?

244 名前:239 mailto:sage [2012/02/18(土) 02:02:35.32 ]
>>241
失礼しました。
以後気をつけます。
>>242
ググってみましたが自分の希望に沿えるものではなさそうです。
あくまでワンクリックで背景色の変化ができるものを作成したいと思っております。
参考画像を用意いたしました。ttp://uploader.sakura.ne.jp/src/up84658.jpg

作成したいと思っているチェックシートについて
・隣接する行の背景色を変えることによるチェックをする。
※詳細
チェックボタンを押すと背景色を変化させる
(With Range("A2").Interior .ColorIndex = 36 以下略)
さらに隣の取り消しボタンを押すと背景色なし設定にする
・値の入力ではなく、ボタンをワンクリックすることで変化させる。(これが重要事項だと思われます)

例の画像は8行ですが実際に作成するものは100行以上になります。

以上になります。よろしくお願いいたします。


245 名前:239 mailto:sage [2012/02/18(土) 02:11:02.38 ]
>>243
画像では見やすくするために中央のほうへ寄せましたが、
いわゆるD列にボタンが配置されているものと思われて結構です。

ボタン自信をセルに配置することが自分の知識ではわからないので、
配置はコピーで行ってます。(セルを選択してCtrl+vを押すだけなので我慢)
つまるところボタンのオブジェクト名の番号が1,2,3...と上昇します。

ボタンが数個なら>>239のコードを複数コピーして値を変化させることができますが、
100以上となると無理ではありませんが非常に面倒です。

そこで一括で設定する方法は無いものか模索していたところです。

多分一番重要なことを忘れていましたが私はExcelVBAについては初心者です。

度々すみません。よろしくお願いいたします。


246 名前:デフォルトの名無しさん mailto:sage [2012/02/18(土) 02:15:02.93 ]
>>244
答えてあげたいが、時間がない

例えば
topleftcellを引数で渡すプロシージャを作って
それぞれのボタンクリックのプロシージャから
呼び出せば?

テキスト(プログラム)を出力するプログラムを書いて
それをインポートする手もある

クラスモジュールを使うか

247 名前:デフォルトの名無しさん mailto:sage [2012/02/18(土) 02:56:50.47 ]
>>244
よくわからんがこんなのでいいのか?

' ボタンを D5 から 10個作成
Sub CreateButtons()
Set baseaddress = ActiveSheet.Range("D5")
For i = 1 To 10
CreateButton baseaddress.Cells(i, 1)
Next
End Sub

Sub CreateButton(cell)
x = cell.Left
y = cell.Top
w = cell.Cells(2, 2).Left - x
h = cell.Cells(2, 2).Top - y
Set btn = ActiveSheet.Buttons.Add(x, y, w, h)
btn.Text = "chk"
btn.Name = "chkbtn_" & cell.Row
btn.OnAction = "CheckButton_Click"
End Sub

Sub CheckButton_Click()
Row = Mid(Application.Caller, 8)
With Range("A1").Cells(Row, 1).Interior
.ColorIndex = 36
.Pattern = xlSolid
End With
End Sub


248 名前:247 mailto:sage [2012/02/18(土) 03:13:52.81 ]
一応簡単に説明しておくと
ボタンクリックのイベント内からは Application.Caller でクリックしたボタン名が取得できる
ボタン名をあらかじめ chkbtn_<行番号> として作成しておき、イベント内で行番号をボタン名から切り出して現在の自分の行番号を取得している
イベント内でボタン名が取得できるので、クリックのイベントプロシジャを個別に作成する必要はなく、すべて共通でよい

この例はチェックボタンだけだけど、当然同じやり方でクリアボタンも作成できる

249 名前:239 mailto:sage [2012/02/18(土) 03:25:21.74 ]
>>247
試してみましたがうまく動作しませんでした。
多分こちらのボタンの置き方が悪いのかもしれません。
(前述の通りExcelVBA及びコンソールの配置等は初心者です。すみません。)
また関数の大まかな意味も知っておきたいのですが、
もしお時間が許すのであればご教示のほどをお願いします。



250 名前:239 mailto:sage [2012/02/18(土) 03:26:41.00 ]
>>247
書き込み中のすれ違いになってしまいました。
ありがとうございます!!
もう一度試してみます。 

251 名前:239 mailto:sage [2012/02/18(土) 03:45:13.45 ]
>>247
すみません何度か試行錯誤を繰り返してみましたがどうにもうまく動作しません。
お手数ではありますが扱い方のご教示、
もしくはソースファイルのアップロードをお願いいたしたいのですが。

252 名前:54 mailto:sage [2012/02/18(土) 03:52:25.06 ]
>>241
別に間違ってないよ。

253 名前:デフォルトの名無しさん [2012/02/18(土) 04:37:15.26 ]
>>251
俺は247さんじゃないけど、
247さんのコードを標準モジュールにコピペするだけで動いたよ
(全部コピペして、Sub CreateButtons() を実行)
ちなみに環境はWin7 64bit、Excel2000、です

むしろ貴方がどのようにやったのかを具体的に提示したほうが早いと思う。
たとえば上記コードを標準モジュールじゃなくボタンに貼り付けたりしてないよね?


254 名前:239 mailto:sage [2012/02/18(土) 05:25:47.81 ]
>>253
今までシート自体にコードを貼り付けていました。
標準モジュールを新たに挿入して貼り付けたら無事動作いたしました!
大変勉強にもなりました。

ご回答していただいた皆様本当にありがとうございました。
ソースコードを記述いただいた>>247さんには感謝の限りです!
本日は朝も近いのでお休みいたします。
最後に改めてありがとうございました。

255 名前:デフォルトの名無しさん mailto:sage [2012/02/18(土) 06:44:14.37 ]
俺もこれ利用したいけど 単一のセルしか塗りつぶしできない
どうすれば行を(この場合だとA2からC2までの)指定出来ますかね

256 名前:253 mailto:sage [2012/02/18(土) 09:55:21.93 ]
>>255
With Range("A1").Cells(Row, 1).Interior

With Range("A1").Cells(Row, 1).Resize(, 3).Interior
にするとAからCの3列が書き換わる

257 名前:デフォルトの名無しさん mailto:sage [2012/02/18(土) 13:19:54.76 ]
すみません>>247のコードでボタンを二つ作りたいのですが、
標準モジュールを新たに挿入すると内容が二つとも同じになってしまいます。
対処法を調べても理解できないのでどなたか教えてください。

258 名前:デフォルトの名無しさん mailto:sage [2012/02/18(土) 13:37:55.77 ]
>>257
Sub CreateButtons()
Set baseaddress = ActiveSheet.Range("D5")
For i = 1 To 10
CreateButton baseaddress.Cells(i, 1), True
CreateButton baseaddress.Cells(i, 2), False
Next
End Sub
Sub CreateButton(cell, check)
x = cell.Left + 4
y = cell.Top + 2
w = cell.Cells(2, 2).Left - x - 4
h = cell.Cells(2, 2).Top - y - 2
Set btn = ActiveSheet.Buttons.Add(x, y, w, h)
btn.Text = ""
btn.Name = "chkbtn_" & cell.Row
If check Then
btn.OnAction = "CheckButton_Click"
Else
btn.OnAction = "ClearButton_Click"
End If
End Sub


259 名前:258 mailto:sage [2012/02/18(土) 13:38:28.19 ]
続き

Sub CheckButton_Click()
Row = Mid(Application.Caller, 8)
With Range("A1").Cells(Row, 1).Interior
.ColorIndex = 36
.Pattern = xlSolid
End With
End Sub

Sub ClearButton_Click()
Row = Mid(Application.Caller, 8)
With Range("A1").Cells(Row, 1).Interior
.Pattern = xlNone
End With
End Sub




260 名前:253 mailto:sage [2012/02/18(土) 13:46:16.46 ]
>>257
具体的にはどう調べたの?
これって調べてどうこう言うような次元の話じゃなくて
単純にVBAのプログラムが読めるかどうかの話だよ。

一応説明すると、247氏のコードは3つのプロシージャから構成されてるけど、
Sub CreateButtons() は単に最初のセル位置(D5)を決めて、
そこから下方向に10回同じことを繰り返す、って言う処理だけを指示している。
次の Sub CreateButton(cell) で指示されたセル位置にボタンを作る作業をしている。
作るボタンの名前は"chkbtn_"に何番目のボタンかを示す数字1~10が付いたもので、
そのボタンの動作は"CheckButton_Click"で指定されたものになる

で、最後の Sub CheckButton_Click() は上で書いたとおり、
そのボタンがクリックされたときの動作を指定している。
つまり、ボタンの名前"chkbtn_"+番号 の番号部分からセルの行位置を割り出して
その行の色を塗り替えてるわけ。

だから取り消しボタンを作りたいなら2番目のプロシージャに取り消しボタンを作る処理を追加して、
3番目と同様に取り消しボタンの動作を指定する4番目のプロシージャを書き足す作業をすれば良いんだよ。

これだけ説明されて分からないなら、多分今の貴方には作れないと思うよ


261 名前:253 mailto:sage [2012/02/18(土) 13:51:56.14 ]
って俺が長々説教かいてる間に
>>258さんがコード作ってくれちゃったね。
>>257良かったな。

でもこういうのただ丸投げするより
動作原理を理解して自分でいじれるようになった方が良いから
自分でもがんばってね

262 名前:デフォルトの名無しさん mailto:sage [2012/02/18(土) 14:07:08.52 ]
>>258
一部修正必要だけど、257には無理かもね

263 名前:デフォルトの名無しさん mailto:sage [2012/02/18(土) 14:24:35.19 ]
Application.Caller ってボタン名というかオブジェクト名しか取れないのが使いにくいけど、
あらかじめ Dictionary 使ってオブジェクト名をキーにして情報格納しておけば、
ボタンクリックでオブジェクト名から数字だけを切り出すまでもなく、
座標やチェック/クリアの属性なんかも関連付けできるようになるのでいろいろ応用は効く


264 名前:253 mailto:sage [2012/02/18(土) 14:34:40.85 ]
今更だけど>>260に間違いがあったので修正
>作るボタンの名前は"chkbtn_"に何番目のボタンかを示す数字1~10が付いたもので、
は1~10じゃなくてそのボタンの行が入ってる。最初のボタンがD5だから5~14になるね

>>262
あ、ほんとだ塗りつぶしボタンと取り消しボタンに同じ名前指定してるね
とりあえず
btn.Name = "chkbtn_" & cell.Row
の部分も
If check Then
の中に入れて条件分岐で名前変えるのが早いかな
取り消しは"clrbtn"とかだね

265 名前:デフォルトの名無しさん mailto:sage [2012/02/18(土) 14:47:53.44 ]
>>264
いやオブジェクト名は、どのみち影響しないけど
修正したいと言うと予想されるのはキャプションのほうね

266 名前:デフォルトの名無しさん mailto:sage [2012/02/18(土) 17:18:24.54 ]
こんにつわ
alt+F11押したらVBAProjectパスワード、要求されたんだけど、へるぷみー

267 名前:デフォルトの名無しさん mailto:sage [2012/02/18(土) 17:29:55.96 ]
事故解決下

268 名前:デフォルトの名無しさん [2012/02/18(土) 23:05:13.47 ]
Excelで「平成1年」を「平成元年」と表示させるための一番簡単な方法はなんですか?
ちなみに昭和や平成の他の年もいっぱいまざっています。


269 名前:デフォルトの名無しさん mailto:sage [2012/02/18(土) 23:20:54.49 ]
Replace(s, "平成1年", "平成元年")




270 名前:デフォルトの名無しさん mailto:sage [2012/02/19(日) 00:13:58.80 ]
> 昭和や平成の他の年
の考慮が漏れてるではないか。

271 名前:デフォルトの名無しさん mailto:sage [2012/02/19(日) 00:20:14.51 ]
[^0-9]1年

272 名前:268 [2012/02/19(日) 00:58:11.82 ]
>>269
でかした!

>>270-271
どういうこと?

273 名前:デフォルトの名無しさん mailto:sage [2012/02/19(日) 03:27:02.71 ]
風邪で寝込んでて暇だからやってみた。バグがあるかもしれんから取扱注意。

年だけの場合
Public Function 元年変換From年(paramValue As String) As String
Dim i As Integer, yearValue As String
元年変換From年 = paramValue
For i = 1 To Len(paramValue)
If Mid(paramValue, i, 1) Like "#" Then yearValue = Mid(paramValue, i): Exit For
Next i
If Val(yearValue) = 1 Then 元年変換From年 = Replace(元年変換From年, Val(yearValue), "元")
End Function

年月日の場合
Public Function 元年変換From年月日(paramValue As String) As String
Dim paramDateValue As Date
paramDateValue = DateValue(paramValue)
元年変換From年月日 = Format(paramDateValue, "ggg") & IIf(Format(paramDateValue, "e") = 1, "元", Format(paramDateValue, "e")) & Format(paramDateValue, "年m月d日")
End Function

※ 年月日の方であり得ない日付(平成1年1月1日など)を入れると本来の日付(昭和64年1月1日など)に変換される。


274 名前:デフォルトの名無しさん mailto:sage [2012/02/19(日) 06:24:27.04 ]
>>272
>>269では誤動作するケースがある、というのは分かる?
経験があれば、真っ先に>>270-271のようなことが浮かぶもんだよ。

275 名前:デフォルトの名無しさん mailto:sage [2012/02/19(日) 06:39:48.49 ]
Excel上での表示の話なんだから…
「Excel 1年 元年」でググってみ。いろいろやり方があって面白いよ。

第1位に出てる、セルの表示形式を
[<32516]ggge"年"m"月"d"日";[>32873]ggge"年"m"月"d"日";"平成元年"m"月"d"日"
にしろってヤツ、いかにもExcel臭いがCool…なのかなw
自分的には、文字列にしてから置換する方が好きだ。

276 名前:デフォルトの名無しさん mailto:sage [2012/02/19(日) 07:14:45.79 ]
元号使わなきゃ無問題

277 名前:デフォルトの名無しさん mailto:sage [2012/02/19(日) 07:17:24.42 ]
>>275
VBAスレでセルの表示形式の回答?

278 名前:デフォルトの名無しさん mailto:sage [2012/02/19(日) 11:10:34.97 ]
今特別養護老人ホームに勤めていて、頭を使って手書きで勤務表を作っています
ExcelのVBAで自動で勤務を割り振ってくれる勤務表は作れますか?

279 名前:デフォルトの名無しさん mailto:sage [2012/02/19(日) 11:11:32.23 ]
特定のファイルの追加、削除の監視をDO〜LOOPで行おうと思うのですが、
監視を任意のタイミングで終了させるにはどうしたらいいでしょうか?



280 名前:デフォルトの名無しさん mailto:sage [2012/02/19(日) 11:19:38.11 ]
>>278
作れる。簡単ではないけど。
コツコツやって具体的にわかんない部分が出たらまた来ればいい。

>>279
終了フラグを用意して、DO〜LOOP前でクリアDO〜LOOP内でチェック。
終了ボタンなどで終了フラグを書き換える。



281 名前:デフォルトの名無しさん mailto:sage [2012/02/19(日) 11:21:42.39 ]
>>279
Exit Do

282 名前:279 mailto:sage [2012/02/19(日) 11:30:53.47 ]
早速のレス、ありがとうございます。
ループ中に終了ボタンって押せるんでしょうか?
UserFormにスタートボタン、終了ボタンを置いてテストしてるんですが、
ループ中は終了ボタンが押せません。
フォーカスを終了ボタンに移すこととかってできるんでしょうか?
ループ中でもボタンを押すにはどうすればいいんでしょうか?
よろしくお願いします。

283 名前:デフォルトの名無しさん mailto:sage [2012/02/19(日) 11:35:10.73 ]
>>282
DO〜LOOP内、各行前後にDoEvents入れて見。
足りなそうなら増やして見。


284 名前:279 mailto:sage [2012/02/19(日) 11:38:53.91 ]
>>283
できました。
ありがとうございました。


285 名前:デフォルトの名無しさん [2012/02/19(日) 16:29:31.34 ]
Do〜LOOP使うならWhile使えよ

286 名前:デフォルトの名無しさん [2012/02/19(日) 18:01:02.40 ]
そーいえばどっかで平成が何年までか求めるコードがあったな

287 名前:デフォルトの名無しさん mailto:sage [2012/02/19(日) 18:45:33.02 ]
>>286
> 平成が何年までか求める

宮内庁から怒られるんじゃないのか…

288 名前:デフォルトの名無しさん mailto:sage [2012/02/19(日) 19:17:04.08 ]
今年で,,,, ゲフンゲン

289 名前:278 mailto:sage [2012/02/19(日) 19:36:06.20 ]
>>280
ありがとうございます、コツコツやってすぐ分からなくなってまた来ます
その時は教えて頂けたらありがたいです



290 名前:デフォルトの名無しさん [2012/02/19(日) 19:52:21.66 ]
こちらでも質問させてください。
会社では2010、家では2003を使用して「終了」ボタンを押すと「終了」する
VBAを作成しています。Webページとして保存した場合、ボタンを押しても
起動しません。Webページとしてボタンを押せるようにするには
Sub ()
Dim rc As Long
rc = MsgBox("○○を終了しますか?", vbYesNo + vbQuestion)
If rc = vbYes Then
Application.Quit
Windows("ファイル名.xls").Close True
Else
MsgBox "いいえが選択されました。", vbExclamation
End If
End Sub
としてどこを変更すれば良いでしょうか?

291 名前:デフォルトの名無しさん mailto:sage [2012/02/19(日) 20:16:12.70 ]
堂々とマルチ宣言

時代変わった? w

292 名前:デフォルトの名無しさん mailto:sage [2012/02/19(日) 22:47:40.35 ]
こんにつわ、質問です。

With ActiveSheet.QueryTables.Add(Connection:=で、Web上のテーブルを取り込んだのですが、このテーブルの指定セルだけを取り込むにはどうすれば良いですか?

293 名前:デフォルトの名無しさん mailto:sage [2012/02/19(日) 23:20:17.56 ]
>>289
勤務表作成なら興味があるので手伝ってもいいですよ
ただプロバイダが2ちゃんで書き込み禁止になることがよくあるので
書けるときだけですが

とりあえずググって見ましたか?
自分の業務で自分だけが使うのなら作りやすいのですが
自分の異動など他の人に業務を任せることも考えると
画面デザインが重要になりますね

294 名前:デフォルトの名無しさん mailto:sage [2012/02/19(日) 23:25:53.88 ]
すいません、多分超簡単なんでしょうけど質問させて下さい

最近VBAを勉強し始めましたのですが、あるセルを基点(仮にA5)としてそこから左端にアクティブセルを移動した後、
仮にAA,AAAと言う文字が来たら、そのセルから右に5列の場所にaa、
BB,BBBと言う文字の場合はbbと言う文字を、それ以外の場合はメッセージボックスにccとでるようにして、
その後一行下に移動して、上記の作業を仮に10回繰り返していき、最後はA1にアクティブセルを移動させると言う問題があったのです。

それを変数を使って解くというようなことがあったのですが、

sub ()
Dim z As String , i As Integer
Range("A5").Select
For i = 1 To 10 Step 1
z = ActiveCell.Value
Select Case z
Case = "AA","AAA"
ActiveCell.Value="aa"
ActiveCell.Offset(0,5)
Case ="BB","BBB"
ActiveCell.Value="aa"
ActiveCell.Offset(0,5)
Case else
MsgBox"cc"
End Select
ActiveCell.Offset(1,0)
Next i
Range("A1").Select
End sub

としたのですが、うまくいきませんでした。どこが間違ってるのか自分ではわからなかったので教えて下さい
こんな初歩的な質問でスイマセン・・・

295 名前:デフォルトの名無しさん mailto:sage [2012/02/20(月) 00:11:23.16 ]
>>294
OffsetはRangeオブジェクトを返すプロパティ…
とか言う以前に論理的に変だよ
プログラム知らない人でもこんなコードは書かない

ActiveCell.Offset(0,5).Value="aa"
とか
ActiveCell.Offset(0,5).Value="bb"
とか
ActiveCell.Offset(1,0).Select
として見れば?

296 名前:278 mailto:sage [2012/02/20(月) 00:25:03.13 ]
>>293
ホントですか!?
ありがとうございます
色々ググって見て、とりあえずデザインから作り始めてます
自分が使うだけなので特に問題ないです
複雑だから結構難しそうですね・・・

297 名前:デフォルトの名無しさん mailto:sage [2012/02/20(月) 00:38:53.21 ]
>>296
>自分が使うだけなので特に問題ないです
仕事に使うならこの考え方はないです
エンドユーザコンピューティングの典型的な悪いところ
業務にVBAを使う以上、他の人が使えることが最低条件です


298 名前:278 mailto:sage [2012/02/20(月) 00:42:20.32 ]
>>297
そうですよね・・・
異動になったりしたとき他の人が使えないと困りますしね
気をつけて作っていきたいと思います

299 名前:デフォルトの名無しさん mailto:sage [2012/02/20(月) 01:13:25.65 ]
>>298
エンドユーザーコンピューティングでやりがちなミス

・ 変数等の名づけが行き当たりばったり
・ 変数等の用途が途中で変わっても名前を放置
    →  名づけのルールを決めて、それに従う。もしずれたら補正する。
変数やSub、Functionの名前がバラバラだとソースを見る時、一々定義を確認しなきゃならない。
自前のルールで決めて、それに従ってればわりと見やすくなる。

・ 設計の時に考慮した事・あえて無視した事を書き残さない
    →  メモ書きの内容も含めてあとで読んでもわかるように資料化する
資料がないと、バグが発生した時に考え方のバグなのかプログラム化する段階でのバグなのか切り分けが大変。

・ 資料を作っても読み返さない
    →  資料化したものは月に1回ぐらいは読み返してみよう。
慣れていないと、必要な事が抜け落ちた資料になったりする。

・ 必須機能や各種条件などを決める前にプログラミングを始める
    →  少なくとも基本方針、前提条件、などはプログラミング前に資料にまとめよう。
固定で必須な条件と、人数の増減などで変更が発生する条件ぐらいは切り分けてからプログラミングした方が楽。

・ 同じことの繰り返しを何か所にもコピペ
    →  同じことはFunctionやSubにまとめてそれを呼び出す。
ミスがあった場合それもコピペで増えるので、ソース内でのコピペは可能な限り避ける。

方針メモ出来たらうpしてみ。



300 名前:278 mailto:sage [2012/02/20(月) 07:57:10.04 ]
>>299
そんなに色々あるのですか・・・
これ教えてもらってないと大変なことになってました;
とりあえず基本方針?と前提条件をまとめてみます

301 名前:294 mailto:sage [2012/02/20(月) 08:01:46.57 ]
>>295
ありがとうございます
やっぱり独学じゃダメなのかな・・・
もっと勉強します

302 名前:278 mailto:sage [2012/02/20(月) 09:49:16.54 ]
とりあえず思いついたメモを羅列
・人によってできる勤務が異なる(夜勤1は出切るが夜勤2は出来ない等)
・夜勤はなるべく連続しないようにする(夜勤、明け、休み、夜勤・・・)
・早番がすぐに来ないようにする(早番、日勤、休み、早番)
・前月の夜勤の明け、明け休みも考慮する。早番も
・希望休、希望勤務を入力できるようにする
・同じ番号の勤務はなるべく続かないように
・休みも偏らないようにする
・勤務は各回数入力できるように(休みも9回の時などあるので入力)

もっとある気がしますが、この時点で凄く難しそう…

303 名前:デフォルトの名無しさん mailto:sage [2012/02/20(月) 10:07:26.30 ]
>>302
ナーススケジューリング問題(ググれ)に匹敵するような要件の場合、勤務表を作成するのはすごく困難。

304 名前:デフォルトの名無しさん mailto:sage [2012/02/20(月) 10:36:51.36 ]
>>302
最初から自動割振りするシステムは難しいから、
割振り入力してボタンを押すと問題がある割振りに色を付けるシステム
(夜勤連続だと赤、休み集中だと青など)
を作ってみたら?



305 名前:デフォルトの名無しさん mailto:sage [2012/02/20(月) 13:05:17.31 ]
>>303
あんまりおどすなよ。

306 名前:デフォルトの名無しさん mailto:sage [2012/02/20(月) 13:41:17.42 ]
>>302
落ち着け。

勤務表作成を新人に引き継ぐ感覚でまとめてみ。
それもおまいさんが急用でどうしても質問受けれない場合にどう引き継ぐか。

その感覚でまとめれば要件資料としてはそれなりになるはず。

「すごく困難」って言ってる人がいるけど、正攻法で1からやろうとすると困難かもね。
単純ロジックで乱数うまく使って種表作って、
補正が手詰まりになったら最初からやり直すプログラムにすれば、
表が完成するまでの時間はかかるけどなんとかなる。



307 名前:デフォルトの名無しさん mailto:sage [2012/02/20(月) 14:10:35.11 ]
>>306
> 補正が手詰まりになったら最初からやり直すプログラムにすれば、
> 表が完成するまでの時間はかかるけどなんとかなる。

それ、いつ終わるの?
組み合わせ爆発、半端ないよ?

308 名前:デフォルトの名無しさん mailto:sage [2012/02/20(月) 14:52:45.60 ]
>>306
仮に要件が固まったとしても、それを実現できるコードを書けるとは限らない。

汎用的なシフト勤務ソフトがそれほど出回ってないのは、それぞれの職場の都合が大きく異なるのということより、
やはりシフト勤務作成そのものが難しいからだと思う。

実際ナーススケジューリング問題でググればわかると思うが、正攻法では無理なのでGAによる解法がかなり
研究されてる。

309 名前:278 mailto:sage [2012/02/20(月) 16:18:27.47 ]
ナーススケジューリングは気をつけないといけないんですよね・・・
やっぱりそこが難点ですか困難なほどに;

引継ぎ感覚でもう少し具体的にまとめてみます

コード書くのはほとんど初心者で何から手をつけたらいいのか全然分からないですが…
少しずつでも頑張っていきます



310 名前:デフォルトの名無しさん mailto:sage [2012/02/20(月) 16:35:41.36 ]
勤務表に関しては入力支援を強化してアナログ入力した方が早いんだよな

ボタンひとつで終われば楽っちゃ楽なんだけど
継続的に使えるプログラムを作成する労力と、1ヶ月のうち勤務表作成にかける労力を考えると
どうしてもアナログ入力になる。

>>309
つーか、この件に関しては引継ぎなんて考えるなよw
できる人ができる形でやればいいんだよ
どうせ素人が扱えば余計な動作やエラーで詰むし
そこそこ使える人ならそれなりのモノ作るんだから

311 名前:デフォルトの名無しさん mailto:sage [2012/02/20(月) 19:27:43.39 ]
つーかさ、>>278はNSPの一般解求めるのが目的じゃなくて
職場の勤務表を作るのが目的なんだから
とりあえず作成に必要な要件をもっときちんと書き出してみたらどうよ。
>>302の情報だけじゃ結局>>278にしか分からんじゃん。
たとえば勤務シフトには何種類あるのか、(明、早、日、夜1、夜2、休の6種類なのか?)
スタッフ何人いて各シフトにはそれぞれ何人割り振るのか、
そのうち何人がシフトに制約があるのか、etc.
具体的に書き出したらそこそこ何とかなるかも知れんのと違う?
まぁ現状で(手書きの状態で)どの程度満足できるシフトを作れてるのか
もわからんから、あんまり厳しい条件だと自動化は無理だろうけど。

312 名前:デフォルトの名無しさん mailto:sage [2012/02/20(月) 20:33:52.13 ]
実際の勤務表に近いものをどこかにUploadしてください
他業界の人に勤務表作成を依頼するつもりで説明してください


313 名前:278 mailto:sage [2012/02/20(月) 20:49:48.30 ]
そうですね、それでは確実なところから
・勤務は 早番、日勤、夜勤1、夜勤2、明け、休み、有給、研修
 日勤は2番、3番・・・とあり多いときで(行事などの日)10番とかも
 土曜、日曜日は4番、5番までなど少ないことが多い
 平日は大体6番、7番以上まで欲しい(希望休が重なるなどで5番までのこともあり)
 正職、パート、嘱託?や人により可能な勤務が違う
 パートには休みを全部自分で指定する人もいたり。
 一日の勤務で最低 早番、2番、夜勤1、夜勤2、明け*2、明け休み*2が正職か嘱託でいる
 夜勤ではこの人とこの人は一緒にできない、がある
 早番はやったら次の早番まで5日は間が欲しい
 夜勤は基本連続しないように(夜勤、明け、休み、夜勤…無理ならOK)
 先に勤務を希望している場合あり(早番、夜勤なども)
 前の月の夜勤の明け、明け休みも考慮する
 休み、同じ番号の勤務はなるべく連続しないように。偏りのないように
 休みは基本月10回。月により前後することあり、又多い人もいる

とりあえずシフトに関することはこれくらいかな・・・

314 名前:デフォルトの名無しさん mailto:sage [2012/02/20(月) 21:46:17.55 ]
連続したセルに値を書き込むのに簡単な方法は無いでしょうか?
セルに値を書き込むと、自動的に隣のセルにフォーカスが移動するみたいな

315 名前:デフォルトの名無しさん mailto:sage [2012/02/20(月) 21:59:23.91 ]
看護士の勤務表は、準夜・深夜・休みを縦横計算しとけばいいと思う。
あとは、希望勤務の登録かな・・・


316 名前:デフォルトの名無しさん mailto:sage [2012/02/20(月) 22:10:25.86 ]
>>314
それをVBAでやりたいって事?
エンター押すと横移動はオプションで設定できる。

317 名前:デフォルトの名無しさん mailto:sage [2012/02/20(月) 22:11:21.36 ]
>>313
だ・か・ら・他業種の人相手にその説明で理解できると思う?
何番ってのは人数なのか?だったらなんで
>早番、2番、夜勤1、夜勤2、明け*2、明け休み*2
って一番が居なくて2番が居るんだ?
これだと1日8人が必要ってことだが
>日勤は平日6番、7番以上欲しい
ってのはこの8人には含まれてないのか?
そもそもこのシフトを全部で何人で回してるんだ?
(これ一番重要かもしれない)

>>314
それ普通にエンター押せば次のセルに行くじゃん。
エンター押下で上下左右のどちらに行くかは
ツール=>オプション=>編集から
"入力後にセルを移動する" の "方向"で変えられる。


318 名前:デフォルトの名無しさん mailto:sage [2012/02/20(月) 22:12:20.14 ]
>>314
VBAと関係なく、普通に移動するんじゃないの。
下方向か横方向かは設定次第だが。

319 名前:314 mailto:sage [2012/02/20(月) 22:25:10.40 ]
自己解決しました、レス有難うございます

Private Sub Puts(s As String)
Dim r As Long, c As Long
r = ActiveCell.row
c = ActiveCell.Column
Cells(r, c) = s
Cells(r, c + 1).Select
End Sub



320 名前:278 mailto:sage [2012/02/20(月) 22:29:35.78 ]
説明難しいですね…
早番=1番と考えていただければいいです
平日7番までというのは日勤者(2番〜7番の6人)です
今現在は正職が13人、嘱託が1人、パート2人、(関係ないけどお掃除さん1人)
ただ3月で正職と嘱託が1人ずつやめます

パスは vba です
これは勤務表
www.dotup.org/uploda/www.dotup.org2664409.jpg.html
勤務表の一番右になります
www.dotup.org/uploda/www.dotup.org2664415.jpg.html
これが当番表になります。
実際作りたいのはこっちで考えています
www.dotup.org/uploda/www.dotup.org2664419.jpg.html

321 名前:デフォルトの名無しさん mailto:sage [2012/02/20(月) 22:29:39.19 ]
そんなもん必要になる状況がよくわからん。

322 名前:デフォルトの名無しさん mailto:sage [2012/02/20(月) 22:36:30.41 ]
>>320
質問。
明けについて。夜勤明けの勤務なの?それとも明け休み?
それは夜勤と確実にペアなものなの?夜勤だけで明けがない場合もあるの?

323 名前:デフォルトの名無しさん mailto:sage [2012/02/20(月) 22:44:58.89 ]
>>320
現状のままだと3月以降に条件を満たすのは無理
NSPがどうこう言う以前に延べ人数で考えたらすぐ分かる

まず一個目の画像から1日平均10人が勤務する必要があることがわかる。
つまり1ヶ月で延べ300人必要

対してスタッフは3月以降14人(16-2=14)、
この人たちが月平均10日休むってことは20日働くってことで
20*14=280人ってことで、300-280=20人 => ちょうど1人分足りない

ってことで、15人以上居ないとあなたの施設は回らない


324 名前:デフォルトの名無しさん mailto:sage [2012/02/20(月) 22:45:15.43 ]
>>321
帳票付けるときに重宝する
TABキー使わずにテンキーとエンターだけで表の端まで行ったら先頭列の1行下に移動できるし

325 名前:278 mailto:sage [2012/02/20(月) 22:49:31.98 ]
>>322
夜勤は(夜勤、明け、休み)で1セットは確実です
明けが無いとかはないです

>>323
一応来年度に新しい職員が2人入るのと異動で何とかなるとは思いますが…
それでも厳しいのには変わりないんですよね

326 名前:デフォルトの名無しさん mailto:sage [2012/02/20(月) 23:03:01.95 ]
>>278
資料をまとめなおしてみたよ。読んでみて違う所の指摘と、研修について月何回とか決まってるかとか、教えてプリーズ。

278番様向け 勤務シフト表入力支援システム要件書 (ドラフト)

1.職員の種類
 正職、パート、嘱託などがあり。
 人によって可能な「勤務」に違いがある。(パートは日勤3番以降のみ。)

2.勤務の種類
 早番、日勤(2番〜10番)、夜勤1、夜勤2、明け、休み、有給、研修などがある。
 同じ種類・番号の勤務(および休み)はなるべく連続しないように。偏りのないように。
 最低限必要な1日の勤務人数は
 早番、日勤(2番〜5番)、夜勤1、夜勤2、明け、明け、休み、休み
 の11名。(休み2名は前々日の夜勤1、夜勤2。強制。)

3.早番
 別名1番。

4.日勤
 2番、3番・・・と(行事などの日)10番ぐらいまである
 平日は大体6番、7番以上まで欲しい(希望休が重なるなどで5番までのこともあり)
 土曜、日曜日は4番、5番までなど少ないことが多い

つづく・・・

327 名前:デフォルトの名無しさん mailto:sage [2012/02/20(月) 23:03:49.82 ]
つづき

5.夜勤
 夜勤ではペアを組ませられない組み合わせがある。
 夜勤は基本連続しないように(夜勤、明け、休み、夜勤…可能な限りにならないよう…)
 前の月の夜勤の明け、明け休みも考慮する

6.明け
 夜勤の翌日は自動的に入る。

7.休み
 休みは基本月10回。月により前後することあり、又多い人もいる
 パートには休みを全部自分で指定する人もいたり。
 夜勤の翌々日は自動的に入る。

8.研修
 − 未稿 −

9.有給
 有給休暇。

-以上-

328 名前:278 mailto:sage [2012/02/20(月) 23:18:59.70 ]
とても綺麗にまとめていただいてありがとうございます
>人によって可能な「勤務」に違いがある。(パートは日勤3番以降のみ。)
パートで3番ができない人もいます(一応)

休みは年間を通して計算しているので(年度始めには回数は決まっていますが)
9回だったり11回だったりします
休みが多い人というのはパートの人で、配偶者の給料から計算して入れているようです

研修は出張みたいな感じで、休みではないけど職場にはいないとなります
月に一度あるかないか(無いことのほうが多い)であっても一人だけです

329 名前:デフォルトの名無しさん mailto:sage [2012/02/20(月) 23:43:30.36 ]
278番様向け 勤務シフト表入力支援システム要件書 (ドラフト2)

1.職員の種類
 正職、パート、嘱託などがあり。
 人によって可能な「勤務」に違いがある。(パートは日勤3番以降※のみ。)
 ※ 人によっては日勤4番や5番しかできない。

2.勤務の種類
 早番、日勤(2番〜10番)、夜勤1、夜勤2、明け、休み、有給、研修などがある。
 同じ種類・番号の勤務(および休み)はなるべく連続しないように。偏りのないように。
 最低限必要な1日の勤務人数は
 早番、日勤(2番〜5番)、夜勤1、夜勤2、明け、明け、休み、休み
 の11名。(休み2名は前々日の夜勤1、夜勤2。強制。)

3.早番
 別名1番。

4.日勤
 2番、3番・・・と(行事などの日)10番ぐらいまである
 平日は大体6番、7番以上まで欲しい(希望休が重なるなどで5番までのこともあり)
 土曜、日曜日は4番、5番までなど少ないことが多い

つづく





330 名前:デフォルトの名無しさん mailto:sage [2012/02/20(月) 23:44:17.04 ]
つづき
5.夜勤
 夜勤ではペアを組ませられない組み合わせがある。
 夜勤は基本連続しないように(夜勤、明け、休み、夜勤…可能な限りにならないよう…)
 前の月の夜勤の明け、明け休みも考慮する

6.明け
 夜勤の翌日は自動的に入る。

7.休み
 正職、嘱託の休みは基本月10回。
 月により前後することがある。(1年間の回数は決まっており、兼ね合いで調整。)
 パートは人によって回数が違う。
 パートには休みを全部自分で指定する人もいたり。
 夜勤の翌々日は自動的に入る。

8.研修
 出張による研修。多くても月1回1名程度。

9.有給
 有給休暇。


331 名前:デフォルトの名無しさん mailto:sage [2012/02/21(火) 00:13:58.53 ]
>>278
提案。

当面の目標は入力支援とし、下記の機能を実現。

1.条件に合わないモノを検出する機能
2.一意で決まるモノを自動入力する機能(夜勤→明け→休み)
3.コンボボックスによる候補での入力(条件によってソートする。)

この辺りが出来ればかなり楽になるんじゃね?







[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<296KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef