質問投稿でgooポイントが当たるキャンペーン実施中!!>>

https://oshiete.goo.ne.jp/qa/10791019.html
上記で質問させて頂いたものです。
御教示頂きました内容で意図する動作が出来ていますが、データ数が多い(10000件ぐらい)と
スクリーンの更新等をOFFにしていても5分以上処理に時間が掛かってしまいます。
上記ご教示頂きました構文より処理速度を上げるような構文があればご教示お願い致します。

尚、時々反映されないデータがある原因が分かりましたので補足で下記します。
日付の個所でセルの表示幅が足りない時に「###」となりますが、その状態だと条件が一致した
とみなさない事が原因でした。(FIND)
セル幅を調整して日付が表示された後だと処理される事が確認出来ました。

A 回答 (4件)

No.1・3です。



>それが例えば12行目が日付で13行目以降がデータになっていた場合)

というコトなので、前回のコードに少し手を加えてみました。
「★」の行が変わっているところです。
(「反映DATA」シートのAI13セル以降は消去せず、そのまま残しています。)

Sub Sample3()
 Dim i As Long, j As Long, k As Long, L As Long
 Dim lastRow1 As Long, lastRow2 As Long, lastCol1 As Long, lastCol2 As Long
 Dim wS As Worksheet
 Dim myR1, myR2

  Set wS = Worksheets("元DATA")
   lastRow2 = wS.Cells(Rows.Count, "A").End(xlUp).Row
   lastCol2 = wS.Cells(1, Columns.Count).End(xlToLeft).Column
    myR2 = Range(wS.Cells(1, "A"), wS.Cells(lastRow2, lastCol2))
     With Worksheets("反映DATA")
      lastRow1 = .Cells(Rows.Count, "C").End(xlUp).Row
      lastCol1 = .Cells(12, Columns.Count).End(xlToLeft).Column '//★//
       '//「反映DATA」シートのA列12行目~最終行・最終列を配列「myR1」に!//★
       myR1 = Range(.Cells(12, "A"), .Cells(lastRow1, lastCol1)) '//★//
        For i = 2 To UBound(myR1, 1) '//「反映DATA」シートの13行目~最終行まで//★
         For k = 2 To UBound(myR2, 1) '//「元DATA」シートの2行目~最終行まで//
          If myR2(k, 1) = myR1(i, 3) Then '//「元データ」シートk行目が「反映」シートのi行目と等しければ・・・//
           For j = 35 To lastCol1 '//「反映DATA」シートのAI列~最終列まで//
            For L = 4 To lastCol2 '//「元DATA」シートのD列~最終列まで//
             If myR2(1, L) = myR1(1, j) Then '//両配列の日付が等しければ・・・//
              If myR2(k, L) <> "" Then '//「元DATA」シートのk行目・L列目が空白以外の場合は・・・//
               myR1(i, j) = myR2(k, L) '//配列「myR1」のi行・j列目に配列「myR2」のk行・L列目を代入//
              End If
             End If
            Next L
           Next j
          End If
         Next k
        Next i
       '//「反映DATA」シートのA12セル~最終行・最終列に一気にmyR1の値を吐き出す//★
       Range(.Cells(12, "A"), .Cells(lastRow1, lastCol1)) = myR1 '★
     End With
    MsgBox "完了"
End Sub

※ ワークシート上でループさせるより、対象範囲を一旦配列に格納しその中でループさせる方が
各段に速いので、それぞれのシートの範囲を配列に格納しています。

myR2 → 「元DATA」シートのA1~A列最終行、1行目最終列まで
myR1 → 「反映DATA」シートのA12~C列最終行、12行目最終列まで

すなわち両配列の1行目は「日付」の行になり、
>For i = 2 To UBound(myR1, 1)
で配列の2行目以降~最終行まで、というコトになります。
今回の場合、配列「myR1」の2行目は「反映DATA」シートの13行目に当たります。

