Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


145 / 3841 ページ ←次へ | 前へ→

【79564】Re:セル範囲内のユニークな文字列数をカ...
発言  γ  - 17/12/31(日) 21:09 -

引用なし
パスワード
   なにせ
ht tp://www.vbalab.net/index.html
が正面入り口ですから。
ここには、VBA質問箱としか書いてないんです。
・ツリー全体表示

【79563】Re:セル範囲内のユニークな文字列数をカ...
お礼  Aisa  - 17/12/30(土) 22:31 -

引用なし
パスワード
   ▼γ さん:
>ああ、やっぱりね。
>こちらはVBA質問箱なので、ワークシート関数の質問はテーマ違いですね。
>今後は気をつけてください。

ここは、Excel及びVBAかと思いきや、VBA専門だったのですね、知らずに
質問をして大変失礼いたしました。
ご丁寧にありがとうございました。
・ツリー全体表示

【79562】Re:セル範囲内のユニークな文字列数をカ...
発言  γ  - 17/12/29(金) 6:42 -

引用なし
パスワード
   ああ、やっぱりね。
こちらはVBA質問箱なので、ワークシート関数の質問はテーマ違いですね。
今後は気をつけてください。

ご自分で気づかれるかと思って、質問の形にしました。

あと、よくある議論は、
"対象範囲の中に空白セルがある場合には、エラーになってしまうんです"
という話ですね。
この場合は、配列関数を使って、SUM IFERROR COUNTIFを組み合わせます。
一緒に抑えておくとよいでしょう。

ちなみに、範囲が不定形だったり、複雑な条件がある場合は、
VBAでやることになりますね。
dictionaryを使って
dic(r.Value) = Empty
として登録すれば、
dic.Countが求めるものですね。
お決まりのパターンです。
・ツリー全体表示

【79561】Re:セル範囲内のユニークな文字列数をカ...
発言  Aisa  - 17/12/29(金) 4:35 -

引用なし
パスワード
   どうやらURLが入力できなかったようです。以下の頭にs付の例のやつを加えてください。
bellcurve.jp/statistics/blog/15370.html 

関数の機能を使うだけではなく、ロジックをかますことにより、
結果として求める答えをシンプルな構造で導きだす、とんでもなく
素晴らしい方法であったと思います。

このような発想力は私にはないので、非常に感銘を受けました。
是非ご覧になってください。
・ツリー全体表示

【79560】Re:セル範囲内のユニークな文字列数をカ...
お礼  Aisa  - 17/12/29(金) 4:29 -

引用なし
パスワード
   お返事を書いたのですが、「本分に禁止語句が含まれています」と言われ、
お返事を送信できません。
内容としては、当初自力で調べようとした時のようにネットで検索して、
ご質問の”例”を示そうと思いましたが、その過程で、回答が載っている
サイトを見つけましたので、無事解決致しました、という内容です。
ありがとうございました!

該当サイト
Bell Curve 統計 WEBというサイトの
Excel 関数で重複を除いてデータの件数を求める方法
という記事です
・ツリー全体表示

【79559】Re:セル範囲内のユニークな文字列数をカ...
発言  γ  - 17/12/28(木) 8:24 -

引用なし
パスワード
   >1列の範囲内で動く関数
とはどのようなものでしょうか。参考までに教えてください。
ワークシート関数の組み合わせを所望しているのでしょうか?
・ツリー全体表示

【79558】セル範囲内のユニークな文字列数をカウン...
質問  Aisa  - 17/12/28(木) 1:13 -

引用なし
パスワード
   こんにちは
Excelのセル範囲内(例:A1:B10)での、ユニークな文字列の数をカウントしたいのですが
いくら探しても1列の範囲内で動く関数しか見つけられません(例:A1:A10)

計算列を使用したりすればできるのはもちろんわかるのですが、フォーマット変更が
難しいため、別シートや別列に抽出してからではなく、直接出したいのです。

どうかお助けください。
・ツリー全体表示

【79557】Re:数値の範囲にいて
発言  γ  - 17/12/27(水) 21:47 -

引用なし
パスワード
   少し考え違いしているようですね。

あなたのことを考えて、できているところまで示してみては、
とおっしゃっていると思います。
マナさんはいつも丁寧な回答をされているかたです。

提示されたコード(一部分であっても)を出発点に、
(下記のような曖昧な点を)明確にしながら
コードを検討していこうということだったと思います。

それなのに、「条件が合わなければスルーして」というのはなんと無粋な。失礼な。
そういう対応だと、回答者は誰もスルーしちゃいますよ。

