Excel VBA 質問スレ Part23at TECH
Excel VBA 質問スレ Part23 - 暇つぶし2ch175:デフォルトの名無しさん
12/02/10 22:03:27.91
VBAのコードを使って、ファイルやフォルダを自由自在に操ってみたいと思ってます。

[ファイル]と[フォルダ]のそれぞれ2つについて、
[移動][コピー][削除][名前の変更]の4つはどうコードで記述すればいいか(つまり2x4=8個について)、
どなたか教えていただけませんか?
それが載ってあるサイトのURLでもいいです。

(*[フォルダ]の[削除]は、もしその中にファイルやフォルダがあったらそれも含めて全部削除するとします)

176:デフォルトの名無しさん
12/02/10 22:09:50.59
>>175
VBA力と回答力を試しているんですか

177:デフォルトの名無しさん
12/02/10 22:22:14.32
>>175
んなもん、それぞれぐぐっていけばいいだけの話だろうが

Office TANAKA - トップページ
URLリンク(officetanaka.net)
URLリンク(officetanaka.net)

あたり読めば?

178:デフォルトの名無しさん
12/02/11 07:56:33.53
あなたの検索力を試したんですよ
まあまあですね

179:デフォルトの名無しさん
12/02/11 17:49:13.59
>>178
くやしいのうwwwwwwwwwくやしいのうwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww

180:デフォルトの名無しさん
12/02/11 19:00:02.04
"w" も使い過ぎると逆効果だなあ。

181:デフォルトの名無しさん
12/02/11 22:54:53.04
図形を含んだシートのコピーに関して教えてください。
セル範囲を指定してコピー、別シートに貼り付けをしているのですが、
コピー自体はできるのですが図形の大きさが変わったり、印刷した時の大きさが違ったり
してしまいます。
全く同じにコピーするにはどうすればいいのでしょうか?
シート自体のコピー挿入の方がいいのでしょうか?
よろしくお願いします。

182:デフォルトの名無しさん
12/02/12 00:28:06.43
>>181
図形の生成はマクロでやってる?
そうならコピペせなんでも生成時のアドレス変えてもう一つ作ればいいんじゃ?
もし、マクロで生成したものでない図形を~って話なら
図形のプロパティでセルの移動とかにあわせて大きさを変えないようにすればいけるかと。
ペースト先セルの列の幅やら行の高さやらがコピー元と違うと大きさ修正されちゃうし。

183:デフォルトの名無しさん
12/02/12 03:55:14.43
エスパー(マクロでやってないな)

184:デフォルトの名無しさん
12/02/12 14:52:49.17
こんにつわ、他人から貰ったExcelファイルがどういうコードで動いてるか見るにはどうすればいいのじゃ?

185:デフォルトの名無しさん
12/02/12 14:59:31.37
>>184
Alt+F11

186:デフォルトの名無しさん
12/02/12 15:19:23.68
ありがとうちゃん

187:129
12/02/12 23:35:21.88
>>137
全角文字、たとえば”あ”を&H82 + &HA0に変換する場合は
どうすればよいのでしょうか?
以下のように記述を比較してみましたが一致しませんでした
ご教授おねがいします。

msg = Chr(Asc("あ"))
msg2 = Chr("&H82") + Chr("&HA0")

188:デフォルトの名無しさん
12/02/12 23:40:08.67
>>187
MsgBox Hex(Asc("あ"))


189:デフォルトの名無しさん
12/02/12 23:52:57.06
他Bookに記述してるマクロを実行(あるいはSubやFunctionを呼び出し)することって
できる?
頻繁にやるのは望ましくない?

190:デフォルトの名無しさん
12/02/13 00:22:53.83
>>189
たとえばBook1.xlsmのThisWorkbookにあるsub testを呼び出すなら
Application.Run "Book1.xlsm!ThisWorkbook.test"
でできる
頻繁どころか、アドインでもない限り他ブックのマクロ実行させるのはまったく好ましくない

191:デフォルトの名無しさん
12/02/13 00:23:18.72
マクロでコントロールを状況に応じて増やしたいんだけど
そういうことってできる?

たとえば5と入力したら別Window(Form)を開いて
そこに5つのラベルとテキストボックスを挿入したいの。

192:デフォルトの名無しさん
12/02/13 00:26:32.22
なんでマルチポストすんの?

193:デフォルトの名無しさん
12/02/13 00:57:04.90
>>189
もちろんできる
複数のブックから使用するマクロを別ブックにしたり、
複数のブックのマクロを呼び出すメニュー用のブックを作ったり、
xlsxのファイルで使用するためのマクロを別ブックにしたり、
いろいろ

ExcelVBAの考え方としては、データを置くワークシートと、
プログラムを置く標準モジュールをどう配置するか


194:187
12/02/13 01:11:58.07
>>188
ありがとうございます。

