2015-10-05 42 views
5

La colonna C ha il tempo (formattato come testo come foglio verrà esportato come csv) nel formato HH: mm: ss.VBA: sostituzione parte della stringa temporale

C1, C2, C3 valori sono di tempo 9:15:00, 9:16:00, 9:17:00, rispettivamente, fino a 15:29:00

necessità di sostituire solo l'ultimo ": 00 "parte con ": 59"

--- CATCH --- Nella colonna C ci saranno valori quali 10:00:00 o 11:00:00 o 12:00:00

Questo significa una sostituzione diretta ": 00" con ": 59" corromperebbe i valori di esatto 10'o orologio, 11'o orologio ecc.

La colonna C sarà riempita w con migliaia di tali dati. La mia logica di seguito non funziona credo:

{

Dim secrep As String 
LastRow = Cells(Rows.Count, "C").End(xlUp).Row 
Secsz = Range("C1:C" & LastRow).Select 
seczero = Right(Secsz, 2) 
secrep = Replace(Secsz, ":00", ":59") 

}

So che il codice di cui sopra è sbagliato, ma questo è tutto quello che potevo trovare.

richiesta di aiuto completo questa logica ..

EDIT: non era abbastanza elaborata per spiegare. Anche questi valori completi ore devono essere sostituisce quali: 10:00:59, 11:00:59, 12:00:59

risposta

2

Se il valore non termina con 00:00 aggiornare alla :59

Dim cell As Range 

For Each cell In Range("C1", Range("C1").End(xlDown)) 
    If Right$(cell.Value, 5) <> "00:00" Then 
     cell.Value = Left$(cell.Value, 6) & "59" 
    End If 
Next 

Modifica, per sostituire solo l'ultimo 00:

Dim cell As Range 

For Each cell In Range("C1", Range("C1").End(xlDown)) 
    cell.Value = Left$(cell.Value, 6) & "59" 
Next 
+0

Grazie Alex. Il mio errore non è stato abbastanza elaborato nello spiegare. Se 'Right $ (cell.Value, 5) <>" 00:00 "Then' questa parte evita di sostituire": 00 "a": 59 "per valori di ore complete come 10:00:00, 11:00:00 ecc. Anche questi valori dell'ora intera devono essere sostituiti come: 10:00:59, 11:00:59, 12:00:59 Richiedere al pls di ricominciare – Vaibhav

+0

Ah aggiornato. –

+0

Grazie per il tempo e gli sforzi di Alex K. Questo editor ha funzionato perfettamente. :) – Vaibhav

2

Sei sulla strada giusta. Hai solo bisogno di dividere prima la stringa, sostituirla nella seconda metà e poi concatenare in seguito. Ecco una funzione di general-purpose che si potrebbe desiderare di migliorare con un po 'di gestione degli errori:

Function ReplaceEnd(s As String, endCount As Integer, replaceWhat As String, replaceWith As String) 
    Dim baseString As String 
    Dim replaceString As String 

    baseString = Left(s, Len(s) - endCount) 
    replaceString = Right(s, endCount) 

    ReplaceEnd = baseString & Replace(replaceString, replaceWhat, replaceWith) 
End Function 

Edit: Esempio di utilizzo:

secrep = ReplaceEnd(Secsz, 3, ":00", ":59") 
+0

non so cosa sto facendo male, ma la colonna temporale C ha ancora tutti: 00 (ultimi 3 caratteri) non sostituiti. Non ho avuto alcun errore pure. Qualsiasi indizio amico? – Vaibhav

+0

Hai inserito la stringa sostituita nella cella? Per esempio.Intervallo ("C1: C" e LastRow) .Value = secrep – DanL

+0

Sì, DanL l'ho fatto. Non c'era alcun errore, solo il file con il tempo non è cambiato. Proverò ancora una volta lo stesso. – Vaibhav

0

Utilizzare la funzione split e poi analizzare e modificare.

Private Sub CommandButton1_Click() 
    Dim ws   As Excel.Worksheet 
    Dim lastRow  As Long 
    Dim szTimeParts() As String 
    Dim lRow   As Long 

    lRow = 1 
    lastRow = ws.Cells(ws.Rows.count, "C").End(xlUp).Row 

    Set ws = ActiveWorkbook.Sheets("Sheet1") 
    ws.Activate 

    'Loop through the rows 
    Do While lRow <= lastRow 

     'Make sure we have a value to read into our string 
     If ws.Range("C" & lRow).Value <> "" Then 
      szTimeParts = Split(Trim(ws.Range("C" & lRow).Value), ":") 
      If szTimeParts(1) <> "00" Then 
       ws.Range("C" & lRow).Value = szTimeParts(0) & ":" & szTimeParts(1) & ":59" 
      End If 
     End If 
     lRow = lRow + 1 
    Loop 

End Sub 
+0

grazie per la condivisione. Potrei mancare qualcosa, ho inserito questo codice in un'altra macro (dato che questa è una fase del processo di pulizia dei dati) e il csv finale che è uscito non ha avuto alcun cambiamento in esso. Non so perché. Qualche modo posso spiegarti meglio? o se ho applicato il codice in modo errato? – Vaibhav

+0

Ciò apporta solo le modifiche alla cartella di lavoro aperta. Dovrai salvarlo manualmente o metterlo in un salvataggio come ActiveWorkbook.Save in fondo. – MatthewD

+0

Ecco le informazioni sul salvataggio come csv http://stackoverflow.com/questions/10551353/saving-excel-worksheet-to-csv-files-with-filenameworksheet-name-using-vb – MatthewD

1

è possibile utilizzare questo:

Public Function AlterTime(rInputRange As Range) 

    Dim oCell As Range 

    For Each oCell In rInputRange.Cells 
     oCell = TimeSerial(Hour(oCell), Minute(oCell), 59) 
    Next oCell 

End Function 
+0

Ciao Bas Verlaat, lasciami provare. Solo un colpo di testa che ho formattato la colonna come testo e non voglio che Excel interferisca con il Time Format. Il motivo è excel e rovina i valori di data-ora quando vengono esportati come csv. Quindi non sono sicuro che il tuo codice ti sarà d'aiuto. Fammi provare. – Vaibhav

+0

Ciao. Puoi mettere una funzione 'Testo (Val," hh: mm ")' in modo che sia di nuovo testo. Il vantaggio di questo approccio è che non può andare male, perché il tempo reale viene ricostruito. –

Problemi correlati