16/03/30 21:58:56.28 .net
>>561
> おもいっきり要素数わかってるだろ
の意味もわかってないアホ乙
565:名無しさん@そうだ選挙にいこう
16/03/30 22:01:29.41 .net
556です
今会社にいないので記憶を頼りに再現してみました
URLリンク(minus-k.com)
うpろだ上記しか知らなかったのでここで…
今A3が「みかん」になってますけど、既に10行目まで「りんご」が入っていて連番で数値が割り振られているので
割り振られたあとに「みかん」を「りんご」に変更してしまうと、
既に割り振られていた4行目移行の数値が1つずつズレてしまうんですよね
この「みかん」を「りんご」に変更したときに、B3の値に10が自動で入ってくれるのが一番ベストなのですが、
ちょっと難しそうなので、せめて「りんご」に変更したときにB3以外のB列の値が変更されなければ取りあえずは許してもらえるので、
ファイル保存時に数式を実数に変換できる機能でもあれば便利なのになぁと思って質問してしまいました
VBA処理も可と考えております
566:名無しさん@そうだ選挙にいこう
16/03/30 22:08:07.75 .net
>>565
一応確認だけど、
1,2,10,3,4,5,6...
という番号の振り方でいいの?
>>563
そうだね、どうしようもない人はいっぱいいるよね。仕方ないか・・・
567:名無しさん@そうだ選挙にいこう
16/03/30 22:16:02.63 .net
>566
今用意したファイルだと、最終番号が9なので、そのタイミングで「みかん」が「りんご」になった場合は
1,2,10,3,4,5,6,7,8,9でいいのですが、最終番号が20まで割り振られていたときに「りんご」になった場合は
1,2,21,3,4,5,6,7,8....20になってくれるのが一番助かります
ただそれってすごく大変そうな気がしておりますので、せめて
1,2,(空白),3,4,5,6,7,8...20になれば大丈夫と考えております
代案でも構わないのでどうにか教えていただけるとありがたいです
568:558
16/03/30 22:45:55.06 .net
>>565
やっぱり理解してなかったみたいだけど、
「実数」っていうのは数学的にいうと
複素数のうちの虚部がゼロの数のことをさす用語であって
あなたが言ってるような使い方は不適切
エクセル使用者の一般的用法としてはそういうのは値(あたい)と言います
閑話休題
>>567
後から追記したものにも順番を反映させるとなると
VBA無しでの実現はほぼ不可能だと思いますよ
VBAでやるなら
Worksheet.Changeイベントっていうのを
トリガーにして実行されるようなコードを組めば
途中に連番入れるような処理もできるっちゃあ出来ます
「A列の入力内容を確認して合致していたら同じ行のB列も確認、
そこが空ならB列に既に入力された最大値+1を書き込む」みたいな処理ですね
ただし、既に「みかん」のところに「りんご」と入れたら連番を追記するだけなら
これで良いとして、
逆に「りんご」の部分を「みかん」(というか「りんご」以外の値)に変えたときには
どうするのかって問題もあります
その場合、連番減らしたりするんですか?
そうなるとこれだけじゃすまなくなりますよ
そういうことはやらないって言う前提ならまぁそれでも良いですけど
こういう質問する人って
そういうイレギュラーについて端から考えてないケースが割りと多いんで
一応聞いておきました
569:名無しさん@そうだ選挙にいこう
16/03/30 22:50:06.09 .net
>>556
関数を作ったってことはVBAなんだよね?
じゃあVBAでやればいいんじゃないの?
570:名無しさん@そうだ選挙にいこう
16/03/30 22:54:57.36 .net
>>567
なんとなく支店の閉店開店っぽい処理のような気がするな。まぁなんでもいいけどな
とりあえず関数だと無理があるんでvbaにした
A列を"りんご"と変更すると最大値+1をB列に入れる
要設定ってとこが二箇所あるんでそこは設定してくれ
Private Sub Worksheet_Change(ByVal Target As Range)
On Error GoTo Err
'イベントを切る。切らないと無限ループに
Application.EnableEvents = False
'要設定。変更する列を数値で
c = 1
'要設定。判定する文字列
s = "りんご"
If Target.Column = c And Target.Value = s Then
'最終行
maxrow = Cells(Rows.Count, 1).End(xlUp).Row
'最大値用
max_num = 0
For i = 1 To maxrow
If Cells(i, 1).Value = s And Cells(i, 2).Value >= max_num Then
max_num = Cells(i, 2).Value
End If
Next
Cells(Target.Row, 2).Value = max_num + 1
End If
Err:
Application.EnableEvents = True
End Sub
571:名無しさん@そうだ選挙にいこう
16/03/30 22:59:26.56 .net
>>567
もし>>570を使うなら、B列に関数は設定しないほうがいい
それと作ってみたが使い勝手が悪かったもの。一応投稿しておく
保存時に範囲内の数式の結果を値にする。多分>>567の方が実務上使いやすいだろう
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
'シートと最大値の設定。
s = "Sheet1"
r_start = 3
r_end = 5
c_start = 2
c_end = 2
Range(Cells(r_start, c_start), Cells(r_end, c_end)).Value = Range(Cells(r_start, c_start), Cells(r_end, c_end)).Value
End Sub
572:554
16/03/31 00:35:00.47 .net
>>555
時刻が一致するのに希望通りにならない場合、シリアル値が異なります。
0:00から1分刻みでオートフィルした場合の 1:13 は0.06805555555555560
直接時刻を入力した場合の 1:13 は0.06805555555555550です。
(表示形式を数値とし、小数点以下の表示桁数を17桁とする)
セル位置と時刻の対応が確定している(開始時刻が確定、抜けてる時刻は絶対にない)場合
に限り、>>560さんの書いてるとおり、C1に入力した時刻から時と分を取り出して
何行目にあるのかを計算するのが手っ取り早いかと思います。
A2が0:00から始まるのであれば、行位置は HOUR(C1)*60+MINUTE(C1)+2 で、
A2が11:01から始まるのであれば、行位置は補正して (HOUR(C1)-11)*60+MINUTE(C1)+1 でいいかと。
573:554
16/03/31 10:31:31.19 .net
>>555 もうひとつの解決策は、A列にオートフィルではなく直接時刻を入力することです。
ただし、手入力ではなくマクロを利用して。
以下は554を書くために0:00~23:59の時刻を自動生成したマクロを修正して開始時刻(だけ)を指定できるようにしたものです。
これだと>>549さんの計算式でいけると思います。(試してませんが)
Option Explicit
Dim hh As Integer, mm As Integer, r As Long, flg As Boolean
Sub test()
r = 2: flg = False
For hh = 0 To 23
For mm = 0 To 59
If (hh = 11) And (mm = 1) Then flg = True '開始時刻でflgセット
If flg Then
Cells(r, 2).Value = TimeValue(hh & ":" & mm)
r = r + 1
End If
Next mm
Next hh
End Sub 'マクロ終わり
TimeValue(hh & ":" & mm) で、時刻を直接入力したのと同じことになります。
ただし、A列の時刻をオートフィルで入れたものと見た目が変わらないので、
セルのロックとシートの保護を組み合わせるなどしてシリアル値を絶対変えないようにする必要あり。
574:名無しさん@そうだ選挙にいこう
16/03/31 10:38:02.95 .net
そんな面倒なことしなくてもテキストで比較すればいいだけなんじゃ…
575:名無しさん@そうだ選挙にいこう
16/03/31 12:31:07.24 .net
そうだね
576:554
16/03/31 13:26:27.91 .net
>>574 アドバイスthx
=LOOKUP(TEXT(C1,"hh:mm"),TEXT(A2:A100,"hh:mm"),B2:B100)
こういう形でいけました。 [Shift]+[Ctrl]+[Enter]しなくてもいけるのね。
577:名無しさん@そうだ選挙にいこう
16/03/31 17:57:12.84 .net
A B C D E F G
0 15 0 5 18 15
0 5 -10 -5 -10
-5 0 -10 -10 -10
0 -10 5 0
10 0 10 10 6 0
10 5 15 10
15 0 20 5 20 0
10 0 20 10 20 0
15 5 15 5 27
こんな感じでデータがあります。
E列に数値が出たら、次のE列の数値が出るまでの
最大数値をF列に、最小数値G列に抽出したいです。
上の例だとE1とE5までの最大値(B1)と最小値(C2,C3)
次にE5からE9までの最大値(C7,C8)と最小値(B5,B7,B8)
です。
578:名無しさん@そうだ選挙にいこう
16/03/31 18:31:32.65 .net
>>577
言ってることが色々と良く分からないんだが、
>E列に数値が出たら、次のE列の数値が出るまでの
これはまずどういう意味?
見たところE1からE9まで全て数値は入ってるんで
「次のE列」とか言われても
何のことやらさっぱり理解できない
そしてその演算結果で F1に18という値が入るようだけど
そんな数値A1からE9の範囲内のどこにも無いんだけど
一体どこから出てきたものなの?
同様に最小値のG1のほうも
どう考えても最小値は15じゃないわけだけど、何でそうなってるの?
579:名無しさん@そうだ選挙にいこう
16/03/31 19:57:40.11 .net
>>577 テストデータはこれでいいのでしょうか?
URLリンク(i.imgur.com)
そのうえで、どのセルに計算式を設定すればいいのですか?
578さんと同様、「E列に数値が出たら」をはじめ、Excelにはなじまない言葉が多いので
具体的にわかりやすく説明願います。
580:名無しさん@そうだ選挙にいこう
16/03/31 20:39:51.89 .net
F1~G9に数値入れてみて欲しい
なんか意味がわからないゾ
F1の18とG1の15はどこから出てきたんだ?
581:名無しさん@そうだ選挙にいこう
16/03/31 21:02:51.15 .net
>>568,570,571
ありがとうございます。
さっそく試してみたいと思います。
582:名無しさん@そうだ選挙にいこう
16/04/01 00:26:38.53 .net
教えてください。
フォームに設置したテキストボックスに入力されたデータが
日付になっているかどうかを判定する方法ってありますか?
また、逆に、テキストボックスに日付以外の入力をさせない方法(カレンダーを設置以外)って
あるんでしょうか?
583:名無しさん@そうだ選挙にいこう
16/04/01 01:05:28.26 .net
isdate()
584:名無しさん@そうだ選挙にいこう
16/04/01 05:42:54.33 .net
>>582
テキストボックス限定なの?
俺はよくスピンボタンとラベルの組み合わせで処理するけど、
要するにキーボードから手入力させずに、
スピンボタンで数値を増減させることで入力させてる
まぁ、ラベルの代わりに入力を禁止(LockedプロパティをTrueに)した
テキストボックスでもいいし、リストボックスやコンボボックスでも良いけど
もちろん、日付の範囲のみで値を変動させる必要があるんで、
スピンボタンとラベルは3つ用意して、それぞれで年・月・日を別々に扱う
月は1~12、日は1~31、の数値しか取りえないんだから
スピンボタンのMAXとMINをそれに合わせとけばそこから逸脱することは無い
年はどこまでを入力範囲にするかにも因るけど、とりあえずMINを2000、MAXを2050ぐらいにしてる
これはまぁ必要な範囲に応じて変えればいいだけの話
あとはコード中でそれら3つの変動を監視して、たとえば月が1から2に変化したときに
日のMAXを31から28や29(どちらになるかは年から判断する)に変えたり、
無効な日付を生成しないように、そういうこまごましたところも作りこんでる