Nejste přihlášen/a.

Přihlásit se do poradny

 

Excel VBA

Od: elisa24® odpovědí: 10 změna:
avatar elisa24

Dobrý den, jak prosím roztřídit v Excelu sloupec do tří sloupců - první číslo do prvního sloupce, druhé číslo do druhého, třetí do třetího sloupce, čtvrté číslo do prvního? Pro dva sloupce jsem používala tento kód:

Sub MoveRange()
Updateby20140730A
Dim rng As Range
Dim InputRng As Range, OutRng As Range
xTitleId = "KutoolsforExcel"
Set InputRng = Application.Selection
Set InputRng = Application.InputBox("Range :", xTitleId, InputRng.Address, Type:=8)
Set OutRng = Application.InputBox("Out put to (single cell):", xTitleId, Type:=8)
Set InputRng = InputRng.Columns(1)
For i = 1 To InputRng.Rows.Count Step 2
OutRng.Resize(1, 2).Value = Array(InputRng.Cells(i, 1).Value, InputRng.Cells(i + 1, 1).Value)
Set OutRng = OutRng.Offset(1, 0)
Next
End Sub

Pro tři jsou zkoušela změnit

For i = 1 To InputRng.Rows.Count Step 3

OutRng.Resize(1, 3).Value = Array(InputRng.Cells(i, 1).Value, InputRng.Cells(i + 1, 1).Value)

nebo

For i = 1 To InputRng.Rows.Count Step 3

OutRng.Resize(1, 3).Value = Array(InputRng.Cells(i, 2).Value, InputRng.Cells(i + 1, 2).Value)

Ale třetí sloupec se nevypíše. Děkuji


Excel VBA

 

 

10 odpovědí na otázku
Řazeno dle hodnocení

 

 

abcd*
hodnocení

2x

změnit řádky 10 a 11 takto :

For i = 1 To InputRng.Rows.Count Step 3
OutRng.Resize(1, 3).Value = Array(InputRng.Cells(i, 1).Value, InputRng.Cells(i + 1, 1).Value, InputRng.Cells(i + 2, 1).Value)

hodnocení

Moc moc děkuju :)

 

lobo*
hodnocení

2x

Trochu sem kód předělal, je přidána konstanta (Sloupcu), která určuje počet sloupců, do kterých se bude vybraná oblast "transportovat". Nyní stačí pro změnu počtu sloupců přepsat jen číslo konstanty a není potřeba editovat samotný kód.

[code]

Sub MoveRange()
Const Sloupcu As Byte = 5 číslo, které určí do kolika sloupců se vybraná oblast rozdělí
Dim rng As Range
Dim InputRng As Range, OutRng As Range
xTitleId = "KutoolsforExcel"
Set InputRng = Application.Selection
Set InputRng = Application.InputBox("Range :", xTitleId, InputRng.Address, Type:=8)
Set OutRng = Application.InputBox("Out put to (single cell):", xTitleId, Type:=8)
Set InputRng = InputRng.Columns(1)
For i = 1 To InputRng.Rows.Count Step Sloupcu
OutRng.Resize(1, Sloupcu).Value = Application.Transpose(InputRng.Cells(i, 1).Resize(Sloupcu).Value)
Set OutRng = OutRng.Offset(1, 0)
Next
End Sub

[/code]

Edit: nemáte někdo tip jak zde vkládat kód aby nechocházelo k jeho mršení? Jinak byl odstraněn apostrof u komentáře, který je u konstanty. Nutno doplnit!

hodnocení

Moc děkuji, zkuste code v jiných závorkách <>

 

lobo*
hodnocení

2x

Ještě přidám úpravu předchozího kódu. Předchozí kód vracel chybovou hodnotu při zadání např. 22 hodnot do 5 sloupců.

Sub MoveRange()
Const Sloupcu As Byte = 5 číslo, které určí do kolika sloupců se vybraná oblast rozdělí
Dim Resiz As Byte
Dim InputRows As Integer
Dim Modulo As Byte
Dim NumCyc As Integer
Dim rng As Range
Dim InputRng As Range, OutRng As Range
Dim i As Integer, x As Integer

xTitleId = "KutoolsforExcel"
Set InputRng = Application.Selection
Set InputRng = Application.InputBox("Range :", xTitleId, InputRng.Address, Type:=8)
Set OutRng = Application.InputBox("Out put to (single cell):", xTitleId, Type:=8)
Set InputRng = InputRng.Columns(1)

InputRows = InputRng.Rows.Count
Modulo = InputRows Mod Sloupcu
NumCyc = Int(InputRows / Sloupcu)
Resiz = Sloupcu

For i = 1 To InputRows Step Sloupcu
If x = NumCyc Then Resiz = Modulo
OutRng.Resize(1, Resiz).Value = Application.Transpose(InputRng.Cells(i, 1).Resize(Resiz).Value)
Set OutRng = OutRng.Offset(1, 0)
x = x + 1
Next
End Sub

PS: Díky za tag, na to další zadání se podívám.

PS2:*zmateny* hm, tak i v tomto tagu dochází k odmazávání znaků kua *zed*

 

lobo*
hodnocení

