searchz la valeur maximale dans la colonne, select les valeurs correspondantes, copyz et collez les valeurs

Suite à la description de mon problème: j'ai une table de variante de longueur de colonne. Je veux searchr dans la colonne 4 pour la valeur minimale puis copyr la ligne avec la valeur minimale à la rangée 6

C'est mon code:

Sub TestMax() Dim searchArea As Range Dim searchResult As Range Dim rowMax As Long Dim maxValue As Long Dim columnSearch As Integer Dim lastRow As Long columnSearch = 4 'Select all the cells in the column you want to search down to the first empty cell. lastRow = Sheets("V&A 16").Range("B1048576").End(xlUp).Row Range(Cells(8, 4), Cells(lastRow, 4)).Select Set searchArea = Range(Cells(8, 4), Cells(lastRow, 4)) 'Determine the max value in the column. maxValue = Application.Max(searchArea) 'Find the row that contains the max value. Set searchResult = Sheets("V&A 16").Columns(columnSearch).Find(What:=maxValue, _ After:=Sheets("V&A 16").Cells(8, columnSearch), LookIn:=xlValues, LookAt:=xlWhole, _ SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False, _ SearchFormat:=False) 'Store the row that contains the minimum value in a variable. rowMax = searchResult.Cells.Row searchResult.Select Range(Cells(rowMax, 3), Cells(rowMax, 13)).Select Selection.Copy Range("C6").Select ActiveSheet.Paste Link:=True End Sub 

Pour une raison quelconque, je constate une erreur. Le même code exact avec Application.Min au lieu de max fonctionne cependant. Une aide à ce sujet? Merci d'avance!!

Bien qu'une solution appropriée puisse refaire la majeure partie du code et que l'on puisse discuter de noms de variables et de valeurs fixes dans votre code, je pense que cela ne vous aidera pas dans une démarche étape par étape.

Donc, pour commencer, je suggérerais ce qui suit (si vous êtes nouveau dans VBA):

D'abord, je changerais

 maxValue = Application.Max(searchArea) 

pour ça

 maxValue = Application.WorksheetFunction.Max(searchArea) 

et ensuite get le rowMax avec

 rowMax = Application.WorksheetFunction.Match(maxValue, searchArea, 0) 

(vous pourriez être sûr de l'avoir)

Remarques:

  • cela ne fonctionnera que s'il n'y a que des valeurs distinctes dans la colonne 4 (votre zone de search). sinon les choses pourraient être un peu plus compliquées, ce qui peut être totalement interrompu en sortingant d'abord datatables
  • rowmax renverra dans ce cas la cible à l'intérieur de votre rang de search.
  • puisque "searchrange" commence par un correctif 8, vous pouvez faire "rowmax = awf.match + 8" … c'est-à-dire si vous avez choisi de NE PAS travailler avec la gamme searchArea après

EDIT: essayez ceci. Comme je l'ai dit, alors que l'approche est sans doute un peu horrible, je reconnais que, du sharepoint vue de l'apprentissage, il est préférable de garder ce que vous avez fait jusqu'ici et de le modifier uniquement pour «fonctionner d'une manière ou d'une autre». J'espère que cela pourra aider!

 Sub TestMax() Dim searchArea As Range Dim rowMax As Long Dim maxValue As Long Dim lastRow As Long columnSearch = 4 'get the lastrow lastRow = Sheets("V&A 16").Range("B1048576").End(xlUp).Row 'set the search area Set searchArea = Range(Cells(8, columnSearch), Cells(lastRow, columnSearch)) 'Find the row that contains the max value inside the search area rowMax = Application.WorksheetFunction.Match( _ Application.WorksheetFunction.Max(searchArea), searchArea, 0) 'clumsily copy+paste (alternative: set values instead of copying) 'searchArea.Cells(rowMax, columnSearch).EntireRow.Copy 'Cells(6, columnSearch).EntireRow.Select 'ActiveSheet.Paste ' Alternative: ActiveSheet.Rows(6).Cells().Value = searchArea.Rows(rowMax).EntireRow.Cells.Value End Sub 

Vous pouvez parcourir la colonne 4 pour find la ligne correspondant à la plus petite valeur et copyr cette ligne dans la ligne n ° 6

(exemple: count tenu de 10 000 lignes de données à vérifier)

 Sub Foo() smallest = Cells(1, 4).Value i = 1 For i = 2 To 10000 If Cells(i, 4).Value < smallest And Cells(i, 4).Value <> "" Then smallest = Cells(i, 4).Value Row = i End If Next i Rows(Row & ":" & Row).Select Selection.Copy Rows("6:6").Select ActiveSheet.Paste End Sub