こんな感じで理解いただけたでしょうかね?m(_ _)m
    • good
    • 0
この回答へのお礼

ありがとうございました。
分かりやすくご説明頂き理解する事出来ました。
大変助かりました。

お礼日時:2018/12/14 09:34

No.1です。



前回の質問をよく読み返してみると、更新セル?は「太字」にしていますね。
No.1で記載したように値だけの操作なので書式までは考慮していませんでした。

条件付き書式を併用してみてはどうでしょうか?
マクロを実行する前に、「反映DATA」シートを一旦別シートにコピー&ペーストし
変化したセルだけを「太字」の設定をします。

「反映DATA」シート全体に条件付き書式を設定しても良いのですが、他のセル(名前が増えたり、日付が変わったり・・・)
などがあるとそのセルも対象になってしまいますので、
「反映DATA」シートのAI8セル以降データ対象セルを範囲指定 → 条件付き書式 → 新しいルール → 数式を使用して・・・ → 数式欄に
=AI8<>Sheet3!AI8
という数式を入れ → 書式から「太字」を選択しOK!

シート見出し上に使っていないSheet(Sheet3)が存在するとして、
「反映DATA」シートをすべてコピー&ペーストします。

前回のコードの
>'//「反映DATA」シートの8行目以降を一旦消去//
>Range(.Cells(8, "AI"), .Cells(lastRow1, lastCol1)).ClearContents
の2行を消去し

>With Worksheets("反映DATA")
の行の次に
>.Cells.Copy Worksheets("Sheet3").Range("A1")

を追加してみてください。

これでAI8セル以降、更新されたセルだけが「太字」になると思います。m(_ _)m
    • good
    • 0
この回答へのお礼

ありがとうございます。
問題無く太字にすることが出来ました。
今後VBAで書式を変えたい場合、条件付き書式も取り入れていきたいと思います。

お礼日時:2018/12/12 10:37

「統合」という機能をご存知ですか?統合を使えば、ごりごりループさせなくてもお望みの結果がでます。

ただ、どれくらいの性能が出るかは分からないので、一度、手操作でやって、時間を計ってみてください。いい成績が出るようであれば、それをマクロ化しましょう。頑張ってくださいね。
    • good
    • 0
この回答へのお礼

統合という機能は初めて知りました。
参考にさせて頂きます。

お礼日時:2018/12/12 10:22

こんばんは!



前回回答した者です。

>データ数が多い(10000件ぐらい)・・・

となると、単純にループさせると相当時間がかかりますね。(応答なし)になると思います。
別の方法として、両シートを配列に格納し、その中でくるくるループさせてみてはどうでしょうか?

標準モジュールです。

Sub Sample2()
 Dim i As Long, j As Long, k As Long, L As Long
 Dim lastRow1 As Long, lastRow2 As Long, lastCol1 As Long, lastCol2 As Long
 Dim wS As Worksheet
 Dim myR1, myR2

  Set wS = Worksheets("元DATA")
   lastRow2 = wS.Cells(Rows.Count, "A").End(xlUp).Row
   lastCol2 = wS.Cells(1, Columns.Count).End(xlToLeft).Column
   '//「元DATA」シートのA1セル~最終行・最終列を配列「myR2」に!//
    myR2 = Range(wS.Cells(1, "A"), wS.Cells(lastRow2, lastCol2))
    With Worksheets("反映DATA")
     lastRow1 = .Cells(Rows.Count, "C").End(xlUp).Row
     lastCol1 = .Cells(7, Columns.Count).End(xlToLeft).Column
     '//「反映DATA」シートの8行目以降を一旦消去//
      Range(.Cells(8, "AI"), .Cells(lastRow1, lastCol1)).ClearContents
     '//「反映DATA」シートのA列7行目~最終行・最終列を配列「myR1」に!//
      myR1 = Range(.Cells(7, "A"), .Cells(lastRow1, lastCol1))
       For i = 2 To UBound(myR1, 1) '//「反映DATA」シートの8行目~最終行まで//
        For k = 2 To UBound(myR2, 1) '//「元DATA」シートの2行目~最終行まで//
         If myR2(k, 1) = myR1(i, 3) Then '//「元データ」シートk行目が「反映」シートのi行目と等しければ・・・//
          For j = 35 To lastCol1 '//「反映DATA」シートのAI列~最終列まで//
           For L = 4 To lastCol2 '//「元DATA」シートのD列~最終列まで//
            If myR2(1, L) = myR1(1, j) Then '//両配列の日付が等しければ・・・//
             If myR2(k, L) <> "" Then '//「元DATA」シートのk行目・L列目が空白以外の場合は・・・//
              myR1(i, j) = myR2(k, L) '//配列「myR1」のi行・j列目に配列「myR2」のk行・L列目を代入//
             End If
            End If
           Next L
          Next j
         End If
        Next k
       Next i
      '//「反映DATA」シートのA7セル~最終行・最終列に一気にmyR1の値を吐き出す//
       Range(.Cells(7, "A"), .Cells(lastRow1, lastCol1)) = myR1
    End With
   MsgBox "完了"
