Форматировать ячейку без прямой перезаписи содержимого - PullRequest
0 голосов
/ 10 января 2019

У меня есть макрос VBA, который в основном генерирует дубликаты данных и строк на основе дат, существующих в нашей БД. Одна из вещей, которую я не смог сделать, - это форматирование уникального идентификатора пользователя, в идеале я должен добавить ведущие нули и удаление символа -, самый длинный из которых имеет идентификатор, состоящий из 10 цифр, а самый короткий - 8.

Текущие данные против того, что должно отображаться:
Current data vs What It should show

Проблема в том, что перед вставкой данных я запускаю следующую формулу Excel, которая перезаписывает данные внутри ячейки. Оставляя ячейку как 0 и формула сохраняется. Я знаю, что формула просто вставляется в ячейку и удаляет старое содержимое.

=CONCAT(IF(LEN(SUBSTITUTE(G18,"-","") )<9,"00","0"),SUBSTITUTE(G18,"-","") )

Это фрагмент макроса

Private Sub duplicadorLicMed()

Set Application = CreateObject("Excel.Application")

Dim planillaDestino As Worksheet
Set planillaDestino = ThisWorkbook.Sheets.Add(After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count))
planillaDestino.Name = "hojaDest"

Dim planillaFuente As Worksheet
Set planillaFuente = Application.Workbooks.Open("tstfl.xlsm")
Set planillaFuente = ThisWorkbook.Worksheets(1)
planillaFuente.Name = "hojaFuente"

Dim filaFuenteUltima As Long
filaFuenteUltima = planillaFuente.Cells(planillaFuente.Rows.Count, "B").End(xlUp).Row

Dim filaIndiceFuente As Long

Dim filaIndiceDestino As Long
filaIndiceDestino = 1 ' salto de lineas y encabezado

Dim fechaInicio As Variant
Dim fechaFin As Variant
Dim fechaIndice As Date

    For filaIndiceFuente = 2 To filaFuenteUltima
    fechaInicio = planillaFuente.Cells(filaIndiceFuente, "L").Value
    fechaFin = planillaFuente.Cells(filaIndiceFuente, "M").Value

    ' VALIDATOR OF DATA

    For fechaIndice = fechaInicio To fechaFin
        filaIndiceDestino = filaIndiceDestino + 1

    ' ROWS GET REPEATED HERE

    Next fechaIndice
Next filaIndiceFuente

'HERE I RUN THE FORMAT FORMULAS

planillaDestino.Range("B2:B" & filaIndiceDestino).Formula = "=CONCAT(YEAR(L2),IF(INT(MONTH(L2))<10,0,""""),MONTH(L2))" ' per pro
planillaDestino.Range("B2:B" & filaIndiceDestino).Formula = "=CONCAT(IF(LEN(SUBSTITUTE(C2,"-","") )<9,"00","0"),SUBSTITUTE(C2,"-","") )" ' digitador rut
planillaDestino.Range("K2:K" & filaIndiceDestino).Formula = "=ABS(DAYS(L2,M2))+1" ' dias totales

MsgBox "PROCESO COMPLETO"

' End If
End Sub

Так, как я мог "хранить" данные, работая над ними и не теряя их содержание?

Ответы [ 2 ]

0 голосов
/ 10 января 2019

Сначала удалите «-», наберите номер, наберите 10 цифр и сохраните данные. Использование функции форматирования. Затем вы можете отформатировать ячейку как текст и переместить данные в ячейку. Это можно сделать с помощью vba.

'HERE I RUN THE FORMAT FORMULAS
Dim rngDB As Range
Dim vDB As Variant, i As Long, r As Long

planillaDestino.Range("B2:B" & filaIndiceDestino).Formula = "=CONCAT(YEAR(L2),IF(INT(MONTH(L2))<10,0,""""),MONTH(L2))" ' per pro
Set rngDB = planillaDestino.Range("B2:B" & filaIndiceDestino)
vDB = rngDB
r = UBound(vDB, 1)
For i = 1 To r
    vDB(i, 1) = Replace(vDB(i, 1), "-", "")
    cnt = 10 - Len(vDB(i, 1))
    s = WorksheetFunction.Rept("0", cnt) 'if letters inside
    'vDB(i, 1) = Format(vDB(i, 1), "0000000000") ' if number
