variable valor una ultima sirve seleccionar rango que para macro hoja hasta desde datos con celda asignar activesheet activa vba excel-vba

valor - seleccionar hoja excel vba



Para mover los valores de celda de un grupo de derecha a izquierda si algún grupo de celdas está vacío usando VBScript sin usar ninguna técnica de bucle? (2)

¿Hay algún proceso más rápido para mover los valores de celda de un grupo de derecha a izquierda si algún grupo de celdas está vacío usando VBScript sin utilizar ninguna técnica de bucle? (Embalaje de los datos de cada fila, a la izquierda)

Tabla de entrada: *

Project# T1Name T1StartDate T1FinishDate T2Name T2StartDate T2FinishDate T3Name T3StartDate T3FinishDate 11 S1 12/7/2012 19/7/2012 S2 12/7/2012 19/7/2012 12 S2 12/6/2012 13 S4 11/05/12 S6 12/5/10

Tabla de salida:

Project# T1Name T1StartDate T1FinishDate T2Name T2StartDate T2FinishDate T3Name T3StartDate T3FinishDate 11 S1 12/7/2012 19/7/2012 S2 12/7/2012 19/7/2012 12 S2 12/6/2012 13 S4 11/05/12 S6 12/05/10

Tabla de salida MY actualizada Por favor, compruebe, en primer lugar, se extravió.

Actualización1

Project# T1Name T1StartDate T1FinishDate T2Name T2StartDate T2FinishDate T3Name T3StartDate T3FinishDate 10 S1 11/5/2011 S2 5/5/2011 11 S1 11/5/2011 5/4/2011 S1 11/5/2011 5/4/2011

Actualización2

Project# T1Name T1StartDate T1FinishDate T2Name T2StartDate T2FinishDate T3Name T3StartDate T3FinishDate 11 11/5/2011 S1 11/5/2011 5/4/2011 S2 11/5/2011 5/4/2011

Agregue esta entrada a la tabla, no está desplazada correctamente. ¿Puedes verificar por favor?

Código actualizado:

Option Explicit Dim objExcel1,objWorkbook Dim strPathExcel1 Dim objSheet1,IntRow1 Dim Task,Totltask Dim DataArray(14),index,Counter Set objExcel1 = CreateObject("Excel.Application") strPathExcel1 = "D:/VA/TestVBSScripts/Test.xlsx" Set objWorkbook=objExcel1.Workbooks.open(strPathExcel1) Set objSheet1 = objExcel1.ActiveWorkbook.Worksheets(1) IntRow1=2 Do While objSheet1.Cells(IntRow1,1).Value <> "" Totltask=2 index=0 Do Until Totltask> 10 ''MsgBox("Hi") If objSheet1.Cells(IntRow1,Totltask).Value <> "" Or objSheet1.Cells(IntRow1,Totltask+1).Value <> "" Or objSheet1.Cells(IntRow1,Totltask+2).Value <> "" Then DataArray(index)=objSheet1.Cells(IntRow1,Totltask).Value DataArray(index+1)=objSheet1.Cells(IntRow1,Totltask+1).Value DataArray(index+2)=objSheet1.Cells(IntRow1,Totltask+2).Value index=index+3 End If Totltask=Totltask+3 Loop Totltask=2 Counter=index-1 index=0 ''MsgBox(Counter) Do While index < Counter ''MsgBox("Hi") objSheet1.Cells(IntRow1,Totltask).Value=DataArray(index) objSheet1.Cells(IntRow1,Totltask+1).Value=DataArray(index+1) objSheet1.Cells(IntRow1,Totltask+2).Value=DataArray(index+2) Totltask=Totltask+3 index=index+3 Loop Erase DataArray Do Until Totltask >10 objSheet1.Cells(IntRow1,Totltask).Value="" Totltask=Totltask+1 Loop IntRow1=IntRow1+1 Loop ''======================= objExcel1.ActiveWorkbook.SaveAs strPathExcel1 objExcel1.Workbooks.close objExcel1.Application.Quit ''======================

*** ¿Puede algún cuerpo sugerir cómo debería hacerlo más rápido, si es posible? Este código es correcto y produce el resultado deseado. Pero es demasiado lento.


EDITAR: crea el número de columna en un grupo de 3 a N (ColumnInGroup)

EDITAR: corrigió algunos errores y permitió que el campo "NAME" esté vacío, un tipo "T" se trata como si existiera Nombre, fecha de inicio, fecha de finalización, rendimiento mejorado al asignar de nuevo en unidad ROW en lugar de unidad celular

EDIT: corrigió un error

EDITAR: Obtengo el valor de estas constantes en VBA, abre un Excel, Alt + F11 para abrir el Editor de VB, Crtl + G abre una ventana inmediata, escribe ?xlUp , mostrará el valor de xlUp a continuación