End Sub

※ マクロを実行するたびに、元データは消去するようにしています。
残したい場合は
>'//「反映DATA」シートの8行目以降を一旦消去//
Range(.Cells(8, "AI"), .Cells(lastRow1, lastCol1)).ClearContents
の2行を消してください。

※ 速度重視のため
値だけの操作になりますので、書式はお望み通りにならないと思います。m(_ _)m
    • good
    • 0
この回答へのお礼

ありがとうございます。
一瞬で処理する事が出来ました。
ひとつお聞きしたいのですが、反映データの行番号が変わった場合はどこを触れば良いでしょうか?
(現状7行目が日付で8行目以降がデータとなっていますが、それが例えば12行目が日付で13行目以降がデータになっていた場合)

lastCol1 = .Cells(7, Columns.Count).End(xlToLeft).Column←7を12に変更
Range(.Cells(8, "AI"), .Cells(lastRow1, lastCol1)).ClearContents←8を13に変更
myR1 = Range(.Cells(7, "A"), .Cells(lastRow1, lastCol1))←7を12に変更
For i = 2 To UBound(myR1, 1) '//「反映DATA」シートの8行目~最終行まで//←これがなぜ8行目を指示しているのかが分かりませんでした。

お礼日時:2018/12/12 09:43

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aと関連する良く見られている質問

Q二つの条件に合致するセルに値を入力したい(VBA)

二つの条件に合致するセルに値を入力したいです。

ワークシート名「元DATA」
  A列  B列   C列   D列    E列  ・・・
1 名前  ***   *** 2018/7/1 2018/7/8
2 aaa  ***   ***  100    
3 bbb  ***   ***        2000




ワークシート名「反映DATA」
  C列  ・・・  AI列    ・・・  AQ列   AR列
7 名前  ・・・  2018/5/6  ・・・ 2018/7/1 2018/7/8
8  aaa  ・・・  
9 ccc  ・・・  
10 bbb  ・・・  



↓「元データ」の名前(列)と日付(行)が一致する「反映DATA」のセルに、「元データ」の
  対象となる数値を入力したいです。
ワークシート名「反映DATA」
  C列  ・・・  AI列    ・・・  AQ列   AR列
7 名前  ・・・  2018/5/6  ・・・ 2018/7/1 2018/7/8
8  aaa  ・・・         ・・・  100
9 ccc  ・・・         ・・・ 
10 bbb  ・・・         ・・・       2000 




