Реализовывать пройденное расстояние колонны и вводить число N линий, найдя значение

Пример ввождения линий, найдя значение, в образе выделяет пример, найдя.

Найдя келью со специфическим значением было введено число N линий наверху кельи, которая содержит значение, Вы это реализовывали следующего способа, но Вы не вводите меня

Sub CargaMigra()

Dim fila As Integer

    fila = 1

    Do While Cells(fila, 1) = ""


        If Cells(fila, 5) = "4.000.000.0000" Then


            Rows.EntireRow.Insert


        End If

        fila = fila + 1

    Loop

End Sub
0
задан 08.11.2019, 11:47
1 ответ

Ты cГіdigo с моими комментариями:

 Sub CargaMigra()
    Dim fila As Integer
    'IMPORTANTE: Los integer (numeros enteros) en VBA solo almacenan numeros
    'en el rango de –32,768 a 32,767, por tanto si tienes filas superiores a
    '32,767 arrojará un error, por lo cual recomiendo usar LONG
    fila = 1
    Do While Cells(fila, 1) = ""
    'La linea dice esto:
    'Has un bucle (loop) mientras (while) la celda de la fila tal y la columna 1
    'no tengan ningún valor dentro, ningún texto, nada!
    'Por tanto, según dices que debe encontrar algún valor, pues no va a correr
    'si encuentra algo.
        If Cells(fila, 5) = "4.000.000.0000" Then
        'Segun tu código no llegaría acá, pero el IF revisar si la fila tiene
        'el siguiente texto "4.000.000.0000", no un numero, sino un texto
        'si quieres el numero 4000000 debes quitar los puntos y las comillas
        'así mismo debes hacer la prueba con el valor de la celda, no con la celda
        'Cells(fila, 5).value = 4000000 o en su defecto Cells(fila, 5).Value = "4.000.000.0000"
            Rows.EntireRow.Insert
            'y aquí insertas solo una celda... nada mas!
        End If
        fila = fila + 1
    Loop
End Sub

Сейчас я cГіdigo с моими комментариями:

 Sub CargaMigra2()
    Dim fila As Long: fila = 1 'Así defines e inicializas la variable en una sola linea,
                               'con el tipo de variable long que tiene un rango de datos
                               'de –2,147,483,648 a 2,147,486,647. Mucho mejor

    'cuando quieres agregar filas, lo mejor es ir desde la última fila hacia la primera,
    'por tanto, imaginando que tus datos están el la columna C (colo como ejemplo)

    fila = Range(Cells(1048576, 3), Cells(1048576, 3)).End(xlUp).Row 'aquí se cual es la última linea

    Dim i
    Dim j
    Dim valorBuscado 'as Strig | as integer | as long | as boolean lo que nececites, y si no pones nada,
                     'es tipo Variant, es decir se asigna el tipo de dato según el dato que se guarde
                     'en la variable
    valorBuscado = 1
    Dim cantidadDeFilas As Integer: cantidadDeFilas = 10 'no se de donde asignas este valor
                                                         'o si siempre será el mismo, pero debes
                                                         'de definirlo en algún momento de alguna manera,
                                                         'pero tu ejemplo no define eso, acá puse 10 solo
                                                         'para hacer el ejemplo claro

    For i = fila To 1 Step -1 'imaginando que la hay que revisar hasta la fila uno, por eso ponemos el 1
                              'y Step -1 es para que el loop cuente hacia atras.
        If Cells(i, 3).Value = valorBuscado Then
            For j = 1 To cantidadDeFilas
                  Range(Cells(i, 3), Cells(i, 3)).EntireRow.Insert
                Next j
                'el loop anterior se repite de 1 a la cantidadDeFilas por tanto las filas se van a añadir
                'esa cantidad de veces sobre la fila en cuestión.
            End If
        Next i
    End Sub

Надеялся быть достаточно ясным.

2
ответ дан 01.12.2019, 12:20
  • 1
    Пара заметок в твой ответ, Integer - Long отсеченная, никогда не используй integer, так как он может давать ошибки, преодолев nú морской окунь, превосходящий 32000 и немного. Относительно ввождения линий deberí схвати использовать без цикла ее j: Range(Cells(i, 1).Resize(CantidadDeFilas).EntireRow.Insert ты уберегаешься ненужные циклы. Из-за ú ltimo, deberí схвати всегда ссылаться на книги и листы предварительно рангам. – Damian 11.11.2019, 17:24
  • 2
    Относительно EntireRow.Insert у тебя есть вся razó n, я думаю, что лучше, использовать число линий, но не, как ты это помещаешь allí а другой формы, потому что, если я нахожусь в линии 2 и хочу он добавляет еще 20 линий, тогда darí в ошибку линия có я говорю, что добавлять. Я не любитель loops, но если они работоспособные, когда могут acuñ ar. И относительно Integer, ты имеешь razó n, эта точка, (в детали) habí в отмеченный в начало. – Elbert Villarreal 11.11.2019, 19:08