2017-01-26 11 views
-1

は、だから私はこの問題を持っている検索:[VBA] [エクセル]は近くのセルのすべての出現と合計値

私はデータベースと私は私のメインのシート(シート1)で見つける必要があるレコードがあるに名前のシートを持っています次に、(左に)セルの番号を取り、それらを合計します。次に、検索するアイテムの直後にデータベースシートにドロップします。 (スクリーンショット参照)これは私のデータベースシートがどのように見えるかです:これは、データベースシートダウン内のすべてのレコードに対してループに必要

Database sheet

私は範囲をループしようとしましたが、範囲を知らずに値を見つける方法が決まっていませんでした。アルゴリズムの

enter image description here

だから、短い説明:

これは、データベースシートから番号をとり、その出現をすべて見つけるあなたは

これはシートが見えるようにする方法の主であるスクリーンショットの構造を見ることができますメインシートにすべての数字を合計し、最初に検索したレコードの横にセルを配置します。

ご意見はありますか?

私の母国語ではないことを私の英語のために許してください。 :)

+0

範囲を確認するにはどうすればよいですか?数式やマクロでも同じことができます。 –

+0

詳細を教えてください。私は式をSUMIFとSUMIFSのように見上げましたが、今のところそれらは私が必要とするものを達成することができません。 –

+0

**あなたはそれを見てどのように範囲を特定しますか?** –

答えて

0

を合計するには、あなたが探している値を識別する方法を私に明確ではありません使用しています。彼らがMAINシートのどこかにいる場合は、単純なSUMIFを使用することができます。

値の可能性がある範囲が、たとえばA1:Z1000以下であると仮定します。範囲全体を検索し、隣接する列に一致するデータを返します。だから、あなたのsearch_termA1にある場合:列の一部では混乱のエントリがあるかもしれない

B1: =SUMIF(MAIN!$A$1:$Z$1000,A1,MAIN!$B$1:$ZZ$1000) 

場合は、あなたが検索する列を決定する方法として、より具体的にする必要があります。

EDIT最新のスクリーンショットを確認した後、次のいずれかの式をお勧めします。

列ヘッダには違いはありません、と

  • データベースシートはDetaleコードがA1に開始し、そのすべての行を包含するように変更1000年以下の式では、列
  • を下に拡張されている場合今では空白になっていても使用する可能性があります。sum_rangeと同じサイズですが、あなただけの行40でDetaleを持って列にこれらのコードを探して制限しなければならない場合criteria ranges

    B1: =SUMIF(Presu_planas!$A$40:$Z$1000,A1,Presu_planas!$B$40:$AA$1000) 
    

から1列オフセットがは

  • 注意、その後、次のことを試してください。

    B1: =SUM((Presu_planas!$A$40:$Z$40="Detale")*(Presu_planas!$A$40:$Z$1000=A1)*IFERROR(--Presu_planas!$B$40:$AA$1000,0)) 
    

    この式は、配列が入力したでなければなりません


    に、セルまたは数式バーに 式を入力した後、式アレイ入力 CTRL +打撃を入力しながらをShiftキーを押し。これを に正しく指定した場合は、Excelの中括弧{...}の数式を囲みます。

  • +0

    いいえ、私が検索する必要がある値はデータベースシートにあり、検索して要約する必要があるレコードはメインシートにあります...そして、これらのレコードはこの画像のように文書全体になります http:// prntscr .com/e0lusy –

    +0

    @CunamiRokasデータベースシートに提案した数式を入力すると、メインシートを検索します。必要なものだけセルとシートの参照を調整してください。 –

    +0

    あなたの範囲がすべてを網羅していることを確認してください。 –

    0

    次のFindAll関数を使用して、メインワークシートの関連する値を見つけることができます。そこから

    はRange.Offset(0、1).Valueのは、値にアクセスし、それらに

    Function FindAll(What, _ 
        Optional SearchWhat As Variant, _ 
        Optional LookIn, _ 
        Optional LookAt, _ 
        Optional SearchOrder, _ 
        Optional SearchDirection As XlSearchDirection = xlNext, _ 
        Optional MatchCase As Boolean = False, _ 
        Optional MatchByte, _ 
        Optional SearchFormat) As Range 
    
        'LookIn can be xlValues or xlFormulas, _ 
        LookAt can be xlWhole or xlPart, _ 
        SearchOrder can be xlByRows or xlByColumns, _ 
        SearchDirection can be xlNext, xlPrevious, _ 
        MatchCase, MatchByte, and SearchFormat can be True or False. _ 
        Before using SearchFormat = True, specify the appropriate settings for the Application.FindFormat _ 
        object; e.g. Application.FindFormat.NumberFormat = "General;-General;""-""" 
    
        Dim SrcRange As Range 
        If IsMissing(SearchWhat) Then 
         Set SrcRange = ActiveSheet.UsedRange 
        ElseIf TypeOf SearchWhat Is Range Then 
         Set SrcRange = IIf(SearchWhat.Cells.Count = 1, SearchWhat.Parent.UsedRange, SearchWhat) 
        ElseIf TypeOf SearchWhat Is Worksheet Then 
         Set SrcRange = SearchWhat.UsedRange 
        Else: SrcRange = ActiveSheet.UsedRange 
        End If 
        If SrcRange Is Nothing Then Exit Function 
    
        'get the first matching cell in the range first 
        With SrcRange.Areas(SrcRange.Areas.Count) 
         Dim FirstCell As Range: Set FirstCell = .Cells(.Cells.Count) 
        End With 
    
        Dim CurrRange As Range: Set CurrRange = SrcRange.Find(What:=What, After:=FirstCell, LookIn:=LookIn, LookAt:=LookAt, _ 
         SearchDirection:=SearchDirection, MatchCase:=MatchCase, MatchByte:=MatchByte, SearchFormat:=SearchFormat) 
    
        If Not CurrRange Is Nothing Then 
         Set FindAll = CurrRange 
         Do 
          Set CurrRange = SrcRange.Find(What:=What, After:=CurrRange, LookIn:=LookIn, LookAt:=LookAt, _ 
          SearchDirection:=SearchDirection, MatchCase:=MatchCase, MatchByte:=MatchByte, SearchFormat:=SearchFormat) 
          If CurrRange Is Nothing Then Exit Do 
          If Application.Intersect(FindAll, CurrRange) Is Nothing Then 
           Set FindAll = Application.Union(FindAll, CurrRange) 
          Else: Exit Do 
          End If 
         Loop 
        End If 
    End Function 
    
    関連する問題