今回のデータを例にすれば、「元データ」のセルD2と「反映データ」のセルAQ8が一致するセルと
なるので、「元データ」のセルD2のデータを「反映データ」のセルAQ8に入力させたいです。
対象となる「反映データ」のセルにもともと値が入力されていたとしても上書きで構いません。
VBAで実現させたいのですが、構文をご教授頂けないでしょうか。
①「元データ」のA列、「反映DATA」のC列(7行目以降)は間に空白が存在しません。
②「反映データ」のセルに値が入力されていたとしても上書きで構いません。
③それぞれの日付データは例として挙げただけで、毎回開始日付が異なります。
④必ずしも条件に合致するデータが「元データ」に無い場合もありますが、それは無視して構いません。

二つの条件に合致するセルに値を入力したいです。

ワークシート名「元DATA」
  A列  B列   C列   D列    E列  ・・・
1 名前  ***   *** 2018/7/1 2018/7/8
2 aaa  ***   ***  100    
3 bbb  ***   ***        2000




ワークシート名「反映DATA」
  C列  ・・・  AI列    ・・・  AQ列   AR列
7 名前  ・・・  2018/5/6  ・・・ 2018/7/1 2018/7/8
8  aaa  ・・・  
9 ccc  ・・・  
10 bbb  ...続きを読む

Aベストアンサー

何度もごめんなさい。

最初からコードをやり直してみました。

Sub Sample2()
 Dim i As Long, j As Long, cnt As Long
 Dim lastRow As Long, lastCol As Long
 Dim c As Range, r As Range, wS As Worksheet
  Set wS = Worksheets("元データ")
  With Worksheets("反映DATA")
   '//▼「反映DATA」シートの太字を解除//
    lastRow = .Cells(Rows.Count, "C").End(xlUp).Row
    lastCol = .Cells(7, Columns.Count).End(xlToLeft).Column
     Range(.Cells(8, "AI"), .Cells(lastRow, lastCol)).Font.Bold = False
   '//▲ここまで//
   For i = 2 To wS.Cells(Rows.Count, "A").End(xlUp).Row
    For j = 4 To wS.Cells(1, Columns.Count).End(xlToLeft).Column
     If wS.Cells(i, j) <> "" Then
      Set c = .Range("C:C").Find(what:=wS.Cells(i, "A"), LookIn:=xlValues, lookat:=xlWhole)
      Set r = .Rows(7).Find(what:=DateValue(Format(wS.Cells(1, j), "yyyy/m/d")), LookIn:=xlValues, lookat:=xlWhole)
       If Not c Is Nothing And Not r Is Nothing Then
        cnt = cnt + 1
        With .Cells(c.Row, r.Column)
         .Font.Bold = True
         .Value = wS.Cells(i, j)
        End With
       End If
     End If
    Next j
   Next i
    .Activate
  End With
   MsgBox cnt & "件(太字セル)を更新"
End Sub

これで何とかお望みの動きにならないでしょうか?m(_ _)m

何度もごめんなさい。

最初からコードをやり直してみました。

