J'ai construit une fonction pour déterminer la première ligne dans laquelle les données existent. Lorsque j'appelle les données, j'obtiens une erreur indiquant l'objet requis. Comment contourner cette erreur et est-ce le meilleur moyen d'atteindre mon objectif? TYIA!
Function startrow(firstroww)
Dim strRow As String
Dim firstrow As Range
Range("ab1").Select
strRow = Selection.Value
If strRow <> "" Then
firstroww = 1
Else
Range("ab1").Activate
Selection.End(xlDown).Select
firstroww = ActiveCell.Row()
End If
End Function
Sub rename()
Dim strOldType As String
Dim correctrow As Long
Dim a As Range
Set a = startrow(correctrow)
Range("s" & a).Select
strOldType = Selection.Value
End Sub
4 Réponses :
Vous pouvez essayer une fonction comme celle-ci. Vous devrez passer une plage dans la fonction comme indiqué ci-dessous dans Sub Test () .
La fonction personnalisée peut trouver la première cellule utilisée ci-dessous à partir de n'importe quel point de départ.
Sub Test()
MsgBox FR(Range("A1"))
End Sub
Option Explicit
Function FR(Start As Range) As Long
Select Case Start
Case <> ""
FR = Start.Row
Case Else
FR = Start.End(xlDown).Row
End Select
End Function
Merci pour l'exemple simple. Le problème que j'ai, c'est au cas où le premier enregistrement se trouverait sur la première ligne.
Je n'ai pas pu le faire fonctionner mais quand j'ai changé votre première déclaration de cas de Case "*" à Case est <> "" cela a fonctionné! Merci beaucoup pour votre aide!
Set pour attribuer un objet de plage. N'utilisez pas Set pour attribuer un numéro à une variable. Code corrigé:
Sub rename()
Dim strOldType As String
Dim correctrow As Long
Dim a As LONG '<~~ correction
correctrow = 1 '<~~ correction
a = startrow(correctrow) '<~~ correction
strOldType = Range("s" & a).Value
End Sub
Function startrow(firstroww)
if Range("ab" & firstrow) <> "" then '<~~ correction
startrow = firstrow
else
startrow = Range("ab" & firstrow).end(xldown).row
end if
End Function
Je tamise d'abord la fonction, mais j'ai ensuite continué à obtenir l'erreur "Method Range of object '_Gobal failed". J'apprécie d'essayer de m'aider à comprendre ce que j'ai fait de mal avec mon code existant. Cela m'aide à apprendre
On suppose que vous recherchez une fonction VBA à utiliser dans Excel pour calculer la première ligne non vide d'une colonne (spécifiée par une plage).
Fonctionnalités
Volatile marque une fonction définie par l'utilisateur comme volatile. UNE
la fonction volatile doit être recalculée chaque fois que le calcul se produit dans
toutes les cellules de la feuille de calcul. Une fonction non volatile est recalculée
uniquement lorsque les variables d'entrée changent (Aide VBA). IsEmpty
au lieu de "" pour la raison, par exemple si la cellule de la ligne résultante
contient une formule qui donne la valeur "", elle sera ignorée. SelectRange
Colonne. Dans certains cas, la version Fin n'afficherait pas le bon
résultat ou créez une référence circulaire. Par conséquent, ThisCell est utilisé
dans la version End et 0 est renvoyé si aucune valeur n'a été trouvée dans la colonne SelectRange . =FirstRowEnd(AB1) =FirstRowEnd(AB20) =FirstRowEnd(AB17:AH234)
Méthode de recherche
Au lieu de
Function FirstRowEnd(SelectRange As Range) As Long
Application.Volatile
Dim FirstCell As Range
If Application.ThisCell.Column = SelectRange.Column Then Exit Function
If Not IsEmpty(SelectRange.Cells(1)) Then
FirstRowEnd = 1
Else
Set FirstCell = Cells(1, SelectRange.Column).End(xlDown)
FirstRowEnd = FirstCell.Row
If FirstRowEnd = Rows.Count And IsEmpty(FirstCell) Then
FirstRowEnd = 0
End If
End If
End Function
vous pouvez utiliser
=FirstRowFind(AB1) =FirstRowFind(AB20) =FirstRowFind(AB17:AH234)
ou
Set FirstCell = .Find(What:="*", After:=.Cells(.Cells.Count), _
LookIn:=xlFormulas, LookAt:=xlWhole, _
SearchOrder:=xlByColumns, SearchDirection:=xlNext)
Les paramètres pour les arguments LookAt (sans importance dans ce cas) et SearchDirection (la valeur par défaut est Next ) peuvent être omis, mais comme je n'ai pas trouvé de différence d'efficacité, je n'ai pas 't.
Utilisation dans Excel
Pour la colonne AB:
Set FirstCell = .Find("*", .Cells(.Cells.Count), _
xlFormulas, xlWhole, xlByColumns, xlNext)
Set FirstCell = .Find("*", .Cells(.Cells.Count), -4123, 1, 2, 1)
Utilisation dans Excel
Pour la colonne AB code >:
Function FirstRowFind(SelectRange As Range) As Long
Application.Volatile
Dim FirstCell As Range
With Columns(SelectRange.Column)
Set FirstCell = .Find("*", .Cells(.Cells.Count), -4123, 1, 2, 1)
End With
If Not FirstCell Is Nothing Then
FirstRowFind = FirstCell.Row
End If
End Function
Vous pouvez utiliser ceci:
ActiveSheet.UsedRange.Row ActiveSheet.UsedRange.Column
L'objet UsedRange est le plus grand rectangle couvrant toutes les cellules non vides.
Cela ne fonctionne pas car j'ai généralement une sorte d'en-tête non pertinente pour mon ensemble de données à quelques lignes au-dessus de l'ensemble de données.
Eh bien, dans ce cas, seule la méthode End est utile. Si votre structure de données est cohérente, les choses seraient beaucoup plus faciles.
Bienvenue. Veuillez afficher le message d'erreur réel et la ligne de code à l'origine. Avez-vous lu VBA identifie les première et dernière lignes contenant des données ou tout autre article traitant de la recherche de la première ligne avec du contenu. On s'attend à ce que vous fassiez vos propres recherches, et si ces autres messages ne s'appliquent pas à votre situation, alors au moins "... gardez une trace de ce que vous trouvez. Même si vous ne trouvez pas de réponse utile ailleurs sur le site , y compris des liens vers des questions connexes qui n'ont pas aidé peut aider les autres à comprendre en quoi votre question est différente des autres. "
Copie possible de VBA identifie les premières et dernières lignes avec des données
Vous n'avez pas attribué de valeur à
correctrow, mais vous l'utilisez pour définir une plage. Ensuite, vous utilisez une plage dans une chaîne pour une adresse de cellule. Quoi??? Vous devez savoir quels types de données vous utilisez dans quel contexte.utilisez WorksheetFunction.CountA (), comme illustré ci-dessous:
Dim row As Range Dim sheet As Worksheet Set sheet = ActiveSheet For i = 1 To sheet.UsedRange.Rows.Count Set row = sheet.Rows (i) If WorksheetFunction. CountA (row) = 0 Then MsgBox "row" & i & "is empty" End If Next iVous pouvez l'adopter pour définir la plage ou pour définir la valeur de retour de la fonction. Évitez d'utiliserSelect.@skkakkar pourquoi ne pas ajouter cela comme solution au lieu d'un commentaire? Ensuite, vous pouvez réellement le lire
@urdearboy Je ne sais pas si OP veut une fonction ou un sous-marin. Son approche semble déroutante. Il commence avec Sub ets avec End Function. Un autre code suggéré par moi est approprié pour Sub, mais pour le rendre fonctionnel, il devra peut-être être peaufiné, ce que je ne pourrai peut-être pas faire davantage pour le moment.
Si vous regardez de plus près, il y a en effet un sous complet et une fonction. Je vais éditer sa question et les séparer en conséquence afin que ce soit clair @skkakkar
Merci Tedinoz et skkakkar pour la contribution! Cela m'a permis d'aller dans la bonne direction. teylyn c'est la première fois que j'utilise vba et je n'ai aucune formation formelle. Je suis sûr que je commets une sorte de blasphème alors je m'excuse