ご自分の不明点を明確にすれば、
ご自分のテーマが明確になります。
そして、回答者もそこを中心に丁寧な助言ができます。

私は何度もマナさんがそういう助言をするスレッドを目撃してきました。

今回のは残念な対応でしたし、何よりも、
ご自分の勉強の機会を逸してしまって、
あなたにとって残念な話です。

-----------------
完全なコードがポンと出てくるわけがないですよ。
以下のような点が明確になっていませんよね。

大切なのは、結果のコードではなく、
どのような考え方でそれを作成していくか、と言う点です。

仕様を確認しながら、検討していく
そういう経験そのものが必要なことなんです。

不明点の例:
・対象範囲は今日だけの列か、全体か。
 今日の列なら、それはどうやって判断するか(データの日付はどこにあるのか)
・それともActiveCellのある列を対象とするのか。
・「測定基準範囲も異なります。」が具体性に欠ける。
 機種毎項目毎の基準範囲はシートのどこかに記載があるのか。
・範囲外箇所が複数あった場合、警告は連続して出す必要があるのか。

仕様が曖昧だから、今できる回答は例えば、以下のようなことでしかないでしょう。(例えばの、疑似コードです)
  If セルの値 < 下限 Or セルの値 > 上限 Then
    セルに色をつける
  End If
  といった処理を、対象範囲内で繰り返せばよい。
というものでしかないでしょう。

・色をつける部分は、マクロ記録をとれば参考コードがわかります。
・繰り返し部分は、例えば、こんなコード片が参考になるはず。
  For j = 1 To 37
    For k = 1 To 7
      Debug.Print k + 2 + (j - 1) * 9
    Next
  Next
 
---------------
なお、そもそもを言えば、まとめて処理するよりも
入力の都度、着色による警告があったほうが便利なはずです。
入力のための情報をもう一度探す手間をかけず、
その時点で確認ができるはずだからです。

また、入力規則の利用も検討に値するでしょう。

回答者の助言は、素直に聞き入れた方がお得です。
あなたの質問回数の何百倍、何千倍もの回答をしてきています。
・ツリー全体表示

【79556】Re:数値の範囲にいて
回答  みかん  - 17/12/25(月) 23:50 -

引用なし
パスワード
   ▼マナ さん:
先ほども言いましたが勉強中で参考にしたいため募集しております。
条件が合わなければスルーして頂いて構いません。
すみません。
・ツリー全体表示

【79555】Re:基準日の変更
発言  γ  - 17/12/25(月) 21:57 -

引用なし
パスワード
   投稿する場合は、コードをまるまるこちらにコピーペイストしてください。
こちらに手打ちで入力していませんか? (j = j + 1 じゃないのか。)
そして、インデントをきちんとつけてください。
この2点、厳守してください。
返事はいらないです。
・ツリー全体表示

【79554】Re:基準日の変更
お礼  T&#8211;K  - 17/12/25(月) 20:52 -

引用なし
パスワード
   何回か動作確認
していますので問題
ありません
また教えてください
・ツリー全体表示

【79553】Re:数値の範囲にいて
発言  マナ  - 17/12/25(月) 19:20 -

引用なし
パスワード
   ▼みかん さん:

>マクロを勉強中

作りかけでもよいです。動かなくてもよいです。
試してみたコードを教えていただけますか
・ツリー全体表示

【79552】Re:数値の範囲にいて
回答  みかん  - 17/12/25(月) 18:37 -

引用なし
パスワード
   ▼マナ さん:
返信ありますございます。
条件付きでも問題はないのですが
私自身、マクロを勉強中な事もありマクロで条件を満たしたいと共に今後の参考にさせてもらいたいと思い投稿をさせて頂きました。
・ツリー全体表示

【79551】Re:数値の範囲にいて
発言  マナ  - 17/12/25(月) 17:52 -

引用なし
パスワード
   ▼みかん さん:

マクロでなくて、条件付き書式で色をつけるのでは何か問題ありますか
・ツリー全体表示

【79550】数値の範囲にいて
質問  みかん  - 17/12/25(月) 12:21 -

引用なし
パスワード
   質問失礼します。
セルに毎日測定値を入力しているのですが、コマンドボタンなどを押すと測定値が範囲内であるかを判断し範囲外であれば警告と範囲を外れてるセルに色が付くようになればと思い皆様のお力をお借りできたら幸いです。