Sub Sample2()
 Dim i As Long, j As Long, cnt As Long
 Dim lastRow As Long, lastCol As Long
 Dim c As Range, r As Range, wS As Worksheet
  Set wS = Worksheets("元データ")
  With Worksheets("反映DATA")
   '//▼「反映DATA」シートの太字を解除//
    lastRow = .Cells(Rows.Count, "C").End(xlUp).Row
    lastCol = .Cells(7, Columns.Count).End(xlToLeft).Column
     Range(.Cells(8, "AI"), .Cells(lastRow...続きを読む

Qエクセルでの名前の定義について

エクセルで シート1の患者の単に名前が下にずらっと並んでいて、シート2にそれぞれの患者の情報が
横に列ごとの項目種類でならんでいた場合シート1の患者に名前の定義をし(例 S患者名)、シート2でも患者に名前を定義し(例 B患者名) それぞれお互いにクリックして見れるようにハイパーリンクをしたが、シート2でソートなどをした関係か、シート2からシート1はいいが、シート1からシート2はずれてリンクささってしまうが、どうしてか? ご教授ください。

Aベストアンサー

No.1です。

このやり方は名前の定義は不要です。手順に沿って行うだけでよいです。
A列には普通に名前を羅列します。(例 A2:Aさん、A3:Bさん、・・・)
B列には下記の手順にしたがって数式を入力します。
C列にはリンクしたい先の名前を記載します。(例 C2:Bさん、C3:Cさん、・・・)
こちらで試したときのデータの配置を添付しました。(そちらのデータの配置は把握しておりません)

No.2の回答で、うまくいかなかった理由は、数式のシート名の部分が『sheet』になっているためと思われます。そちらのファイルではシート名は『シート○○』ですよね?

ついでに、もう一点微修正しましたので、以下の手順と差し替えてください。
(数式を変えただけで手順は同じです)
最下部の※も参照ください。

◆手順
1.シート1のB2セルに『=HYPERLINK(CELL("address",INDEX(シート2!A:A,MATCH(C2,シート2!A:A,))),C2)』と入力して、下方向にコピペします。
2.シート1のC列にリンク先患者名(例:S患者名)を記入します。
3.シート2のB2セルに『=HYPERLINK(CELL("address",INDEX('シート1'!A:A,MATCH(C2,'シート1'!A:A,))),C2)』と入力して、下方向にコピペします。
4.シート2のC列にリンク先患者名(例:B患者名)を記入します。


シート名やセル参照はそちらのデータにあわせる必要があります。
リンク(C列)に指定した名前がもう一方のシートの名簿(A列)に存在しない場合、リンクがエラーになります。
あっているはずなのにリンクがエラーになるときは、F2キーを押してからEnterを試してください。

No.1です。

このやり方は名前の定義は不要です。手順に沿って行うだけでよいです。
A列には普通に名前を羅列します。(例 A2:Aさん、A3:Bさん、・・・)
B列には下記の手順にしたがって数式を入力します。
C列にはリンクしたい先の名前を記載します。(例 C2:Bさん、C3:Cさん、・・・)
こちらで試したときのデータの配置を添付しました。(そちらのデータの配置は把握しておりません)

No.2の回答で、うまくいかなかった理由は、数式のシート名の部分が『sheet』になっているためと思われます。そちらのファイ...続きを読む

Qtatsu99様 マクロについて

大分前にとてもお世話になりました。
tatsu99様に作って頂いたり教えて頂いたマクロは会社でとても活躍されています。感謝いたしております!
マクロを今も勉強中なのですが、前にtatsu99様に作って頂いたマクロで教えて頂きたいことがあり質問いたしました。

画像つきの私の質問で解答して下さったマクロに追加をしたいのですがどこに入れたらいいか・・・

1枚目は前も張りました。2枚目は月割りや日割りを計算して1枚目に反映させるためのデータシートなのですが、リース会社を「アクティオ」だけでなく「クボタ建機」と「コマツ」を増やしましたところ増やした会社のリース金額が反映されなくて作ってくださったマクロにどうか書き足せばよいかご教授ください(泣)

Aベストアンサー

文字数オーバーなので、こちらに登録しました。下記URLを参照ください。
https://ideone.com/mBEpAK
標準モジュールへ登録してください。

QC列に何か入力が合った場合B列に通し番号を

B   C
3 1 あいう
4 2 かいう
5 3 かいう

C列に何かの文字(英数字等)の入力が合った場合は
B列B3を基点とする通し番号を付けたいのですが
また、C列が空白の場合はBも空白にしたいです。

B列に入れる式を教えて下さい。

Aベストアンサー

No1です

No1の式は、C列が空白の場合はカウントせずに、表示される数値が(行が飛んでも)連番となるようにしていました。
一方で、常に固定の連番があるものとして、C列が空白の場合は単にその番号を表示しないだけという意味でしたら、B3セルに
 =IF(C3="","",ROW(C1))
となります。

Qエクセルの質問です りんご みかん 梨 ぶどう… りんご 0 3 1 4… みかん 3 0 4 4…

エクセルの質問です
りんご みかん 梨 ぶどう…
りんご 0 3 1 4…
みかん 3 0 4 4…
梨 2 4 0 3…
ぶどう 4 4 3 0…
︙ ︙ ︙ ︙ ︙
最大値 4 4 4 4…
組み①ぶどう①梨①みかん①りんご
合わ ②ぶどう ②みかん

こういう表を作っていて最大値が同じ数値がある場合、2こめ、3こめ…と表の下(組み合わせのところ)に出せるようにしたいのですがどうすればいいのかわかりません。
1つ目はINDEX関数などを使って出すことができたのですが2番目以降をどうしたらいいのか教えてください。

Aベストアンサー

こんにちは!

やりたいことと異なるかもしれませんが・・・
↓の画像の配置だとして、
B12セルに
=IFERROR(INDEX($A$2:$A$9,SMALL(IF(B$2:B$9=B$10,ROW($A$2:$A$9)-1),ROW(A1))),"")

配列数式なので、Ctrl+Shift+Enterで確定!(←必須★)し
フィルハンドルで列・行方向にコピーすると、画像のような感じになります。m(_ _)m

Q交差するセルの入力方法について

sheet1
A     B     C     D
日付   名前    事由
1    はさん   休み
4    いさん   早退

sheet2
A     B     C     D     E...    AF
日付    1      2     3      4...    31
いさん                    早退  
ろさん
はさん   休み

---------------------

シフト表を作成しており、提出された届出をsheet1に入力し、
sheet2に反映させるようにし、反映後にsheet1のD列に”済”と
入力できればと思っています。
また、次に入力した場合は”済”の次から反映できるように
できればと思っていますが、マクロの組み方が分かりません。

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

Aベストアンサー

No.2の回答者です。
>"失敗しました"と出てしまいます(><)

ふつうは、正しく設定している限りは、このエラーが出てくることはめったにないのですが、ただ、
最初に使おうとしたりするときにオブジェクトが収まっていないと、そのようなエラーが出るようです。こちらで新しくシートから作り直してみましたが、こちらも1回だけ不明なエラーが発生しました。
一応確認だけさせていただきます。
最初に、エラーの時の対処の仕方を書いておきます。
(1)
> Set sh1 = Worksheets("Sheet1")
> Set sh2 = Worksheets("Sheet2")  ←こちら側の名称は正しいですか?

(2)

25行目付近にある
j = .Cells(i, 1).Value
これは、確認のためで不要ですから、削除してください。

(3)
34行目付近にある、このコードですが、
' If Err() <> 0 Then
' MsgBox "失敗しました", vbExclamation
' Exit Sub
' End If

(文字の先頭に、シングルコーテーション「'」で、マクロを使わないようにする)
これは、予定していないエラーのためでしたが、なくても作動するはずでず。

次に、デバッグ・ツールの使い方を念のために書かせていただきます。
(解決すれば、使わなくても結構です)

以下の左端の枠をワンクリックして「●」をつけます。(通常茶色の丸)
●  If .Cells(i, dt + 1).Value = "" Then '日付が2列目を1日とした場合 dt +1【修正】
そして同じようにマクロを実行させます。
その部分に来るとマクロが止まります。、次に、F8 を押すと、ステップモードに切り替わりますので、1行ずつエラーがないのか探します。

それは、ローカルウィンドウを、画面下に出して、変数が正しく返っているか、0になったりしていないか、エラーが出たところを見つけるわけです。

●は、メニューのデバッグで、「すべてのブレークポイント削除」を選択していただけると早いです。

なお、マクロとワークブックはアドインというスタイルで、分離させることも可能です。

No.2の回答者です。
>"失敗しました"と出てしまいます(><)

ふつうは、正しく設定している限りは、このエラーが出てくることはめったにないのですが、ただ、
最初に使おうとしたりするときにオブジェクトが収まっていないと、そのようなエラーが出るようです。こちらで新しくシートから作り直してみましたが、こちらも1回だけ不明なエラーが発生しました。
一応確認だけさせていただきます。
最初に、エラーの時の対処の仕方を書いておきます。
(1)
> Set sh1 = Worksheets("Sheet1")
> Set sh2 = Worksheet...続きを読む

Q行番号から合計を求める方法を教えてください。

次の二つの式から求まる行番号間に存在する行のある列(例えばE列)の数値の合計を求める数式を教えてください。
  =CELL("AAA",A:A,0)
  =CELL("ZZZ",C:C,0)
よろしくお願いします。

Aベストアンサー

こんばんは!

対象行も含んで良いのですね。
E列のセルを合計するとします。

一例です。
表示したいセルに
=SUM(INDIRECT("E"&MATCH("AAA",A:A,0)&":"&"E"&MATCH("ZZZ",C:C,0)))

としてみてください。
※ エラー処理はしていません。m(_ _)m

QExcelのセル内文字の並び替えについて

Excelのセル内文字の並び替えについて質問があります。

セル内に名前のデータがカンマで区切られて入ってくるのですが、順番を変えたいのですが、どのような数式を使えばいいかご教示いただけませんか?

A1のデータをB1に変更できる数式はありますか?
A1=Last Name,First Name,Title 
B1=Title First Name Last Name

※A1ではLast Name First Name Titleの間にはカンマ(,)がありそれぞれの間にスペースはありません。
※B1では、可能であればそれぞれの間にスペースを入れたいです。

(例)
A1=Nihon,Hanako,Ms.
B1=Ms. Hanako Nihon

複数の処理するので、できれば数式をコピーしただけで出来るようにしたいのですが、どなたか教えてくださいませんか?

宜しくお願い致します。

Aベストアンサー

こんばんは!

手っ取り早くVBAでの一例です。
データはA列1行目からあるとします。

Sub Sample1()
 Dim i As Long, k As Long
 Dim myStr As String, myAry
  For i = 1 To Cells(Rows.Count, "A").End(xlUp).Row
   myAry = Split(Cells(i, "A"), ",")
    For k = UBound(myAry) To 0 Step -1
     myStr = myStr & myAry(k) & " "
    Next k
   Cells(i, "B") = myStr
   myStr = ""
 Next i
End Sub

※ 関数で出来るかどうか判りませんが、
考える気力がないのでVBAにしてみました。

どうしても関数でやりたい!という場合は、この質問限定の関数(ユーザー定義関数)を作成すれば
通常のワークシート関数と同じ使い方ができます。m(_ _)m

Q月末の自動計算

月末火曜日の日付をスタートとして稼働日数を求めたいと思っています。

10月なら9/25~10/30まで
11月なら10/30~11/27まで
12月なら11/27~12/25までの日数を計算したいです。

月末水曜日になると当月の日数に自動で計算が切り替わるよう計算することは可能でしょうか。

わかる方がいれば教えていただきたいです。
※土日は日数に含んでOKです。

Aベストアンサー

No1です

>先程試したところ8と表示されるのですが11/28~今日までが8日という計算でしょうか?
はい。下に示しますように『今日』を対象に計算する式として作成してしまいましたので、12/5(=本日)は11/27(=最終火曜日)から数えて8日目という意味になります。
(シートが自動計算の設定になっていれば、明日になると9と表示されるはずです)

私の勝手な勘違いだったかもしれませんが、「今日が月末火曜日から何日目かを計算する」関数式として考えていましたが、対象が「今日」とは限らなかったのでしょうか?
その場合は、式中の「TODAY()」の部分を対象の日(=シリアル値)に置き換えればそのまま同じ計算が可能なはずです。
例えば、対象の日がA1セルに入力されているとするなら、TODAY()を全てA1に置き換えればよいといった感じです。

>ただ、水曜日になったら前日の火曜日分も含めて計算してほしいです。
翌日の水曜日を2日目と計算したいという意味でしょうか?
(No1の説明を読んでいただければわかりますが)現在の式は、水曜日は1(日目)と表示される式になっています。
修正したい場合は、No1の式より常に1日多い値になれば良いだけなので、式の最後に「+1」を加えれば、お求めの結果になると思います。

>とても複雑な回答で解読できなかったので教えていただけると幸いです
式は少々長いですが、全体としての構成は、単純にIFで場合分けした式になっています。
ご参考までに、大雑把な構成を言葉で示すならば・・・
『対象日(今日)がその月の最終火曜日より前なら、前月の最終火曜日からの日数を数え、後ならその月の最終火曜日からの日数を数える』
という式になっています。

No1です

>先程試したところ8と表示されるのですが11/28~今日までが8日という計算でしょうか?
はい。下に示しますように『今日』を対象に計算する式として作成してしまいましたので、12/5(=本日)は11/27(=最終火曜日)から数えて8日目という意味になります。
(シートが自動計算の設定になっていれば、明日になると9と表示されるはずです)

私の勝手な勘違いだったかもしれませんが、「今日が月末火曜日から何日目かを計算する」関数式として考えていましたが、対象が「今日」とは限らなかったのでしょう...続きを読む

QエクセルのIF関数について教えてください

エクセル2007を使用しているのですが、IF関数について分からない事があるので分かる方アドバイスをお願いします。

A2には「お急ぎ便」「通常便」「日時指定便」のいづれかの文字が入力されています。
A3には「出荷予定日」  2018/12/1 など入力されています。
A4には「=A3+1」と入力して出荷予定日の翌日の日付が入力されるようにしています。 
     例えばA3が2018/12/1の場合には2018/12/2と表示されます。

私がやりたいことですが、A5のセルに下記の情報を入力したいです。

A2のセルに「お急ぎ便」という特定の文字が含まれている場合には、出荷予定日の翌日に到着させなければいけない為、A4の日付をA5セルに表示させるようにしたいです。

反対に「通常便」「日時指定便」の文字が含まれている場合には、A5セルに何も入力せずに「空白」にしたいです。

私も色々と試行錯誤しながら下記の関数がつかえそうだと考えてみましたが、この文字列はお急ぎ便という文字がはいっている場合は○を表示させて、入っていない場合は×と表示させるものですよね。

=IF(COUNTIF(A2,"*お急ぎ便*")=1,"○,"×")

上記の○の部分に、A4のセルで表示されている文字を表示させるようにしたいのですが、可能でしょうか?×の部分は単純に削除して空白にすればいいと思うので問題がないのですが、○の部分に=A3+1とかA4とか色々と入力しましたが、入力した内容がそのまま表示されてしまって、A4の日付をA5のセルに表示させるのはできないようです。

分かる方がいらっしゃったらアドバイス頂ければ助かります。どうぞよろしくお願いします。

エクセル2007を使用しているのですが、IF関数について分からない事があるので分かる方アドバイスをお願いします。

A2には「お急ぎ便」「通常便」「日時指定便」のいづれかの文字が入力されています。
A3には「出荷予定日」  2018/12/1 など入力されています。
A4には「=A3+1」と入力して出荷予定日の翌日の日付が入力されるようにしています。 
     例えばA3が2018/12/1の場合には2018/12/2と表示されます。

私がやりたいことですが、A5のセルに下記の情報を入力したいです。

...続きを読む

Aベストアンサー

>○の部分に=A3+1とかA4とか色々と入力しましたが、入力した内容がそのまま表示されてしまって

まずは、A5のセルの表示形式を日付にしましょう。

それから、A2には
>「お急ぎ便」「通常便」「日時指定便」のいづれかの文字が入力されています。
なので、部分一致にしなくても

A5=IF(A2="お急ぎ便",A4,"")

でよくないですか?それとも他に文字がプラスされることがあるのですか?


人気Q&Aランキング