2016-09-23 8 views
0

私は列の数値から範囲を作成し、範囲を作成しようとしています。例えば、日付範囲のUDFまたは標準IF関数?

column F: 
1899 
1912 
1915 
1918 
1929 
1934 
1935 
1936 
... 

ので、すぐに1934年、1935年、1936年などのシーケンスが開始されると、それは1934年をキャプチャなり、その差はこの例の結果は次のようになりません。1.

になるまで反復処理:

1934 - 1936. 

これらの日付範囲を作成したら、「 - 」区切り記号で列にテキストを使用して、開始日と終了日の列を作成します。

この難点は、別の列を比較し、日付が特定のタイトルに基づいていることを確認することです。

So:IF(タイトル1 =タイトル2、(IF日付2 - 日付1 = 1、確認日付3 - 日付2 = 1、そうでない場合は日付1))。

私は多くのIF文を入れ子にしようとすることもできますが、それは厄介なことになりますし、タイトルごとに比較する日数もわかりません。

VBAでサブまたはUDFを作成すると反復がはるかに簡単になるようですが、ここで(または他の場所で)参考になる例は見つかりませんでした。

+1

に文字列を変更することからExcelを防ぐために、出力を変更しますが、[エクセル-式]でこれを行うことができますが、あなたは持っています1日のシーケンシングが停止して再び起動すると問題が発生する。おそらく、UDfとして、1日分のどのグループを使用するかを指示するオプションのパラメータを持つ方が良いでしょう。 – Jeeped

+0

すでに「_列内の数値から範囲を作成」_できますか?さらに、私は_ "他の列を比較する" _事を得ることができません:例を追加してもよろしいですか? – user3598756

+0

* VBAでサブまたはUDFを作成していますが、ここでは例が見つかりませんでした。*この時点でできることは* *を作成してください。私たちはあなたが遭遇している問題やエラーを知っています。通常、個々の問題に対する既成の解決法はありません。それは、あなたの特定の問題を解決するために、組み込み関数とオブジェクトモデルを変更/適用し、それを活用することです。 –

答えて

1

であれば、それは列Fのセルを取り、あなたの出力を印刷します列Gにある。年の範囲(例:1934-1935-1936)がある場合、それを文字列として単一のセルに入れます。

Sub range_dates() 
Dim cel As Range 
Dim iRow As Long, n As Long 
Dim title As String, nextTitle As String 
iRow = 2 
n = 0 
For i = 2 To 15 
    Set cel = Cells(i, "F") 
    title = Cells(i, "E").Value 
    nextTitle = Cells(i + 1, "E").Value 
    diff = Cells(i + 1, "F").Value - cel.Value 

    If diff = 1 And title = nextTitle Then 
     firstDate = cel.Value - n 
     n = n + 1 
    Else 
     Cells(iRow, "H").Value = cel.Value 
     Cells(iRow, "G").Value = title 
     If n > 0 Then 
      Cells(iRow, "H") = "'" & firstDate & " - " & cel.Value 
      n = 0 
     End If 
     iRow = iRow + 1 
    End If 
Next 
End Sub 

このコードは最適化されていませんが、今のところ共有しなければならないことがわかります。それを改善すること自由に感じ:)

編集:私は、タイトルの条件を追加し、日付形式

+0

これは私が必要なものです。私は誰もが提供してくれたすべてのものを通して働いていますが、これは私が探しているものの中で最も近い表現であるようです。あなたが持っているものに追加しようとしている唯一の追加は、次のようなものです:もしdiff = 1 "そしてCell D1 = D2 ... D2 = D3 ..." –

+0

私はあなたのタイトルの事を理解したと思う..編集を参照してくださいあなたは同じタイトル(列E)を持っているかどうかを確認し、タイトルと年の出力を印刷します – Oligg

+0

これは絶対に完璧に働いた。 –

1

AGGREGATE functionでは、1日シーケンスの最初のグループの開始と停止の取得がそれほど難しくありません。 H2には:あなたは、それらを組み合わせた最初の式と第二式H2へのすべての参照を置き換えたい場合

'in H2 
=INDEX(F$2:F$15,AGGREGATE(15,6,ROW($1:$14)/((F$3:F$16-$F$2:$F$15)=1), 1))  
'in I2 
=INDEX(INDEX(F:F, MATCH(H2,F:F, 0)):F$15,AGGREGATE(15,6,ROW($1:$14)/((INDEX(F:F, MATCH(H2,F:F, 0)+1):F$16-INDEX(F:F, MATCH(H2,F:F, 0)):$F$15)<>1), 1)) 

first_group_one_day

標準式としてI2、。

1

最初の問題のようあなたが(コメント)これを試しても、私はまだ「別の列を比較する」事に

を得ることはありませんが、私は「範囲」あなたは日付を取得する方法が必要に理解コード:

あなたはいくつかの列に勃発式を有する気にしない場合は
Option Explicit 

Sub main() 
    Dim fictitiousRng As Range, area As Range 
    Dim arr As Variant 
    Dim iCell As Long 

    With Worksheets("numbers") '<--| reference your worksheet (change "numbers" to your actual worksheet name) 
     With Intersect(.UsedRange, .Columns("F")).SpecialCells(xlCellTypeConstants, xlNumbers) '<-- reference its column "F" non blank cells with numeric data only 
      With .Offset(, .Parent.UsedRange.Columns.Count) '<--| reference referenced range offsetted 1 colum to the right 
       .FormulaR1C1 = "=""A"" & RC6" '<--| fill its content with a "fictitiuous" range address by placing an "A" in front of corresponding number in column "F" 
       Set fictitiousRng = Range("B1") ' set a initial range for 'fictitiousRng' not to bother for subsequent first call of 'Union()' method 
       For Each area In .Areas '<--| loop through referenced range areas (i.e. cells "groups") 
        For iCell = 2 To area.Cells.Count '<--| loop through current area cells 
         Set fictitiousRng = Union(fictitiousRng, Range(area.Cells(iCell, 1).value)) '<--| update 'fictitiousRng' with the cell corresponding to the current fictitious range address 
        Next iCell 
       Next area 
       arr = Split(Replace(Replace(Intersect(fictitiousRng, Columns(1)).Address(False, False), "A", ""), ":", " - "), ",") '<--| get the fictitious range address, remove "A"s and substitute "." with "-" and then write final "numbers" into an array 
       .ClearContents '<-- clear referenced range, i.e. cells with fictitious addresses 
       .Cells(1, 1).Resize(UBound(arr) + 1).value = Application.Transpose(arr) '<--| write array content into referenced range cells starting from its first cell 
      End With 
     End With 
    End With 
End Sub 

それは同じ列「F」の日付の最初の使用されていない欄に「範囲」の日付を書き込みますが

1

をワークシート、ここですエレガントnested IF() - - 列C

年の違いを探す

Find the beginning and ending year range - Excel formula example

=IF(B13>1,"",IF(B14<2,IF(C12="",A13,C12),IF(ISNUMBER(C12),C12&"-"&A14,A13&"-"&A14)))

説明

列B:&エンド年開始を抽出する方法について文の例式;)

列D - Left() 4文字の長さが> 4

E列である場合 - Right() 4文字の長さは、これが仕事をする> 4