El código a continuación está en VBS, funciona en la hoja que visualiza actualmente y el rendimiento debería ser correcto ... Cambie la ruta completa del libro de trabajo, el nombre de la hoja de trabajo para usar

Option Explicit Dim xlApp Dim xlBook dim xlSheet Set xlApp = CreateObject("Excel.Application") xlApp.Visible = False xlApp.EnableEvents = False xlApp.ScreenUpdating = False ''xlApp.Calculation = -4135 ''xlCalculationManual set xlBook = xlApp.Workbooks.Open("C:/Users/wangCL/Desktop/data.xlsx") set xlSheet = xlBook.Worksheets("data (4)") ''CONTENT HERE Dim count Dim dataArray Dim height Dim width Dim rWidth Dim packArray Dim i Dim j dim rowArray dim ColumnInGroup dim k dim b With xlSheet .activate ColumnInGroup= 4 height = .Cells(.Rows.count, 1).End(-4162).Row '' assume 1st line is header '' start from 2nd line If height > 1 Then For i = 2 To height width = .Cells(i, .Columns.count).End(-4159).Column ''round width if (width -1 )mod columnInGroup <> 0 then width = (((width -1)/columnInGroup )+1)* columnInGroup + 1 end if if width > 1 then ''finding the last unit originally packed redim rowArray(0,width-1) rowArray = .range(.cells(i,1), .cells(i,width)).value ''default value rWidth = width for j = 2 to width step ColumnInGroup if j+ColumnInGroup -1 <= width then b = false for k = 0 to ColumnInGroup - 1 if rowArray(1,j+k) <> "" then b = true exit for end if next if not b then rWidth = j - 1 exit for end if else rWidth = width end if next ''rWidth = .Cells(i, 1).End(-4161).Column ''If .Cells(i, rWidth - 1).Value = "" Then '' rWidth = 1 ''End If ''''check for each new "T" - 1 ''If rWidth Mod 3 = 0 Then '' rWidth = rWidth + 1 ''ElseIf rWidth Mod 3 = 1 Then '' rWidth = rWidth ''ElseIf rWidth Mod 3 = 2 Then '' rWidth = rWidth + 2 ''End If '' if is not packed If width > rWidth Then ReDim dataArray(1 ,(width - rWidth)) dataArray = .Range(.Cells(i, rWidth + 1), .Cells(i, width)).Value count = 0 For j = LBound(dataArray, 2) To UBound(dataArray, 2) Step ColumnInGroup if j+ColumnInGroup - 1<= ubound(dataArray,2) then b = false for k = 0 to ColumnInGroup - 1 if dataArray(1,j+k) <> "" then b = true exit for end if next if b then count = count + 1 end if else exit for end if Next ReDim packArray(0, count * columnInGroup - 1) count = 0 For j = LBound(dataArray, 2) To UBound(dataArray, 2) Step columnInGroup '' we found a "T" Unit if j+columnInGroup -1<= ubound(dataArray,2) then b = false for k = 0 to ColumnInGroup - 1 if dataArray(1,j+k) <> "" then b = true exit for end if next if b then count = count + 1 for k = 0 to columnInGroup - 1 If j + k <= UBound(dataArray, 2) Then packArray(0, (count - 1) * columnInGroup + k ) = dataArray(1, j + k) end if next end if else exit for end if Next ''clear original data .Range(.Cells(i, rWidth + 1), .Cells(i, width)).ClearContents ''for j = 1 to ubound(packArray,2) '' .cells(i,rWidth+j).value = packArray(1,j) '' next .Range(.Cells(i, rWidth + 1), .Cells(i, rWidth + count * columnInGroup)).Value = packArray End If end if Next End If End With xlBook.save xlApp.Quit set xlSheet = nothing set xlBook = nothing set xlApp = nothing msgbox "Done"


Sugiero usar el método Delete de Excel.Range para eliminar las celdas vacías y pasar un parámetro para desplazar las celdas restantes a la izquierda:

Option Explicit Dim xlApp, xlBook, xlSheet Dim rowCount, columnCount, i, j, currentColumnCount Dim rng, cell, hasValue Const xlShiftToLeft = -4159 Set xlApp = CreateObject("Excel.Application") Set xlBook = xlApp.Workbooks.Open("C:/path/to/excel/file.xlsx") Set xlSheet = xlBook.Worksheets("WorksheetName") rowCount = xlSheet.UsedRange.Rows.Count columnCount = xlSheet.UsedRange.Columns.Count - 3 For i = 2 To rowCount currentColumnCount = columnCount j = 2 Do While j <= currentColumnCount Set rng = xlSheet.Range(xlSheet.Cells(i,j), xlSheet.Cells(i,j+2)) hasValue = False For Each cell In rng.Cells If cell.Value <> "" Then hasValue = True Exit For End If Next If hasValue Then j = j + 3 Else rng.Delete xlShiftToLeft currentColumnCount = currentColumnCount - 3 End If Loop Next xlBook.Save xlApp.Quit