Next i
rngDB.NumberFormatLocal = "@" '<~~ text format
rngDB = vDB

Весь код

Private Sub duplicadorLicMed()

    Set Application = CreateObject("Excel.Application")

    Dim planillaDestino As Worksheet
    Set planillaDestino = ThisWorkbook.Sheets.Add(After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count))
    planillaDestino.Name = "hojaDest"

    Dim planillaFuente As Worksheet
    Set planillaFuente = Application.Workbooks.Open("tstfl.xlsm")
    Set planillaFuente = ThisWorkbook.Worksheets(1)
    planillaFuente.Name = "hojaFuente"

    Dim filaFuenteUltima As Long
    filaFuenteUltima = planillaFuente.Cells(planillaFuente.Rows.Count, "B").End(xlUp).Row

    Dim filaIndiceFuente As Long

    Dim filaIndiceDestino As Long
    filaIndiceDestino = 1 ' salto de lineas y encabezado

    Dim fechaInicio As Variant
    Dim fechaFin As Variant
    Dim fechaIndice As Date

        For filaIndiceFuente = 2 To filaFuenteUltima
        fechaInicio = planillaFuente.Cells(filaIndiceFuente, "L").Value
        fechaFin = planillaFuente.Cells(filaIndiceFuente, "M").Value

        ' VALIDATOR OF DATA

        For fechaIndice = fechaInicio To fechaFin
            filaIndiceDestino = filaIndiceDestino + 1

        ' ROWS GET REPEATED HERE

        Next fechaIndice
    Next filaIndiceFuente

    'HERE I RUN THE FORMAT FORMULAS
    Dim rngDB As Range
    Dim vDB As Variant, i As Long, r As Long
    Dim cnt As Integer

    planillaDestino.Range("B2:B" & filaIndiceDestino).Formula = "=CONCAT(YEAR(L2),IF(INT(MONTH(L2))<10,0,""""),MONTH(L2))" ' per pro

    Set rngDB = planillaDestino.Range("B2:B" & filaIndiceDestino)
    vDB = rngDB
    r = UBound(vDB, 1)
    For i = 1 To r
        vDB(i, 1) = Replace(vDB(i, 1), "-", "")
        cnt = 10 - Len(vDB(i, 1))
        s = WorksheetFunction.Rept("0", cnt) 'if number & string
        'vDB(i, 1) = Format(vDB(i, 1), "0000000000") ' if number
    Next i
    rngDB.NumberFormatLocal = "@" '<~~ text format
    rngDB = vDB
    'planillaDestino.Range("B2:B" & filaIndiceDestino).Formula = "=CONCAT(IF(LEN(SUBSTITUTE(C2,"-","") )<9,"00","0"),SUBSTITUTE(C2,"-","") )" ' digitador rut
    planillaDestino.Range("K2:K" & filaIndiceDestino).Formula = "=ABS(DAYS(L2,M2))+1" ' dias totales

MsgBox "PROCESO COMPLETO"

' End If
End Sub
0 голосов
/ 10 января 2019

Если я правильно вас понимаю, вы хотите использовать формат ячейки, чтобы значения ячеек, которые вы указали в первом столбце (15489651-2), выглядели как ваш последний столбец (0154896512). Насколько мне известно, это невозможно, поскольку значение «15489651-2» всегда будет интерпретироваться как текстовая строка, а сложные операции со строками (такие как поиск и замена) невозможны при форматировании ячеек.

Поскольку преобразование чистого числа (154896512) или строки с начальным нулем (0154896512) в формат с дефисом (15489651-2) очень просто с помощью формата ячейки "######## - # "или функция

=TEXT(A1,"########-#")

Я бы рекомендовал проверить, возможен ли обратный подход. Вы можете изменить данные на чистый числовой формат, который будет выглядеть так, как вы хотите. Всякий раз, когда вам нужно включить дефис (для внешнего вида или для других макросов), просто используйте формулу TEXT, чтобы изменить его (обратно) на этот формат.

Вот общий ресурс, когда дело доходит до форматов ячеек: https://www.ablebits.com/office-addins-blog/2016/07/07/custom-excel-number-format/#Repeat-characters

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...