1日分は縦に入力しD3からD9に7箇所に入力します。
測定基準範囲も異なります。
上記はセルは測定機器1機分で
D12からD18が2機目となります。
全部で37機分7項目あり
隣の縦列が2日目となり31日まであります。

分かりづらい説明かとは思いますが
よろしくお願いします。
・ツリー全体表示

【79549】Re:基準日の変更
発言  γ  - 17/12/24(日) 23:32 -

引用なし
パスワード
   ご苦労さまです。

そのコードで本当に結果が得られていますか?
j はドンドン減っているから、いつまで経っても終了条件を満たさないと
思いますが。

それと、きちんとインデントをつけるべきです。
一丁目一番地、初歩の初歩ですよ。
頑張ってください。

# 回答から学んでいないんだなあ。残念!
・ツリー全体表示

【79548】Re:基準日の変更
発言  T-K  - 17/12/24(日) 22:44 -

引用なし
パスワード
   Function myDay(stDay As Range, myVal As Long, myAry As Range)
Dim i As Long, j As Long, K As Long '変数 iをLong型 jをLong型に宣言
Dim 納期 As Date
Dim d As Date
d = stDay.Value


 'stDay=納期希望日
 'myVal=リードタイム
 'MyAry=定休日データ


Do
If WorksheetFunction.CountIf(myAry, d - K) = 0 Then
納期 = d - K


Exit Do
End If
K = K + 1
Loop


i = 1
Do Until j = myVal

If WorksheetFunction.CountIf(myAry, 納期 - i) = 0 Then 'Countif関数で、
myDay = 納期 - i


j = j - 1


End If


  i = i + 1

Loop

そのままでも使えるのは拝見していてわかりましたが、
アプローチがちがうだけで求めている処理は同じところは少し修正して
そのまま使用しました。
求めたい処理はわかってもそれを流れで考えてコードにするのは
むずかしいです
ほんとにありがとうございました。
・ツリー全体表示

【79547】Re:基準日の変更
発言  γ  - 17/12/24(日) 21:00 -

引用なし
パスワード
   参考までに最終形をアップしていただきたい。
・ツリー全体表示

【79546】Re:基準日の変更
お礼  T-K  - 17/12/24(日) 15:31 -

引用なし
パスワード
   回答ありがとうございました

一部参考にさせていただきそのまま動く所はそのままにして
動かした結果希望の処理ができました。

*説明が悪く申し訳ありません
今度利用するときは、具体的に説明できるようにいたします。

お手数をおかけしました。
・ツリー全体表示

【79545】Re:基準日の変更
回答  γ  - 17/12/24(日) 10:42 -

引用なし
パスワード
   具体的な例を示すと言うことは例えばこんなことです。

休日テーブルは下記のとおりとする
  A列
1 2017/12/2
2 2017/12/3
3 2017/12/9
4 2017/12/10
5 2017/12/16
6 2017/12/17
7 2017/12/23
8 2017/12/24
9 2017/12/28
10 2017/12/29

希望納期 2017/12/28 は休日であった。
実際の納期は、それの直前の稼働日である 27 になる。
リードタイムを3日とすると、
さらに3日遡った稼働日である、22日となる。

21
22    ←求める日
23 休日
24 休日
25
26
27    ← 納期
28 休日  ← 希望納期

------------------
仮に以上のようなことだとすると、以下のコードでどうか。
微修正はそちらで願いたい。
(B1セルに 2017/12/28 が入力されているとします)

Sub test()
  Dim myAry As Range
  
  Set myAry = Range("A1:A10")
  Debug.Print myDay(Range("B1"), 3, myAry) '→ 2017/12/22 が出力される
End Sub
Function myDay(stDay As Range, myVal As Long, myAry As Range) As Date
  'stDay = 納期希望日
  'myVal = リードタイム
  'MyAry = 定休日データ
  
  Dim k As Long, j As Long
  Dim 納期 As Date
  Dim d As Date
  
  d = stDay.Value
  
  '(1)直前の稼働日を納期とする
  k = 0
  Do
    If WorksheetFunction.CountIf(myAry, d - k) = 0 Then
      納期 = d - k
      Exit Do
    End If
    k = k + 1
  Loop
  
  '(2) リードタイムの考慮
  k = 1
  Do
    If WorksheetFunction.CountIf(myAry, 納期 - k) = 0 Then
      j = j + 1
      If j = myVal Then
        myDay = 納期 - k
        Exit Function
      End If
    End If
    k = k + 1
  Loop
End Function
・ツリー全体表示

145 / 3841 ページ ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free