2x

K tomu kódu pro Latex. Zádrhel bych hledal v části kódu s podmínkou:

If m >= 15 Then
MsgBox ("This Macro cantt handle more than 15 rows. Sorry.")
Exit Sub
End If

Zkus změnit číslo 15 na 21, ještě bych odstranil to rovnítko.

hodnocení

Funguje, moc moc děkuji :)

 

hodnocení

avatar elisa24

A pro pět prosím? Zkoušela jsem:

For i = 1 To InputRng.Rows.Count Step 5
OutRng.Resize(1, 5).Value = Array(InputRng.Cells(i, 1).Value, InputRng.Cells(i + 4, 1).Value)
Set OutRng = OutRng.Offset(1, 0)

 

hodnocení

avatar elisa24

Ještě prosím tohle? Připravuje to tabulku z excelu do LaTexu.

Sub ExportaTabla_a_Latex()

Macro2 Macro

Dim Celda As String Celda
Dim NewCelda As String

Dim Valor As String
Dim i, j As Integer
Dim n, m As Integer

On Error GoTo Salida

n = CInt(InputBox("Define number of rows in the table", "Attention:"))

m = CInt(InputBox("Define number of columns in the table", "Attention:"))

If m >= 15 Then
MsgBox ("This Macro cantt handle more than 15 rows. Sorry.")
Exit Sub
End If

For j = 1 To m
selecciona la letra de la columna de cada ciclo
Select Case j
Case Is = 1
Celda = "A"
Case Is = 2
Celda = "B"
Case Is = 3
Celda = "C"
Case Is = 4
Celda = "D"
Case Is = 5
Celda = "E"
Case Is = 6
Celda = "F"
Case Is = 7
Celda = "G"
Case Is = 8
Celda = "H"
Case Is = 9
Celda = "I"
Case Is = 10
Celda = "J"
Case Is = 11
Celda = "K"
Case Is = 12
Celda = "L"
Case Is = 13
Celda = "M"
Case Is = 14
Celda = "N"
Case Is = 15
Celda = "O"
Case Is = 16
Celda = "P"
Case Is = 17
Celda = "Q"
Case Is = 18
Celda = "R"
Case Is = 19
Celda = "S"
Case Is = 20
Celda = "T"
Case Is = 21
Celda = "U"

End Select

For i = 1 To n

NewCelda = Celda + CStr(i) + ":" + Celda + CStr(i)
Range(NewCelda).Select
Valor = ActiveCell.FormulaR1C1

If IsNumeric(Valor) Then Valor = Round(Valor, 5)

If j = m Then
Valor = Valor + ""
Else
Valor = Valor + "&"
End If

ActiveCell.FormulaR1C1 = Valor
Next i

Next j

Salida:

End Sub

Doplnila jsem tam to červené, protože to fungovalo jen na 15 sloupců, ale pořád to píše, že to není na víc než 15, co je ještě potřeba prosím změnit?

 

figurek*
hodnocení

0x

Promiňte, ale na začátečníka se pouštíte proklatě vysoko. První část dotazu se nedá odpovědět takto jednoduše a v jednom odstavečku. Makro by nemělo dělat víc, než jednu činnost. Makrům, které provádějí více činností, ajťáci říkají špagetový kód a ten se považuje za školáckou chybu. Takové makro se časem pouze a jedině komplikuje a jednou přijde den, kdy se v něm nevyzná ani sám autor.

A zde je moje odpověď na vaši doplňující otázku. Co s tou patnáctkou?

If m >=15 Then
MsgBox ("This Macro cantt handle more than 15 rows. Sorry.")
Exit Sub
End If
*

Česky řečeno, když m je větší než 15 , potom napiš hlášku, že řádků nesmí být víc než 15 a ukonči makro příkazem Exit Sub.

Změňte patnáctku na nějaké větší číslo a problém je vyřešený. Jen pozor na strukturální chybu. Vaše >=15 znamená, že váš Exit Sub proběhne i v případě čísla 15. K patnáctému řádku se nikdy nedostanete. Proto vám radím, naučte se strukturovat programy tak, abyste nemusela používat povel Exit Sub. To je hodně tvrdé lámání přes koleno.

Správně by kód měl vypadat takto

If m>15 then

MsgBox ("This Macro cant handle more than 15 rows. Sorry.")

Else

... sem přijdou postupná volání ostatních maker

End If

Vidíte ten rozdíl? Když m>15, program skočí na hlášku MsgBox, kód ostatních maker vůbec neproběhne a vy nemusíte používat tvrdý konec Exit Sub.

 

 


 

 

 

Přihlásit se k odběru odpovědí z této otázky:

Neneseme odpovědnost za správnost informací a za škodu vzniklou jejich využitím. Jednotlivé odpovědi vyjadřují názory jejich autorů a nemusí se shodovat s názorem provozovatele poradny Poradte.cz.

Používáním poradny vyjadřujete souhlas s personifikovanou reklamou, která pomáhá financovat tento server, děkujeme.

Copyright © 2004-2025 Poradna Poradte.cz. Všechna práva vyhrazena. Prohlášení o ochraně osobních údajů. | [tmavý motiv]