MsgBox Hex(Asc("あ"))  は 82A0と表示されましたが
MsgBox Hex(Asc(Chr(&H82) + Chr(&HA0))) が 8145になってしまいましたが
MsgBox Hex(Asc(Chr(&H82A0)) では 80A0と表示されたのでこちらとは一致させることができました。

全角文字の場合には &H80A0 のような書きかたが正しいのでしょうか?

しかし >>130 のコードで
”あいうえお”を検索したく
msg = Chr(&H82) + Chr(&HA0) + Chr(&H82) + Chr(&HA2) + Chr(&H82) + Chr(&HA4) + Chr(&H82) + Chr(&HA6) + Chr(&H82) + Chr(&HA8)
InStr(Text, msg)
とした場合には検索できるのですが
msg = Chr(&H82A0) + Chr(&H82A2) + Chr(&H82A4) + Chr(&H82A6) + Chr(&H82A8)
InStr(Text, msg)
のような書きかたをした場合には検索できませんでした。

”あいうえお” を検索する場合にはどういう書きかたをすればよいのでしょうか?

195:デフォルトの名無しさん
12/02/13 02:04:05.27
「あいうえお」と書かれたテキストファイルを
>>130のコードに突っ込めば直ぐ解る。

196:187
12/02/13 02:53:20.17
>>195
きさま、舐めとんかゴルァ

197:デフォルトの名無しさん
12/02/13 19:33:16.74
保存ダイアログが出たときに、特定のフォルダーが出るように下記の様に
書いたのですが、Win7 32bitでは希望通りの動きなのですが、64bitだと
マイドキュメントが選択された状態で表示されてしまいます。

xlAPP.GetSaveAsFilename(InitialFileName:=SaveDir & FileName)

64bit版でも指定したフォルダーを選択状態にさせるにはどうすればいいですか?
よろしくお願いします。

198:デフォルトの名無しさん
12/02/13 19:57:03.92
すみません。
コピーし忘れがありました。
一度保存すると、その時のフォルダーを保存しておいて、2回目からは
SaveDirに記憶したフォルダーを選択するようにしています。

SaveaDir = CurDir

そのために上記の様にして記憶するようにしています。
(このスレを読んで参考にしました。)

32bit版は変数の中身が変わるのですが、64bit版ではブックを読みだしたフォルダーから
変更されない感じです。
よろしくお願いします。

199:デフォルトの名無しさん
12/02/13 20:18:43.27
>>198
省略しすぎ。もう少しコードを見せられないの?

200:デフォルトの名無しさん
12/02/13 21:24:43.24
>>197
ディレクトリだけ?
ファイル名は正しく表示されるの?

201:デフォルトの名無しさん
12/02/14 15:30:51.13
VBAについて質問させてください! OS Windows7 2003使ってます。

下記のプログラムでYAHOO競馬からラップタイムって物だけをダウンロードしてきてるんですが、今は
1Rづつしか持って来れてないんで、これを全レース(最大で1日36R)一回の作業でダウンロードしてくる
プログラムに直せませんか?

宜しくお願いいたします!

Sub test()
Dim ie As Object
Dim elements As Object
Dim i As Integer
Cells.Clear
Set ie = CreateObject("InternetExplorer.Application")
ie.Visible = True
ie.Navigate "URLリンク(keiba.yahoo.co.jp)"
Do While ie.Busy Or ie.ReadyState <> 4: DoEvents: Loop
Set elements = ie.Document.getElementsByTagName("div")
For i = 0 To elements.Length - 1
If elements(i).innertext Like "ラップタイム*" Then
Set elements = elements(i).getElementsByTagName("td")
Exit For
End If
Next
For i = 0 To elements.Length - 1
Range("B" & i + 1).Value = elements(i).innertext
Next
ie.Quit
Set ie = Nothing
End Sub



202:デフォルトの名無しさん
12/02/14 17:43:32.49
>>197
& "\" &

203:デフォルトの名無しさん
12/02/14 21:01:01.46
>>197
32ビット版なので確認できないが、
64ビット版だとSaveDirに関係なくいつもマイドキュメントが開くってことか

Sub test()
Const FileName = "test.xlsx"
Const SaveDir = "C:\"
Dim fname

MsgBox CurDir
fname = Application.GetSaveAsFilename(InitialFileName:=SaveDir & FileName)
MsgBox CurDir

End Sub

204:197
12/02/14 22:05:33.85
皆さん、レスありがとうございます。
どうも、CurDirの返り値が32bit、64bitで違うみたいです。
32bitの時は保存したり、読み出したりした時のフォルダーが返ってくるのですが、
64bitの時は読み出したフォルダーが返ってくるみたいです。

'保存
Save_NAME = xlAPP.GetSaveAsFilename(InitialFileName:=Save_Name)

'保存先フォルダー記憶
File_Name = Dir(Save_NAME)
Save_dir = Replace(Save_NAME, File_Name, "")

こんな感じでできるようになりました。

205:デフォルトの名無しさん
12/02/14 22:07:08.20
× Save_NAME = xlAPP.GetSaveAsFilename(InitialFileName:=Save_Name)
○ Save_NAME = xlAPP.GetSaveAsFilename(InitialFileName:=Save_dir)
です


206:デフォルトの名無しさん
12/02/15 00:10:13.68
>>201
いらん機能までゴテゴテ付けたら改行が多すぎるって怒られちったお

Sub test()
Dim ie As Object, elements As Object
Dim i%, url$, n%, y%, m%, d%, r%
Dim name As Variant
Dim flg As Boolean
Dim j As Variant
name = Array("札幌", "函館", "福島", "新潟", "東京", "中山", "中京", "京都", "阪神", "小倉")
url = "URLリンク(keiba.yahoo.co.jp)"
j = Application.InputBox("開催地、年月日をすべて2桁の数値で入力" & vbCrLf & _
"札幌=01,函館=02,福島=03,新潟=04,東京=05,中山=06,中京=07,京都=08,阪神=09,小倉=10", "下記の順にデータを入力してください", , , , , , Type:=2)
If j = False Then Exit Sub
If Len(j) <> 8 Then Exit Sub
n = Left(j, 2): y = Mid(j, 3, 2): m = Mid(j, 5, 2): d = Mid(j, 7, 2)
With ThisWorkbook.Sheets(1)
.Cells.Clear
.Cells(1, 1) = y & "年" & m & "月 " & name(n - 1) & d & "日目"
For i = 1 To 11
.Cells(1, 1).Offset(i).Value = "^" & i * 200
Next i
Set ie = CreateObject("InternetExplorer.Application")
ie.Visible = True


207:206の続き
12/02/15 00:10:51.20
For r = 1 To 37
flg = False
ie.navigate (url & y & Format(n, "00") & Format(m, "00") & Format(d, "00") & Format(r, "00") & "/")
Do While ie.Busy Or ie.readyState <> 4: DoEvents: Loop
Set elements = ie.document.getElementsByTagName("div")
For i = 0 To elements.Length - 1
If elements(i).innerText Like "ラップタイム*" Then
flg = True
Set elements = elements(i).getElementsByTagName("td")
Exit For
End If
Next i
If Not flg Then
.UsedRange.EntireColumn.AutoFit
Exit For
End If
For i = 0 To elements.Length - 1
.Cells(1, 1).Offset(, r).Value = r & "R"
.Cells(2, 1).Offset(i, r).Value = elements(i).innerText
Next i
Next r
Set elements = Nothing
ie.Quit
Set ie = Nothing
End With
End Sub


208:206
12/02/15 00:15:06.33
個人的には
ie.visible=true
はFalseのほうが画面の切り替えがなくて好きだけど、
非表示にしとくとIEのアクセスでエラーが出てるときの
エラーメッセージも表示されなくなるんだっけ?

209:206
12/02/15 00:19:14.69
連投スマソ
入力する年月日のうち、日は日付じゃなくて開催何日目かなので
そこんとこよろしく
(たとえば、06120105は中山競馬場、2012年1月の開催5日目の意味)

210:デフォルトの名無しさん
12/02/15 00:31:34.64
それだと一つの競馬場で36レースやらないと全レースのデータは拾えないんじゃね?
多分、一つの競馬場では1日に12レースしかやらないと思うよ。
同じ日に最大で3カ所開催するから3*12で36レースってことじゃないかな?

211:206
12/02/15 00:54:42.24
>>210さん
えーと、
ご指摘ありがとうございます・・・orz
私は競馬やったことないんで知りませんでした。

そうすると、開催地の変更もループ処理に掛けないといけないですね。

でも、ちょっと調べたところ、
URLリンク(keiba.yahoo.co.jp)
ここを見たら同じ日でも場所によって開催何日目かがまちまちなので、
単純に場所だけを変えても上手くいかなそうです。
(データを取り込むURLが
[年][場所][月][開催何日目][何レース]の組み合わせですので、
日付から開催日を知る方法がないとすべてのデータが取り込めません。)
同じ日に開催する場所や日数に何か規則性があるなら良いのですが、
私は競馬のことをよく知らないので見当も付きません。
力不足で申し訳ないです。


212:デフォルトの名無しさん
12/02/15 02:52:59.70
皆さんホントこんな初心者の為に考えてくださってありがとうございます!

何か別な方法考えてみます!

213:デフォルトの名無しさん
12/02/15 03:05:01.57
>>212
丸投げじゃなく自力でがんばってみる気があるなら

URLリンク(keiba.yahoo.co.jp)
↑のページからURL情報を取得すればできると思うぞ

開催年と開催月 は↑のURL にあるし
開催日はページ内にあるから対象日の 開催名のリンク先URLを取得して
レースNoを付加してやればいいと思う

214:デフォルトの名無しさん
12/02/15 04:15:47.11
ありがとうございます!

なんとか頑張ってみます!!

215:デフォルトの名無しさん
12/02/15 11:53:49.85
ユーザーフォームに複数の項目(名前、年齢、身長、体重など)を設定して、
空欄があった場合に「名前を入力して下さい」とかメッセージボックスで表示するようにしたいんです。

それでもし、複数の項目が空欄なら「名前を入力して下さい」「年齢を入力して下さい」と
1つのメッセージボックス内に表示されるようにしたいのです。

順列組み合わせをIFしていったらすごいことになるので短くプログラムする方法はないかなと思いまして。
IFのネストとかstrを使ってとか断片的には思い浮かぶんですけど……

216:デフォルトの名無しさん
12/02/15 12:31:51.42
質問させてください。

シートにフォームのボタンを貼ったのですが、このボタンをVBAから押した
ことにする方法はあるでしょうか。


217:デフォルトの名無しさん
12/02/15 14:01:56.17
>>215
何項目あるかしらんが、一つずつ検査して文字列にまとめるのが結局いちばんはやくて保守しやすいんじゃね?
Private Sub CommandButton1_Click()
Dim str As String

If TextBox1 = Empty Then
str = "TextBox1が空白です" & vbCrLf
End If
If TextBox2 = Empty Then
str = str & "TextBox2が空白です" & vbCrLf
End If
If TextBox3 = Empty Then
str = str & "TextBox3が空白です" & vbCrLf
End If
If TextBox4 = Empty Then
str = str & "TextBox4が空白です" & vbCrLf
End If
If TextBox5 = Empty Then
str = str & "TextBox5が空白です" & vbCrLf
End If
MsgBox str
End Sub


218:デフォルトの名無しさん
12/02/15 14:20:34.57
>>217
なりました!
ありがとうございますm(_ _)m

219:デフォルトの名無しさん
12/02/15 17:36:33.04
>>216
そのボタンを押した時に実行するプロシジャを実行すれば良いだけなのでは?


220:デフォルトの名無しさん
12/02/16 01:25:02.28
横から失礼。
> そのボタンを押した時に実行するプロシジャを実行
でなく、そのボタンを押す事は出来ないの?

221:デフォルトの名無しさん
12/02/16 01:40:57.51
命令文うんたらかんたら

CommandButton1_Click

命令文うんたらかんたら

222:デフォルトの名無しさん
12/02/16 03:33:49.75
>>220
メッセージを送ればボタンは押せるけど
プロシージャ実行と結果は同じだから手間がかかるだけで意味がない

他の常駐アプリでボタンクリックのメッセージ監視目的とかだとスレ違い気味だし
そんだけ知識ある人がこんな質問するとは思えない

223:デフォルトの名無しさん
12/02/16 09:20:50.66
>>220
UWSC使え w

224:216
12/02/16 10:15:08.10
みなさんありがとうございます。

>>222
どうやってシートのボタンオブジェクトを取得して、どんなメッセージを送ったらよいのでしょうか。
VC++とかはよく使いますが、ExcelVBAは初めてです。

ユーザーフォーム上のボタンは押したことにできるので、シート上のフォームのボタンも押す方法が
ないか探しております。

よろしくお願いいたします。


225:デフォルトの名無しさん
12/02/16 12:51:14.76
>>224
Sub onButton()
Worksheets("Sheet1").CommandButton1.Value = True
End Sub

Sub onButton()
Worksheets("Sheet1").OLEObjects("CommandButton1").Object.Value = True
End Sub

どちらでもすきなように

226:デフォルトの名無しさん
12/02/16 18:29:17.43
VBA初心者です
Excel2007
A1    ALL1
A600   ALL600
この範囲内に画像を取り込んでモザイク画を作っています。
画像サイズによっては空白部分も多いのですが空白部分を省いて印刷するにはどうすればいいでしょうか?
プリンターの関係上A1サイズなので後で組み合わせるのにヘッダーでページ番号もつけています


227:デフォルトの名無しさん
12/02/16 19:00:52.59
>>226
印刷した時にどこで切れるかはHPageBreaks(n).Location
またはVPageBreaks(n).Locationで調べることができる

あとは、ページごとにセルの色が全部標準か白なら印刷しないっていう
ちょっと面倒なプログラムを書くしかない

228:デフォルトの名無しさん
12/02/16 20:50:50.26
>>225
それってフォームのボタンでないんじゃない

229:デフォルトの名無しさん
12/02/16 22:53:25.40
教えてください
VBAにアドインってのが有るそうなんですが、マクロをアドインとかいうものにするのはどういうメリットがあるんですか?
皆さん、どういう風につかっておられます?

230:216
12/02/16 23:29:29.26
>>225
ありがとうございます!
コントロールツールボックスのボタンの場合は、どのようにしたらよいでしょうか。

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

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

233:デフォルトの名無しさん
12/02/17 17:43:41.83
>>232
229です。

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

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

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

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

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

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

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

235:デフォルトの名無しさん
12/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:デフォルトの名無しさん
12/02/17 19:53:43.47
>>235
VBAでではなく、ワークシート関数でってなら

Excel総合相談所 100
スレリンク(bsoft板)l50


237:デフォルトの名無しさん
12/02/17 20:33:56.12
なにそのタライ回し。いつもより多く回ってるんじゃないの。

238:デフォルトの名無しさん
12/02/17 20:43:07.85
このスレはいつもこうだよ


239:デフォルトの名無しさん
12/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:デフォルトの名無しさん
12/02/18 01:26:54.85
修正です
誤 With Range("A2").Interior

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


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

日本語は大切にね

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

243:デフォルトの名無しさん
12/02/18 01:42:17.46
>>239
コマンドボタンはどのセルに配置してあるの?
D列のセル?

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

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

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

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


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

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

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

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

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

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


246:デフォルトの名無しさん
12/02/18 02:15:02.93
>>244
答えてあげたいが、時間がない

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

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

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

247:デフォルトの名無しさん
12/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
12/02/18 03:13:52.81
一応簡単に説明しておくと
ボタンクリックのイベント内からは Application.Caller でクリックしたボタン名が取得できる
ボタン名をあらかじめ chkbtn_<行番号> として作成しておき、イベント内で行番号をボタン名から切り出して現在の自分の行番号を取得している
イベント内でボタン名が取得できるので、クリックのイベントプロシジャを個別に作成する必要はなく、すべて共通でよい

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

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

250:239
12/02/18 03:26:41.00
>>247
書き込み中のすれ違いになってしまいました。
ありがとうございます!!
もう一度試してみます。 

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

252:54
12/02/18 03:52:25.06
>>241
別に間違ってないよ。

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

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


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

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

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

256:253
12/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:デフォルトの名無しさん
12/02/18 13:19:54.76
すみません>>247のコードでボタンを二つ作りたいのですが、
標準モジュールを新たに挿入すると内容が二つとも同じになってしまいます。
対処法を調べても理解できないのでどなたか教えてください。

258:デフォルトの名無しさん
12/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
12/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
12/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
12/02/18 13:51:56.14
って俺が長々説教かいてる間に
>>258さんがコード作ってくれちゃったね。
>>257良かったな。

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

262:デフォルトの名無しさん
12/02/18 14:07:08.52
>>258
一部修正必要だけど、257には無理かもね

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


264:253
12/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:デフォルトの名無しさん
12/02/18 14:47:53.44
>>264
いやオブジェクト名は、どのみち影響しないけど
修正したいと言うと予想されるのはキャプションのほうね

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

267:デフォルトの名無しさん
12/02/18 17:29:55.96
事故解決下

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


269:デフォルトの名無しさん
12/02/18 23:20:54.49
Replace(s, "平成1年", "平成元年")


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

271:デフォルトの名無しさん
12/02/19 00:20:14.51
[^0-9]1年

272:268
12/02/19 00:58:11.82
>>269
でかした!

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

273:デフォルトの名無しさん
12/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:デフォルトの名無しさん
12/02/19 06:24:27.04
>>272
>>269では誤動作するケースがある、というのは分かる?
経験があれば、真っ先に>>270-271のようなことが浮かぶもんだよ。

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

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

276:デフォルトの名無しさん
12/02/19 07:14:45.79
元号使わなきゃ無問題

277:デフォルトの名無しさん
12/02/19 07:17:24.42
>>275
VBAスレでセルの表示形式の回答?

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

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

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

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



281:デフォルトの名無しさん
12/02/19 11:21:42.39
>>279
Exit Do

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

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


284:279
12/02/19 11:38:53.91
>>283
できました。
ありがとうございました。


285:デフォルトの名無しさん
12/02/19 16:29:31.34
Do~LOOP使うならWhile使えよ

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

287:デフォルトの名無しさん
12/02/19 18:45:33.02
>>286
> 平成が何年までか求める

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

288:デフォルトの名無しさん
12/02/19 19:17:04.08
今年で,,,, ゲフンゲン

289:278
12/02/19 19:36:06.20
>>280
ありがとうございます、コツコツやってすぐ分からなくなってまた来ます
その時は教えて頂けたらありがたいです

290:デフォルトの名無しさん
12/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:デフォルトの名無しさん
12/02/19 20:16:12.70
堂々とマルチ宣言

時代変わった? w

292:デフォルトの名無しさん
12/02/19 22:47:40.35
こんにつわ、質問です。

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

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

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

294:デフォルトの名無しさん
12/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:デフォルトの名無しさん
12/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
12/02/20 00:25:03.13
>>293
ホントですか!?
ありがとうございます
色々ググって見て、とりあえずデザインから作り始めてます
自分が使うだけなので特に問題ないです
複雑だから結構難しそうですね・・・

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


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

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

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

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

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

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

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

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

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

301:294
12/02/20 08:01:46.57
>>295
ありがとうございます
やっぱり独学じゃダメなのかな・・・
もっと勉強します

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

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

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

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



305:デフォルトの名無しさん
12/02/20 13:05:17.31
>>303
あんまりおどすなよ。

306:デフォルトの名無しさん
12/02/20 13:41:17.42
>>302
落ち着け。

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

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

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



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

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

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

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

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

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

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

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

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

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

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

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

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


313:278
12/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:デフォルトの名無しさん
12/02/20 21:46:17.55
連続したセルに値を書き込むのに簡単な方法は無いでしょうか?
セルに値を書き込むと、自動的に隣のセルにフォーカスが移動するみたいな

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


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

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

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


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

319:314
12/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
12/02/20 22:29:35.78
説明難しいですね…
早番=1番と考えていただければいいです
平日7番までというのは日勤者(2番~7番の6人)です
今現在は正職が13人、嘱託が1人、パート2人、(関係ないけどお掃除さん1人)
ただ3月で正職と嘱託が1人ずつやめます

パスは vba です
これは勤務表
URLリンク(www.dotup.org)
勤務表の一番右になります
URLリンク(www.dotup.org)
これが当番表になります。
実際作りたいのはこっちで考えています
URLリンク(www.dotup.org)

321:デフォルトの名無しさん
12/02/20 22:29:39.19
そんなもん必要になる状況がよくわからん。

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

323:デフォルトの名無しさん
12/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:デフォルトの名無しさん
12/02/20 22:45:15.43
>>321
帳票付けるときに重宝する
TABキー使わずにテンキーとエンターだけで表の端まで行ったら先頭列の1行下に移動できるし

325:278
12/02/20 22:49:31.98
>>322
夜勤は(夜勤、明け、休み)で1セットは確実です
明けが無いとかはないです

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

326:デフォルトの名無しさん
12/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:デフォルトの名無しさん
12/02/20 23:03:49.82
つづき

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

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

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

8.研修
 - 未稿 -

9.有給
 有給休暇。

-以上-

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

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

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

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

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

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

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

9.有給
 有給休暇。


331:デフォルトの名無しさん
12/02/21 00:13:58.53
>>278
提案。

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

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

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


332:278
12/02/21 00:26:44.73
>>329
まとめなおしていただいてありがとうございます
改めてまとめると自分でも分かりやすいですね

>>331
それくらいのほうがいいのでしょうか
やっぱり自動で作成はかなり困難ですかね…

333:331
12/02/21 00:45:10.26
>>332
順番の問題だよ。
自動生成を作っても調整は必要になるんだろ?

まずは調整と入力を支援する機能を作る。
  ↓
休みの事前入力とかを作る。入力部分に連動させる。
  ↓
手動部分を少しづつ自動化。

こうすれば、途中段階のものでも活用できる。

最初から大風呂敷やると時間が無くなる一方で何も出来上がらないと思う。



334:デフォルトの名無しさん
12/02/21 00:53:59.72
>>332
331ではないけど、
自動化は総当たりとかで頑張れば不可能ではないと思うけど融通がきかないと思う
ある人が骨折して2週間以上抜けてしまうとか
この二人組は両方新人なのでばらばらにしたいとか
都合で休みを振り返る人が結構いるとか
そういう例外までも自動化で対応するのはかなり困難
その点入力支援はそういった例外にも強い

自動化しても融通がきかないとまったく使えないシステムになりかねない
最初に入力支援を作って様子をみて、いけそうなら最初のシフト表を自動作成することを考えればいい

335:デフォルトの名無しさん
12/02/21 03:00:13.24
人員マスターテーブル作って、各人可能なシフトパターンを網羅
表に希望の休みを入力して空いてるセルに人員マスターテーブルからランダムで勤務パターン取得
そしてアナログで手直しするのが一番早いんじゃね?

入力支援に関してはchangeイベントとVlookup使えばテンキーだけで行ける。

336:デフォルトの名無しさん
12/02/21 04:06:23.05
そろそろ別の所でやってくれないかな

337:デフォルトの名無しさん
12/02/21 07:17:54.61
>>278
当番表の構造が分からないので説明お願いします

338:278
12/02/21 07:22:49.41
なるほど、それなら入力支援も使えるしいいですね
とりあえずはそちらから取り掛かろうと思います

>>336
すみません;こう長くお話しちゃお邪魔でしたね…

>>337
当番表の構造・・?


339:デフォルトの名無しさん
12/02/21 07:33:18.93
>>338
わかりました
当番表は勤務表の縦横を入れ替えて
番号順に並べ替えたものなのですね

340:デフォルトの名無しさん
12/02/21 10:43:55.13
いつまでVBAと関係無い話してんだよ

341:デフォルトの名無しさん
12/02/21 14:07:24.52
Excel2002を使っています。
あるテキストファイルの最終行から4行目(4行目だけ)の値を取りたいと考えております。

最終行取得はヤフー知恵袋にありましたのでこれを使おうと思います。
Do While Not EOF(1)
Input #1, MyString
cnt = cnt + 1 ’cnt=行数
Loop

Line Input では何行目とか言う指定はできないようで
どのように指定行を取るかが分かりません。
ググッたら「Line Input で空読み」という事までは分かりましたが
空読みの意味が分かりません・・・

ここから指定行を取得するにはどのようにすればいいのでしょうか?

342:デフォルトの名無しさん
12/02/21 14:34:53.26
行番号を指定して読むことは出来ない。

処理時間をあまり気にしないなら、配列
MyString(3) as string
を作って、ファイルの先頭から行を読むたびに0->1->2->3->0->1->...と保存していけば、
最も古いデータが最終行から4行目。

dim index as long
index = 0

Do While Not EOF(1)
Input #1, MyString(index)
index = index + 1
if index = 4 then
index = 0
end if
Loop

343:デフォルトの名無しさん
12/02/21 14:58:15.15
278さんではありませんが
勤務表の別スレを立てましたのでどうぞ

ExcelVBAで勤務表を作ろう
スレリンク(tech板)


344:デフォルトの名無しさん
12/02/21 15:08:17.97
>>342
ありがとうございます。
配列に入れるとは全く思いつきませんでした。
目から鱗が落ちる回答勉強になりました。
希望通りの結果が得られました。
ありがとうございました。

345:278
12/02/21 19:21:52.87
>>343
本当にありがとうございます
本来自分がやるべきことなのに・・・
これからはそちらに書き込むようにいたします

346:デフォルトの名無しさん
12/02/21 19:34:06.17
すいません、VBAでスレタイ検索したらここに流れ着いたのですが、初心者用の質問スレってありますか?

表内で、ある列の書かれている文字ごとにその行の背景色を変えていくと言うマクロを
VBEでモジュールに書きたいのですが、イマイチイメージが浮かばなくどうしていいかわからない状況です

足の骨折で入院してて勉強が遅れてしまったので急いで追いつきたいのですが、
おそらく簡単であろうこんな問題もわからなくなってきた次第です・・・

変数を使用して、繰り返しの処理をし、RangeとCellsを使って解けと言われたのですが???と言う状況です

そこで初心者用のスレがあったら誘導願います
スレ違いでスイマセン

347:デフォルトの名無しさん
12/02/21 19:45:46.58
>>346
スレはここでも良いと思うけど、Cellsを使ってループ処理をする、その方法は知ってるの?
For i = 1 to 100
If Cells(i,1)= "xxxx" Then
Cells(i,1)= ~
End If
Next
みたいなさ

348:デフォルトの名無しさん
12/02/21 19:48:13.75
>>344
もう解決してるので今更感が強いけど、
テキストファイルをエクセルで開いて下から4行目を取得する、
というやり方もできるよ
Test.txtを開くと仮定したらこんな感じ

Sub test()
Dim WB As Workbook
Dim I&
Dim Txt$
Set WB = Workbooks.Open("test.txt")
With WB.Sheets(1)
I = .Cells(.Rows.Count, 1).End(xlUp).Row
If I > 3 Then
I = I - 3
Else
I = 1
End If
Txt = .Cells(I, 1).Value
WB.Close
MsgBox Txt
End With
End Sub



349:デフォルトの名無しさん
12/02/21 20:07:58.96
>>347
文字は何パターンあるのかな。
パターン数分の背景色が必要になるけど、何色でも良いの。

350:デフォルトの名無しさん
12/02/21 20:09:31.70
↑間違えた。>>346宛ね。

351:デフォルトの名無しさん
12/02/21 21:03:18.61
>>346
このあたりを調べて使えるようになればできるよ。
最終行取得
繰り返し(for each~next)
colorindex
entirerow
dictionary


352:346
12/02/21 21:26:45.65
>>347
For~Nextは勉強しましたので、その文はナントカわかります

>>349-350
大元が2種類あって、更にその片方が何種類か条件があるような感じです
ですので、背景色は6~7色前後になりますが、色については指定がありましたので、
ColorIndexの後にその数字を入れていけば対応できます

>>351
残念ながらまだ基礎の方なのでColorIndex以外は習ってないですね・・・

今習ってる構文?といえば
思い出せるのは、If~Then~Else、For~Next、Do~Loop位ですね


347さんのでなんとなくなイメージは浮かびました



答えてくださった方々、ありがとうございました
とりあえずはもうちょっとネットで調べてみます

353:デフォルトの名無しさん
12/02/21 22:01:14.63
OS:XP SP3
Excel:2003 SP3
---
(略)
graph_name = ActiveChart.Name
graph_index = ActiveChart.Index
(略)
ActiveSheet.ChartObjects(graph_index).Activate 'エラーが発生する
(略)
---
例えば、graph_nameがGraph 3だったら、
ActiveSheet.ChartObjects("グラフ 3").Activate
とする事で、エラーが発生しなくなります。

解決策をご存知の方はぜひご教授願います。

354:デフォルトの名無しさん
12/02/21 22:25:34.74
>>353
graph_index =ActiveChart.Parent.Index

355:デフォルトの名無しさん
12/02/22 10:41:53.09
>>215なんですが、>>217さんのやり方で成功したかと思ったんですが、
欄が全部埋まってる場合にも空白のメッセージボックスが出てきてしまうんですよね。。。

全て記入されている場合はメッセージボックスを出さない処理にするにはどうすれば良いのでしょうか?

356:デフォルトの名無しさん
12/02/22 11:48:31.30
>>355
最後のmsgboxのところを
ifでよける。


357:デフォルトの名無しさん
12/02/22 15:04:52.84
>>354
サンクス!

358:デフォルトの名無しさん
12/02/22 21:09:05.40
>>355
if len(str)>0 then msgbox str

359:デフォルトの名無しさん
12/02/22 21:10:42.95
then
end if

{
}
で書くのに慣れると、BASICはどうも読みにくくて仕方ない。。
まあ慣れの問題なんだけどさ

360:デフォルトの名無しさん
12/02/22 22:51:46.44
おう、お前ら
初心者で悪いけど質問な

ユーザーフォームっての作ったんだけど
そこに入力された値ってのはどうやって得るんだ?

初心者なんだから丁寧に教えろよ

361:デフォルトの名無しさん
12/02/22 23:08:36.01
つまんない

362:デフォルトの名無しさん
12/02/22 23:34:39.45
ユーザーフォームの値を得たり、値を入れたりは
Applicationオブジェクトから辿ると何となく分かるけど、
Msgboxのボタンを押すとか謎。

363:デフォルトの名無しさん
12/02/22 23:44:29.66
>>360
オブジェクト名.Valueでよろし。。。。。

364:デフォルトの名無しさん
12/02/23 00:03:42.57
>>363
なんだ、簡単だったな
あんがとよ!

365:デフォルトの名無しさん
12/02/23 01:18:57.32
便乗するわけじゃないけどユーザーフォームについての質問です。

ユーザーフォームの右上の×をクリックしたときって
どういう動作をしているのでしょうか?

×でフォームを閉じたことを標準モジュールのプロシージャ
(そのユーザーフォームをShowしたプロシージャ)から知る方法ってありますか?

現在はPublicで宣言したBoolean変数とフォーム上のコマンドボタンを用いて
コマンドボタンをクリックしたら変数をTrueにしてからHideするようにしてます。
(×で閉じたらFalseだからそれで判断してます)
パブリック変数を使わないで×で閉じたことを知る方法があったら教えてください。


366:デフォルトの名無しさん
12/02/23 02:37:52.92
>>365
標準で用意されているイベントハンドラでは知ることはできない
プロセスの終了方法を区別するには、×ボタンのクリックイベントをフックするぐらいしかないんじゃない?
ただしアプリケーションの作法としては終了方法を区別するような設計にするのはあまり良くないと思うけど

367:デフォルトの名無しさん
12/02/23 02:48:44.80
>>365
ユーザフォーム内だと
UserForm_QueryClose
で処理できるんだけど
いっそのこと Xで終了出来なくしたら? だめかな?やっぱ

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
 If CloseMode = 0 Then Cancel = 1
End Sub

368:365
12/02/23 03:32:51.89
>>366
無理なのですか、残念です。
終了方法を知りたいというか、
ユーザーフォームと標準モジュール間でパブリック変数を介さないで
情報のやり取りがしたかったのです。
標準モジュール同士ならローカル変数でも引数で受け渡し可能ですけど、
ユーザーフォームには引数渡せませんよね?
標準モジュール側からLoadだけしておいて
フォームのオブジェクトに値を入れてShow
とか、
フォーム側からHideして標準モジュールに戻ってから
オブジェクトの値を取得とかは出来ますけど、
Hideしたときにどういう風にHideしたかの情報を
パブリック変数を使わずに取得できないかな?
ということが知りたかったのです。
(ぶっちゃけていうと「実行」と「キャンセル」の判別に使いたいのです。)
パブリック変数の使用以外に
フォーム上に不可視のオブジェクト(チェックボックスなど)を作っておいて
それをフラグに使うっていう手もありますが、
なんかスマートじゃないな、という気がしまして。

>>367
上に述べたとおり、×をキャンセルボタン扱いで使いたかったわけです。
残念ながら私の思うような方向では出来ないっぽいですけど。

ともあれ、お二方にお答えをいただけてとてもうれしかったです。
どうもありがとうございました。



369:365
12/02/23 03:49:06.68
一応、私の知っている範囲でフォームから標準モジュールへ
何らかの値を渡す方法っていうのは以下の3種類しかないです。

1.パブリック変数の使用
2.フォーム上のオブジェクトの値をHide後に取得する
3.フォーム内のプロシージャからワークシートのセルや
外部のテキストファイルなどに書き出しておく

これ以外に何か方法をご存知の方、教えていただけたら幸いです。

370:デフォルトの名無しさん
12/02/23 04:20:30.93
>>369
普通標準モジュール側に通知用の関数用意しとかない?
ボタン押したときに呼んでやるの

371:デフォルトの名無しさん
12/02/23 04:41:55.92
>フォーム上に不可視のオブジェクト(チェックボックスなど)を作っておいて
>それをフラグに使うっていう手もありますが

>フォーム上のオブジェクトの値をHide後に取得する

オブジェクト=コントロールだと思ってる?
普通は、フォームにパブリックな変数定義するんじゃないかな
まあ、パブリック変数を介してるのには違いないけど


372:365
12/02/23 05:58:09.38
>>370

すごい!おっしゃるとおり出来ました。
今までフォームモジュールの中から標準モジュールのプロシージャをCallしたことがなかった
(引数も渡せないから、そんなことが出来ると思ってなくて試してもいなかった)ので、
やってみて目から鱗です。
これからはこの手でいきます。
ご指導どうもありがとうございました。
こんな感じで試しました。

[Module1]
Sub Test
Userform1.show
End Sub
Sub BtnClick
Stop '<=ここで止まった(つまりここにキャンセルの処理を書いておけばOK)
End Sub

[UserForm1]
Private Sub CommandButton1_Click
Call BtnClick
End Sub


>>371
どうもありがとうございます。
370さんにバッチリなお答えを教えていただいたので今後はそちらを使うことにします。

一応、オブジェクト=コントロールというか、
フォーム内のコントロールはオブジェクト(に含まれる)という程度の認識です。
コントロール以外で、フォーム内にオブジェクトがあるのかどうかは分かってないです。


373:デフォルトの名無しさん
12/02/23 12:29:19.07
派遣のお姉さんが毎日6時間かけて色んなCSVファイルから必要なデータを取り出して集計してExcelに整形する処理、
私がVBAで2時間位で完全自動化した時は泣いて喜ばれたし、作業無くなったお姉さんはキャビネの掃除とかして
時間潰そうとしてたけど2ヶ月後退職迫られた、プログラママジ害悪

374:デフォルトの名無しさん
12/02/23 12:44:53.20
人力でも6時間足らずで終わる仕事を2時間程度にしか短縮できないオマエさんがヘボなのか、
VBAでも2時間かかる作業を6時間で終わらせてしまう派遣のオネエさんが凄いのか、
どっちだかよくわからん話だな。

375:デフォルトの名無しさん
12/02/23 13:11:20.53
どう読んだらそうなるんだ
コーディングが2時間だろ

376:デフォルトの名無しさん
12/02/23 13:19:41.89
は?
仕様のヒアリング1時間、コーディング30分、テスト30分だろ

377:デフォルトの名無しさん
12/02/23 13:33:33.99
どう読んだらも何も本来の文脈からいったら
おネエさんの作業時間と対比するには
VBAのほうも処理に必要な時間を書くべきだろ。
もちろん、いくらなんでも人力の3倍前後にしか短縮できないってのは
ちょっとあり得ない話だから
コーディングにかかった時間なのだろうと推測はできるが
はっきりと明記されていない以上、
日本語としては前述のような解釈も十分可能だぞ。


378:デフォルトの名無しさん
12/02/23 13:42:16.29
> 私がVBAで2時間位で完全自動化した

これを、作業時間2時間で完全自動化したと読めないのは、日本人じゃ無いか、IQ70以下くらいだと思うぞ。
日本人だしIQも高いというなら、それは単なる誤読、勘違いなんだから騒ぐな。

379:デフォルトの名無しさん
12/02/23 13:45:59.83
どうでもいい事ではスレのびるのな

380:デフォルトの名無しさん
12/02/23 13:56:32.22
日本語っていうのは語順の入れ替えや語句の省略によるあいまい表現に寛容で
柔軟な構造の言語だから省略された部分に何を補完するかでどうにでも取れるよ。
>私がVBAで2時間ぐらいで(作業が終わるように)完全自動化した。
という読み方だって、
その前段で述べられている人力での作業時間と対比をなすことから考えたら自然な解釈なんだよ。

っていうことがわからないなら
それこそ日本語を勉強し直した方が良いと思う


381:デフォルトの名無しさん
12/02/23 14:12:50.78
>>380
余分な単語をそぎ落とすと「私が二時間位で自動化した」になるが、これでもまだ六時間かかる処理を
二時間位で終わらせるような自動化をしたと読むのか?
ちょっと、日本人とは思えない解釈だわ

382:デフォルトの名無しさん
12/02/23 14:28:14.55
>>377
>VBAのほうも処理に必要な時間を書くべきだろ。
はぁ?
お前のべき論なんか聞きたくもないよ。

383:デフォルトの名無しさん
12/02/23 14:32:11.51
完全自動化されるなら、別に実行に二時間かかってもいいと思うが。
(と、話を変な方向に広げてみる)

384:デフォルトの名無しさん
12/02/23 14:48:20.87
すでに述べている通り省略の仕方でどうにでもなる話だよ。
自説に都合の良い省略の仕方をされても困る。
作業時間云々のものからそういう省略の仕方ができないってことと、
元の文章がどういう省略の仕方をした結果なのかは別次元の話だからね。

で、俺は単なるべき論で言ってるわけじゃない。
前後の文脈を合わせるという方向で考えたらそうなると言ってるだけで
そうでない解釈が間違いだとは言ってない。
むしろその論理を否定されているからそうでない解釈もありだと言ってるだけ、
先に持論を押し付けたのはどちらか、冷静に判断してほしいし、
そういう論法なら日本語能力云々とかIQ がどうとかも一個人の見解にすぎない話で
だれも聞きたいと思ってないのは御同様。

385:デフォルトの名無しさん
12/02/23 15:02:01.04
よっぽど悔しいんだろうなぁ

386:デフォルトの名無しさん
12/02/23 15:07:15.34
> すでに述べている通り省略の仕方でどうにでもなる話だよ。

そもそも省略なんかしてないし。
100人読んだら、お前以外の99人は作業時間が、と取るわ。

387:デフォルトの名無しさん
12/02/23 15:16:34.11
僕の解釈論はそろそろ終わりにしてもらえませんかね。

388:デフォルトの名無しさん
12/02/23 15:51:44.33
>>386
あくまで個人の感想です

389:デフォルトの名無しさん
12/02/23 16:25:51.95
こんな普通の文章でも、個人の解釈でどうとでもなるとか言う奴が書いた仕様書見たいわ

390:デフォルトの名無しさん
12/02/23 16:30:12.44
自分の読解力のなさをわざわざ指摘してくれる人がいたというのに
逆ギレする馬鹿

391:デフォルトの名無しさん
12/02/23 16:42:03.30
往生際悪すぎ

392:デフォルトの名無しさん
12/02/23 18:27:11.41
>>384
オマエさん、ちょっとズレてるよ

393:デフォルトの名無しさん
12/02/23 19:02:53.08
傍目で見てたら論拠に基づいて発言してる人と
言葉の勢いだけで無根拠に強気なこと言ってる人の議論なんだが、
無根拠の方はそれに気づいてないってのが哀しいな。

394:デフォルトの名無しさん
12/02/23 19:15:35.72
スレが伸びてると思ってみてみたら何だこいつら
いつぞやのDB馬鹿がまた暴れてんのか?

395:デフォルトの名無しさん
12/02/23 19:52:44.07
どう解釈するのが普通か、なんて、多人数の意見を集約してみないとはっきりしない

ま、俺の主観ならあの文章なら作業時間2時間だな。俺があの文章かいて
実行時間が2時間だととられたなら書き方がわるかったと反省する

396:デフォルトの名無しさん
12/02/23 20:18:52.53
ここは質問スレ。
>>373も、難癖をつけようとして失敗した>>374も、どっちもスレチ。


397:デフォルトの名無しさん
12/02/23 20:34:13.57
スイマセン、助けてください
職業訓練学校に通ってるんだけど、諸事情で1週間ほど休んで一昨日からまた通い始めたんです、
その間に溜まったプリントを消化してて最後の一枚で訳わかんなくなってしまったんです

For~Nextのネストってのはなんとなく解ったんだけど、どう組み立てていけばいいのかわからなくなって先に進めなくなりました。

URLリンク(imepic.jp)

これなんですが、VBAに慣れた人には簡単すぎるかもしれませんがどなたか助けて下さい

398:デフォルトの名無しさん
12/02/23 20:59:33.99
>>397
Sub TEST()
Dim i as 整数, j as 整数, k as 整数
For i = 1 to ワークシート数
For j = 6 To 12
For k = 2 To 8
With Cells(j, k)
If .valueが5000以上 Then
.フォント.色=青
ElseIf .valueが2000未満 Then
.フォント.色=赤
End If
End With
Next k
Next j
Next i
End sub

399:デフォルトの名無しさん
12/02/23 21:07:02.90
>>398
訂正
With worksheets(i).Cells(j, k)

400:デフォルトの名無しさん
12/02/23 21:12:10.07
>>398-399
ありがとうございます!
そうか・・・Nextの終了順番が間違ってたのもあったのか
これでナントカ追いつけそうです

401:デフォルトの名無しさん
12/02/23 21:57:48.70
今、訓練所でvba教えでるのか。田舎だと、使う場面が少ないが


402:デフォルトの名無しさん
12/02/23 23:01:09.21
XP-2002環境です。

シートAに、2行ペア組のデータで、5万行まで埋まっています。

Dim strData(15) As String  に2行のセルの値を配列に放り込んで、
シートBにパコパコ張り付けるのを全行ループしています。

だけど、必ずシートAのある行数のところで、オーバーフローとなって止まります。
別にその行のデータの型などが、特におかしいわけでは無いです。
(成功したデータをその行に貼り付けてもオーバーフロー)

もしかして、VBAで処理する行数の上限等の何か制約があるのでしょうか?
上限があるなら何か他の対策はあるのでしょうか。
それとも何か他の原因が考えられるのでしょうか?

よろしくお願いします。

403:デフォルトの名無しさん
12/02/23 23:07:53.13
>>402
IntegerをLongにしてみたらどうでしょうか

404:デフォルトの名無しさん
12/02/23 23:19:15.10
>>402
VBAじゃなくてExcel自体の行数の上限が65535行だけどそれは理解してるの?
Excel2007で100万行に拡張されたけど

405:デフォルトの名無しさん
12/02/23 23:25:17.48
>>404
5万行ってことだから問題ないんじゃないの?

406:デフォルトの名無しさん
12/02/24 00:06:59.57
>>402
5万行×8列を2万5千行×16列にしてるのかな?

407:デフォルトの名無しさん
12/02/24 01:04:56.91
Range("A1:A3").Offset(0,2)
ってやったら、
Range("C1:C3")
なオブジェクトが取れると期待してたけど、
Range("C1")
の単一のセルなオブジェクトになった。

そう言うもの?何かへんなのか?
"A1:A3"は、結合してるセルなのだけど、何か関係ある?

408:デフォルトの名無しさん
12/02/24 03:41:06.42
>>407
Offsetは左上の単一セルしか見ない
範囲を広げるにはResize

409:デフォルトの名無しさん
12/02/24 07:09:13.61
>>403
ありがとうございました。intカウンターをLongで解決。
なんで32000行あたりの特定の数字でオーバーフローしちまうのかなぁ

410:デフォルトの名無しさん
12/02/24 07:28:41.30
>>409
それぞれの型には範囲ってもんがある

基本的なことぐらい知ってれやれよ

URLリンク(www.geocities.jp)
変数・定数(基礎編)



411:デフォルトの名無しさん
12/02/24 08:28:36.17
>>407
実際にRange("C1:C3")になるぞ。
そっちのPCは呪われてるのか?

412:デフォルトの名無しさん
12/02/24 19:19:10.59
>>411

>>407

>"A1:A3"は、結合してるセルなのだけど、何か関係ある?

って書いてるけど、うちの環境で試しても
A1:A3が普通のセルならC1:C3を返すけど、
A1:A3を結合してるとC1だけしか返されなかったよ。

413:デフォルトの名無しさん
12/02/26 14:46:56.38
>>412
ちょっと気になっていろいろ試してみた
ヘルプには
>指定された範囲からのオフセットの範囲を表す Range オブジェクトを返します。
とある

ここでの指定された範囲ってのは指定したRangeじゃないし、オフセットの範囲ってのもそのRangeの範囲じゃないってことらしい

問題は、結合セルに対してOffsetをとった場合
指定された範囲=結合セルという一つの範囲
オフセット基準=指定範囲の終了地点(右下)
だとみなされるようだ
A1:A3が一つの結合セルだった場合、Range("A1").OffsetもRange("A2").OffsetもRange("A3").Offsetも同じ動作をする

普通にOffset実装したらそういう動作しそうもないから、
わざわざ結合セルに対するOFFset動作は特別な動作するように実装されてるんじゃないかな

ということで、>>407そう言うものだと思われます

だれかこの動作の公式なドキュメントしってる?

414:デフォルトの名無しさん
12/02/27 00:59:22.80
Excelファイルが読み取り専用の場合、入力できなくする方法

Excelファイルを読み取り専用で開いてるのを忘れて、
いざ保存しようとした時に読み取り専用だった事を思い出すって事ありませんか?
だったらセルのロックみたいに入力自体できなくすればいいじゃないかと
思ってはみたもののどうすればいいかわかりません。
読み取り専用推奨で保存したファイルを開いて
読み取り専用にするか訊いてきた時に"はい"の場合はセルのロック、
"いいえ"の場合はセルのロックを解除というマクロを組んでAuto_Openで動かしてみましたが、
どうも訊いてくるより先にAuto_Openが実行されているようでうまくいきませんでした。
読み取り専用で開くかどうかもマクロで組めれば解決するのかなと思いますが、やり方がわかりません。
どうにかならないでしょうか?

415:デフォルトの名無しさん
12/02/27 01:19:29.12
Workbook_Openイベントプロシージャ

416:デフォルトの名無しさん
12/02/27 07:37:36.89
マクロの記述で質問です。
B列のセルに"日本"を入力すると、
その該当するC列とD列のセルの値や文字列をクリアして斜線を入れたいのです。

例えば
B2へ"日本"を入力すると、C2~D2のセルに入っている値・文字をクリアして
自動的に斜線を入れる、

同じく
B3へ"日本"を入力すると、C3~D3のセルに入っている値・文字をクリアして
自動的に斜線を入れる、

といった感じです。

ここで
B2に対してはそれらの動作が上手くいくのですが
B3やB4以降の行に関しては上手くいきません。

例えばB3へ"日本"を入力するとC3~D3のセル内容はクリアされずC2~D2の値がクリアされてしまいます。
B4やB5以降に関しても同じくC2~D2の値がクリアされてしまいます。

417:デフォルトの名無しさん
12/02/27 07:39:07.10
上の続きです。
一応マクロの文です。
おそらく相対参照の問題だと思います。
調べて試行錯誤しましたが上手いやり方がわかりません。
Excel2003です。
どなたかご教授お願いします。

Private Sub Worksheet_Change(ByVal Target As Range)
Dim r, trg As Range
Set trg = Intersect(Target, Range("B2:B14"))
If Not trg Is Nothing Then
For Each r In trg
If r.Value = "日本" Then
r.Offset(0, 1).Resize(1, 2).Borders(xlDiagonalDown) _
.LineStyle = xlContinuous
Range("C2:D2").ClearContents
Else
r.Offset(0, 1).Resize(1, 2).Borders(xlDiagonalDown) _
.LineStyle = xlNone
End If
Next r
End If
End Sub

418:デフォルトの名無しさん
12/02/27 07:47:41.48
> Range("C2:D2").ClearContents
それはそうだろ、としか。

419:デフォルトの名無しさん
12/02/27 08:01:13.16
Range(Cells(i,j),Cells(i+?,j+?))
でこのi,j,?を操作すれば


420:デフォルトの名無しさん
12/02/27 12:37:05.35
Range("C2:D2").ClearContents を

r.Offset(0, 1).Resize(1, 2).ClearContents
で、いけたわ

こういうのわかりにくいから、
r.offset(0.1).clearcontents
r.offset(0,2).clearcontents

ってやってるわ。

421:デフォルトの名無しさん
12/02/27 16:29:03.11
>>418-420
ありがとうございます。
削除する対象のセルを結合したセルにすると
「結合された一部のセルを~」のエラーが出てダメになりましたが
r.Offset(0, 1).Resize(1, 2) = "" にすると大丈夫でした。
お世話になりました


422:デフォルトの名無しさん
12/02/27 18:00:44.53
range(“a1“).numberformat=“@“
range(“b3“).numberformat=“hh:mm“
if range(“a1“)<>range(“b3“) then
としても差異は検出されないけれど、セルの内容全てを比較したい場合は、全プロパティ分のifを書いてやらんとあきまへんのどすか。

423:デフォルトの名無しさん
12/02/27 18:02:54.64
.text

424:デフォルトの名無しさん
12/02/27 19:26:17.07
range("a1").numberformat="#,##0"
range("b3").numberformat="#,##0;-#,##0"
値は両方とも100

この場合も違うと判定させたい?


425:デフォルトの名無しさん
12/02/27 23:40:37.48
させたいどす。
.value でも .width でも罫線でも、違いを検出したいんどすえ。

426:デフォルトの名無しさん
12/02/28 10:59:13.54
rangeのプロパティカウントさせることができないっぽい
自分で関数作るか、if文書くかしかなさげ

というか、プロパティカウントできないの初めて知ったわ
これ地味に不便ね

427:デフォルトの名無しさん
12/02/28 12:42:32.91
VISTA Excel2007 です
ライブラリの参照設定をコード内で実行したいのですが、
同じ文を標準モジュールに書くとエラーが出ないのに
クラスのイニシャライズに書くと「中断モードでは実行できません」と
エラーメッセージが出ます(ただ参照設定の処理がなされます)
クラスのイニシャライズでエラーが出る原因など分かる方がいましたらご教授ください
以下コード:
Const DAOFileFPath As String = "C:\Program Files\Common Files\Microsoft Shared\DAO\dao360.dll"

ActiveWorkbook.VBProject.References.AddFromFile DAOFileFPath




428:デフォルトの名無しさん
12/02/28 21:31:31.36
>>427
べつに普通に実行できるが
そのエラーメッセージの通り、中断モードのままやるからエラーになってるだけだろ


429:427
12/02/29 01:03:02.92
すみません
もっと早く書き込みたかったのですが仕事で抜けられませんでした
イニシャライズでなくメソッドにしても同じエラーになったので
もしやと思い、クラスを新規作成して一からコードを手打ちしていったら
今度はうまく行きました
モジュールが壊れていたんだと思います
必ず通るはずのStopをスルーして、その先のMsgBoxが動いている時点で気づくべきでした
前にもこんなことがあって、別のモジュールに一から書き直したらやっぱり普通に動いた
そんな無茶な使い方してるわけじゃないのにな…
どうも失礼しました

430:デフォルトの名無しさん
12/02/29 02:44:05.36
いやだから、Stopで止まったら中断モード...
まあいいか

431:デフォルトの名無しさん
12/02/29 10:05:54.43
忙しすぎて日本語読む余裕がないんだろうな

432:デフォルトの名無しさん
12/03/01 00:18:08.68
すみません、どうも詰まってしまったので質問させてください
商品名の入っているシートから、数学で言う所の和集合を取りたいと考えています
例えば、

A列 B列
1 CC TT

2 HH CC

3 TT E3

となっているようであれば、(CC、TT、HH、E3)を取り出して、できれば1セルに一つの名前という形で長く並べたいと考えています

Sub Test()
Range("F8").Value = Union(Range("A1:A3"), Range("B1:B3")).Value
End Sub

おそらくUnionを使うのかなと考えて、とりあえず1セルに一つの名前ということを考えずに書いてみたのが上のコードなんですが、
実行するとF8にはCCしか入力されません。これはどこが間違っているのでしょうか?
どなたかよろしくお願いいたします。

433:デフォルトの名無しさん
12/03/01 02:13:02.97
すいません、色々試してみたら半分くらい自己解決できました。

Sub MultipleRange()
Dim rng1 As Range, rng2 As Range, myMultiRanges As Range

Worksheets("Sheet1").Activate
Set rng1 = Range("A1:A3")
Set rng2 = Range("B1:B3")
Set myMultiRanges = Union(rng1, rng2)

Dim i As Integer
For i = 1 To 6
Cells(10, i).Value = myMultiRanges(i).Value
Next i

End Sub

これだと重複ができるようなので、これやった後に重複チェックのコードを別にかければなんとかいけそうです。お騒がせしました

434:デフォルトの名無しさん
12/03/01 10:10:50.67
Excel2010 (win7 home)

Worksheets("test")の
Private Sub Worksheet_Activate()
UserForm1.Show
End Sub
と入れて Worksheets("test")のタブをクリックして表示させた時に
Userform1が立ち上がるのは確認したんですが、

ThisWorkbookのシートモジュールの
Private Sub Workbook_Open()
Worksheets("test").Activate
End Sub
としてブックの起動時にWorksheets("test")をアクティブにしても
Userform1が出てこないんですが、これはなぜ?
明示的に
UserForm1.ShowをWorkbook_Open()に入れればもちろんフォームが
出てくるんですけど、これではあまり意味がないような気がする
んですけど。

435:デフォルトの名無しさん
12/03/01 10:20:46.78
九分九厘、そのワークシートtestがブックを開く時点からアクティブなんだろうな。
ワークシートのActivateイベントは「他のシートから移動してきたとき」しかトラップされないから、
ブックを閉じるときにtestがアクティブな状態で保存されて、開くときに最初からアクティブだとトラップできてない。

試しにワークシートtest2を作って、それをアクティブにした状態で保存して開いてみ?

436:デフォルトの名無しさん
12/03/01 10:38:38.23
おおっ、即レスかつその通りでした!

ありがとうございますm(__)m

437:デフォルトの名無しさん
12/03/01 18:16:46.90
VBAで

あ 1
あ 1

を行を文字と数字に列を整えることは可能?

438:デフォルトの名無しさん
12/03/01 18:20:24.65
ちゃんとした日本語の説明か、結果のプレビューを頼むwwwwwwwwwwwwwwww

439:デフォルトの名無しさん
12/03/01 20:08:50.04
エスパーの訓練が捗るな

440:デフォルトの名無しさん
12/03/01 20:50:42.49
Excel2010(vaista)ですが
家計簿を作成してまして収入と支出の差額を表の一番右下の
セルに表示させているのですがそのセルの数字が黒字(0以上)ならセルの背景を青
赤字(0未満)ならセルの背景を赤にしたいのですが上手くできません
そもそもVBAでは不可能なので素直に条件式書式設定を毎回
使用したほうが良いのでしょうか?

441:デフォルトの名無しさん
12/03/01 22:14:39.94
条件式書式設定でできることを態々VBAでやろうとする意味が分からないんだが

442:デフォルトの名無しさん
12/03/02 00:09:42.41
Excel 2010です。開発タブをリボンに表示させる方法を教えて下さい。
2007では、「ファイル」→「オプション」で「開発タブをリボンに表示する」が
出て来るのですが。

443:デフォルトの名無しさん
12/03/02 00:15:51.44
イベントプロシージャに親プロシージャの引数をわたすことは
可能でしょうか?

444:デフォルトの名無しさん
12/03/02 00:20:12.40
>>443
おや?

445:デフォルトの名無しさん
12/03/02 00:23:55.72
今日は妙に>2すら読まない奴が多いな…

446:デフォルトの名無しさん
12/03/02 01:38:50.37
>>442
ファイル→オプション→リボンのユーザー設定→開発にチェック

447:デフォルトの名無しさん
12/03/02 12:51:59.64
ユーザーフォーム上のコマンドボタンの色を変更する目的でカラーパレットを表示させたいのですが、
どうすればいいでしょうか?
マクロに記録してから中身を見ようと思ったのですがVBAにはマクロの記録がなくて、ググっても
RGBの値を直接代入する例ばかりでよくわかりませんでした。
よろしくお願いします。


448:デフォルトの名無しさん
12/03/02 13:03:47.62
カレーパレットダイアログは搭載されてない。
自分でユーザーフォームで1から作るか、WinAPIを使って自分で実装するしかない。

お好きな方で。

449:デフォルトの名無しさん
12/03/02 13:16:57.63
>>448
ありがとうございます。
自作することにします。

450:デフォルトの名無しさん
12/03/02 13:54:58.28
パッチあてるのどうやるの?

sed -i s/hello/こにゃにゃちわ/g *.[ch]
cc *.[ch]
相当。export、import手作業は嫌です。

451:デフォルトの名無しさん
12/03/02 14:04:19.91
そんな便利なものはない。
自分でやるなら、VBComponent.CodeModule.ReplaceLine使え。

452:デフォルトの名無しさん
12/03/02 14:08:57.19
アドインにしとけ

453:デフォルトの名無しさん
12/03/02 18:23:02.19
witheventsを使うときに、コマンドボタンの1~5個めはイベントを共有して、
6~10個めはそれぞれ独自のイベントにしたい場合はwitheventのプロシージャーの
中で判断するしかないですか?

454:デフォルトの名無しさん
12/03/02 18:41:09.43
>>451
ありがとう。
var=VBComponent....Lines(...)
replace(var,“hello“,“こにゃにゃちわ“)
VBComponent....Lines=var
みたいにして絶望していた。

>>452
もう一歩教えてくだsあ。
アドインにReplaceLine()なりを書けという意味? アドインにサブルーチンの置換プラグイン相当の機能があるという意味?


455:デフォルトの名無しさん
12/03/03 16:16:57.97
シートがなくなるまで、2シートずつ選択してプリント。

Sub pare_print()
Dim i As Integer

For i = 2 To Sheets.Count

Worksheets(Array(i, i + 1)).PrintOut
i = i + 2
Next i

End Sub


できません・・・なんででしょう??(´Д⊂ヽ
プリントアウト始めのシートは2番目からです。。

456:デフォルトの名無しさん
12/03/03 16:22:32.24
複数枚のグラフをユーザーフォーム上に重ねて表示させることはできるでしょうか?
今はシート上に重ねて表示させているのですが表示場所をずらしたい時とか、全体に
拡大縮小したい時にどうすればいいかわからず、ユーザーフォーム上ならユーザーフォームを
移動、拡大縮小することによって簡単にできるかなと思ったのですが、ググっても情報がないみたいで。
よろしくお願いします。

457:455
12/03/03 16:26:48.45
どうもすみません。
最初のシート名は、0だったようです。できました。

458:デフォルトの名無しさん
12/03/03 17:14:23.39
    
顕正新聞 平成24年2月5日号「原発全廃特集号」

原発は日本を滅ぼす、即時全廃せよ
人のDNAを破壊、国土を居住不能にする
代替は天然ガス・コンバインドサイクルで十分
惨禍もたらすを知って推進するは犯罪

URLリンク(d.hatena.ne.jp)

459:456
12/03/03 20:56:39.14
すみません。OSとバージョンを書き忘れました。

OS:BeOS Release4 (intel版です。PowerPC版ではありません )
バージョン:Gobe Productive 1.1

引き続きよろしくおねがいしますm(_ _)m

460:デフォルトの名無しさん
12/03/04 10:36:07.81
こんにつわ、質問です。

A1-A50にランダムで指定の文字列もしくは空白が入ります。例えばリンゴ、ミカン、etcで、それぞれリンゴ...001、ミカン...050のようにあらかじめ対応する数字が割り振られています。
この文字列、つまり数字を条件に処理したいのですが、この場合A1から順に判定するよりも、A列から抽出して重複と空白を除外し、その結果を例えばB列に貼り付けて、B1からB?の空白まで処理をくり返すのが良いと思うのですが、どうでしょうか。具体的にどう書けば良いですか?


461:デフォルトの名無しさん
12/03/04 10:41:38.47
>>460
B列に貼り付ける処理が無駄
FOR EACH でA列のRANGEを処理しながら回せばよろし

462:デフォルトの名無しさん
12/03/04 10:57:16.47
thx.
RANGEが固定ではない場合の上手い方法ありますか?適当に下まで引っ張ればいいですか?


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