2017-06-15 5 views
0

複数のExcelワークブックを1つにコンパイルしてデータをプロットするプログラムで作業しています。私が実行した1つの問題は、実際のデータより前の行が変化し、コードが開始点をそれ自身で見つけることができるようにすることです。その上で、その行から始まり、データが終了するまでスプレッドシートの下まですべての範囲を継続する範囲を使用したいと思います。あなたの例ではVBA Excel:5つ以上の列が使用されている行を検索

Private Sub runHPO_Click() 
Dim FolderPath As String 
Dim FileName As String 
Dim WorkBk As Workbook 
Dim SourceRange As range 
Dim DestRange As range 
Dim DataSheet As Worksheet 
Dim cht As Chart 

Application.ScreenUpdating = False 

'Test specific section - directory, chart title 
FolderPath = "I:\SHARED\Marshall Test Compiler\Performance Tests\3.2.1.7 HPO\" 
FileName = Dir(FolderPath & "*.*") 
ThisWorkbook.Charts.Add.Name = "HPO" 
Set cht = ActiveChart 
With cht 
    .ChartType = xlXYScatterLinesNoMarkers 
    .HasTitle = True 
    .ChartTitle.Text = "3.2.1.7 Hot Pump Out" 
    .Axes(xlCategory).HasTitle = True 
    .Axes(xlCategory).AxisTitle.Text = "Time [min:sec]" 
    .Axes(xlValue, xlPrimary).HasTitle = True 
    .Axes(xlValue, xlPrimary).AxisTitle.Text = "Fan Speed [rpm]" 
End With 

Do While FileName <> "" 
    ThisWorkbook.Sheets.Add(After:=Sheets(Sheets.Count)).Name = FileName 
    Set DataSheet = ActiveSheet 
    Set WorkBk = Workbooks.Open(FolderPath & FileName) 
    Set SourceRange = WorkBk.Worksheets(1).range("A1:Z2045") 
    Set DestRange = DataSheet.range("A1:Z2045") 
    DestRange.Value = SourceRange.Value 

    'Change legend name to serial number 
    Dim LName As String 
    LName = DataSheet.range("A14").Characters(8, 9).Text 

    'Add plotting 
    Dim profTime As range 
    Dim profInSpeed As range 
    Dim profSpDemand As range 
    Dim profLoLimit 
    Dim xrange As range 
    Dim fsrange As range 
    Dim pwmrange As range 
    Dim btrange As range 
    Dim sdrange As range 

    Set profTime = ThisWorkbook.Worksheets("Profiles").range("H4:H13") 
    Set profInSpeed = ThisWorkbook.Worksheets("Profiles").range("I4:I13") 
    Set profSpDemand = ThisWorkbook.Worksheets("Profiles").range("J4:J13") 
    Set profUpLimit = ThisWorkbook.Worksheets("Profiles").range("K4:K13") 
    Set xrange = DataSheet.range("A797:A2045") 
    Set fsrange = DataSheet.range("D797:D2045") 
    Set pwmrange = DataSheet.range("J797:J2045") 
    Set btrange = DataSheet.range("F797:F2045") 
    Set sdrange = DataSheet.range("K797:K2045") 

    xrange.NumberFormat = "mm:ss" 
    profTime.NumberFormat = "mm:ss" 

    'Profile 
    With cht.SeriesCollection.NewSeries 
     .Name = "Input Speed" 
     .AxisGroup = xlPrimary 
     .Values = profInSpeed 
     .XValues = profTime 
    End With 
    With cht.SeriesCollection.NewSeries 
     .Name = "Speed Demand" 
     .AxisGroup = xlPrimary 
     .Values = profSpDemand 
     .XValues = profTime 
    End With 
    With cht.SeriesCollection.NewSeries 
     .Name = "Fan Speed Upper Limit" 
     .AxisGroup = xlPrimary 
     .Values = profUpLimit 
     .XValues = profTime 
    End With 

    'Fan Speed 
    With cht.SeriesCollection.NewSeries 
     .Name = LName & " Fan Speed" 
     .AxisGroup = xlPrimary 
     .Values = fsrange 
     .XValues = xrange 
    End With 

    'PWM 
    With cht.SeriesCollection.NewSeries 
     .Name = LName & " PWM" 
     .AxisGroup = xlSecondary 
     .Values = pwmrange 
     .XValues = xrange 
    End With 

    'Box Temp 
    With cht.SeriesCollection.NewSeries 
     .Name = LName & " Box Temp" 
     .AxisGroup = xlSecondary 
     .Values = btrange 
     .XValues = xrange 
    End With 

    'Speed Demand 
    With cht.SeriesCollection.NewSeries 
     .Name = LName & " Speed Demand" 
     .AxisGroup = xlSecondary 
     .Values = sdrange 
     .XValues = xrange 
    End With 

    WorkBk.Close savechanges:=False 
    FileName = Dir() 
Loop 

With cht 
    .HasAxis(xlValue, xlSecondary) = True 
    .Axes(xlValue, xlSecondary).HasTitle = True 
    .Axes(xlValue, xlSecondary).AxisTitle.Select 
    .Axes(xlValue, xlSecondary).AxisTitle.Text = "PWM [%]/Box Temp [degC]" 
    .Axes(xlValue, xlPrimary).MaximumScale = 2400 
    .Axes(xlValue, xlSecondary).MaximumScale = 120 
    .Axes(xlValue, xlSecondary).MinimumScale = -800 
    .SeriesCollection(1).Delete 
End With 
ThisWorkbook.Worksheets("Compiler").Select 
Application.ScreenUpdating = True 
End Sub 
+0

ようこそ!一般的に、あなたの質問を「どうすればよいか」に関するより小さな離散質問に分割することは、私のような人があなたを助けるほうがはるかに簡単です。 「コードは、出発点をそれ自身で見つけることができるようにしたい。 ---この問題について話しましょう。 '' 'xlUp'''と' 'xlDown'''について聞いたことがありますか? '' 'Cells(i、j)' ''を使うのはどうですか? Googleの人々とそれが助けるかもしれない場所を参照してください! –

+0

ありがとう、私はそれを念頭に置いておきます!私はかなりのグーグルを行い、 '.find'をはじめとするいくつかのバリエーションを試しましたが、動作させることができませんでした。私は使用した正確なコードは 'rowStart = DataSheet.Columns(" K ")であったと考えていますFind(what:=" * "、After:= Cells(" K1 ")、LookIn:= xlValues、SearchDirection:= xlNext) 'fRow = rowStart.row'となります。 –

答えて

0

、あなたのデータは左端のヘッダ情報の多くによって妨害されています

Data File Exampleはここで、これまでに私のコードです。このような場合は常にある場合は、その前にデータを持っていることはありません列を選択して使用して最初の行を見つけることができます:

FirstRow = Sheets("Your Sheet Name").Cells(1, 20).end(xlDown).Row

(これは、列20は、すべてのヘッダデータの明確であることを前提としてい)。あなたは使って連続したデータの最後の行を見つけることができます。

LastRow = Sheets("Your Sheet Name").Cells(FirstRow, 20).end(xlDown).Row

最後の列:

LastColumn = Sheets("Your Sheet Name").Cells(FirstRow, Columns.Count).end(xltoLeft).Column

それは遮るもののない列がある場合ではない場合、私はあなたをお勧めします一意の番号またはアルファ形式を検索するには、.Find関数を使用します。

+0

ありがとう、ダレル!それは素晴らしい作品です! –

関連する問題