- Samsung Galaxy Tab S10 Ultra - más dimenzió
- NVIDIA GeForce RTX 5080 / 5090 (GB203 / 202)
- Canon EOS DSLR topic
- AMD Ryzen 9 / 7 / 5 9***(X) "Zen 5" (AM5)
- Intel Core i5 / i7 / i9 "Alder Lake-Raptor Lake/Refresh" (LGA1700)
- Forrmell.enn
- Vélemény: nem úgy tűnik, de Lip-Bu Tan most menti meg az Intelt
- AMD Navi Radeon™ RX 5xxx sorozat
- HiFi műszaki szemmel - sztereó hangrendszerek
- Hobby elektronika
-
PROHARDVER!
A Microsoft Excel topic célja segítséget kérni és nyújtani Excellel kapcsolatos problémákra.
Kérdés felvetése előtt olvasd el, ha még nem tetted.
Új hozzászólás Aktív témák
-
Mutt
senior tag
válasz
DasBoot #54438 üzenetére
Szia,
Nem hinném hogy tud segíteni, de ez a makró megnézi a képleteket tartalmazó cellákat és próbál bennük hibát találni. Az eredményt az immediate ablakba írja ki.
A CheckFormula függvényben 4 általános hiba ellenőrzés van:
1) a képlet nem megfelelően kezdődik
2) zárójelek nincsenek párban
3) körkörös hivatkozás van a cellában
4) a fájl hívatkozás érvénytelenSub ListFormulas()
Dim wsCurrent As Worksheet
Dim rngFormula As Range
For Each wsCurrent In ThisWorkbook.Worksheets
With wsCurrent
'nézzük elöször hogy van-e hibát tartalmazó cellát
On Error Resume Next
Set rngFormula = .Cells.SpecialCells(xlCellTypeFormulas, 16)
On Error GoTo 0
If Not rngFormula Is Nothing Then
Call PrintFormulas(rngFormula, 100)
End If
'nézzük a nem hibát tartalamazó cellákat
On Error Resume Next
Set rngFormula = .Cells.SpecialCells(xlCellTypeFormulas, 7)
On Error GoTo 0
If Not rngFormula Is Nothing Then
Call PrintFormulas(rngFormula, 100)
End If
End With
Next wsCurrent
End Sub
Sub PrintFormulas(rng As Range, counter As Long)
Dim r As Range, c As Long
Dim keplet As String, hiba As String
c = 1
For Each r In rng
keplet = r.Formula2
hiba = CheckFormula(keplet, r.Address)
If hiba <> "" Then
Debug.Print "Hely: " & r.Parent.Name & r.Address & ", Hiba: " & hiba & ", Képlet: " & keplet
End If
c = c + 1
If c > counter Then Exit For
Next r
End Sub
Function CheckFormula(str As String, loc As String) As String
CheckFormula = ""
'nézzük hogy mivel kezdõdik a képlet
If InStr(1, "=+-@", Left(str, 1)) = 0 Then CheckFormula = "Elsõ karakter hibás"
'képletben párosával kell lennie a zárójeleknek
Dim leftBracket
leftBracket = Len(str) - Len(Replace(str, "(", ""))
If Len(str) - Len(Replace(str, ")", "")) <> leftBracket Then CheckFormula = "Zárójel nincs párban"
'körkörös hivatkozás: képletben saját cella hivatkozás nem lehet
'hivatkozás lehet: A1, $A$1 formátumban, töröljük a $ jeleket az ellenõrzéshez
If InStr(1, Replace(str, "$", ""), Replace(loc, "$", "")) > 0 Then CheckFormula = "Körkörös hivatkozás"
'keressünk fájl hivatkozást a képletben
Dim filePath As String
If InStr(1, str, "[") > 0 Then
filePath = Mid(str, 2, InStr(1, str, "]") - 1)
'töröljük a [ ] ' jeleket
filePath = Replace(Replace(Replace(filePath, "[", ""), "]", ""), "'", "")
'létezik a fájl?
If Len(filePath) > 0 Then
If (Dir(filePath) = "") Then CheckFormula = "Fájl nem létezik"
End If
End If
End Function
-
bpmcwap
senior tag
magát az excelt mentettem le jelszóval és találtam egy ilyen kódot, amit meg naplózáshoz fogok használni... még nem próbáltam, de elvileg ez működik - ennyire nem értek hozzá
Private Sub Workbook_Open()
Dim logSheet As Worksheet
Dim nextRow As Long
Dim userName As String
Dim timeStamp As String
Const LOG_SHEET_NAME As String = "Napló" ' A napló munkalap neve
On Error Resume Next
Set logSheet = ThisWorkbook.Sheets(LOG_SHEET_NAME)
' Ha nincs ilyen lap, létrehozza és nagyon elrejti
If logSheet Is Nothing Then
Application.ScreenUpdating = False
Set logSheet = ThisWorkbook.Sheets.Add(After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count))
logSheet.Name = LOG_SHEET_NAME
logSheet.Cells(1, 1).Value = "Időbélyeg"
logSheet.Cells(1, 2).Value = "Felhasználó"
logSheet.Cells(1, 3).Value = "Esemény"
logSheet.Visible = xlSheetVeryHidden ' Nagyon rejtett!
Application.ScreenUpdating = True
End If
If logSheet Is Nothing Then Exit Sub ' Hiba esetén kilép
On Error GoTo 0 ' Visszaállítjuk a normál hibafigyelést a lapkezelés után
On Error Resume Next ' Újra bekapcsoljuk az általános hibaátugrást az íráshoz
userName = Environ("USERNAME") ' Windows felhasználónév
If userName = "" Then userName = "Ismeretlen"
timeStamp = Format(Now(), "yyyy-mm-dd hh:nn:ss")
' Következő üres sor keresése (rejtett lapon is működik)
nextRow = logSheet.Cells(logSheet.Rows.Count, "A").End(xlUp).Row + 1
If nextRow < 2 Then nextRow = 2
' Adatok írása
logSheet.Cells(nextRow, 1).Value = timeStamp
logSheet.Cells(nextRow, 2).Value = userName
logSheet.Cells(nextRow, 3).Value = "Megnyitva"
' Nem mentjük automatikusan a munkafüzetet itt!
On Error GoTo 0
End Sub -
Mutt
senior tag
Érdekelt a ChatGPT megoldása is.
Ezt adtam meg neki: "can you write for me a VBA code which joins texts of Excel cells while keeping their original formatting?"
Erre azt a kódot adta vissza:
Sub JoinCellsWithFormatting()
Dim rng As Range
Dim cell As Range
Dim destCell As Range
Dim charIndex As Long
' Ask user to select cells to join
On Error Resume Next
Set rng = Application.InputBox("Select the cells to join (same row or column):", Type:=8)
On Error GoTo 0
If rng Is Nothing Then Exit Sub
' Ask user to select destination cell
On Error Resume Next
Set destCell = Application.InputBox("Select the destination cell:", Type:=8)
On Error GoTo 0
If destCell Is Nothing Then Exit Sub
' Clear previous content
destCell.Value = ""
charIndex = 1
' Loop through selected cells
For Each cell In rng.Cells
If cell.Value <> "" Then
' Copy each character with formatting
With cell
Dim i As Long
For i = 1 To Len(.Text)
destCell.Characters(Start:=charIndex, Length:=1).Text = Mid(.Text, i, 1)
With .Characters(i, 1).Font
With destCell.Characters(charIndex, 1).Font
.Name = .Name
.FontStyle = .FontStyle
.Size = .Size
.Bold = .Bold
.Italic = .Italic
.Underline = .Underline
.Color = .Color
End With
End With
charIndex = charIndex + 1
Next i
End With
' Add space (or separator) between cells, if needed
destCell.Characters(Start:=charIndex, Length:=1).Text = " "
charIndex = charIndex + 1
End If
Next cell
MsgBox "Cells joined with formatting preserved.", vbInformation
End Sub
A kód lefut, de a szöveget formázás NÉLKÜL fűzi össze.
Elsőre nekem sem tünt fel a hiba a kódban, de aztán lépésről-lépésre nézve kijött a hiba.A 31-32-es sorokban WITH-eket használ, hogy rövidebben tudjun hivatkozni az objektumokra, azonban nem számol azzal, hogy amint egy új WITH indul a korábbiak elvesztik érvényességüket és onnantól TELJES NÉVVEL kell hivatkozni az előző objektumra. MS
Vagyis a 33-as sorban a
.Name = .Name
helyett.Name = cell.Characters(i,1).Font.Name
kell. Ezzel helyesen fut le.
A visszajelzés után ChatGPT javította a kódot.Kérdés, hogy ez maradandó vagy másnak is el fogja-e követni ugyanezt a hibát?
Alakul azért.üdv
-
Mutt
senior tag
válasz
modflow #53394 üzenetére
Szia,
Itt egy VBA kód amivel egy "Summary" elnevezésű lapra ki tudod íratni, hogy a munkafüzet lapjain milyen képletek találhatóak. Ha lefuttatod mindkét fájlon, akkor össze tudod hasonlítani a listákat.
Sub ListCellswithFormulas()
Dim ws As Worksheet
Dim rngFormulas As Range
Dim wsReport As Worksheet
Dim a As Long, c As Long
Dim out As Long
Set wsReport = ThisWorkbook.Worksheets("Summary")
out = 2
With wsReport
.Range("A1") = "Lap"
.Range("B1") = "Cella"
.Range("C1") = "Képlet"
For Each ws In ThisWorkbook.Worksheets
On Error Resume Next
Set rngFormulas = ws.Cells.SpecialCells(xlCellTypeFormulas, 23)
On Error GoTo 0
If Not rngFormulas Is Nothing Then
For a = 1 To rngFormulas.Areas.Count
For c = 1 To rngFormulas.Areas(a).Count
.Cells(out, "A") = ws.Name
.Cells(out, "B") = rngFormulas.Areas(a).Item(c).Address
.Cells(out, "C") = "'" & rngFormulas.Areas(a).Item(c).Formula2
out = out + 1
Next c
Next a
Set rngFormulas = Nothing
End If
Next ws
End With
End Sub
üdv
-
Mutt
senior tag
Szia,
Neked kell sorba rendezni a dátumokat, erre van több megoldás is. A QuickSort elég gyors nagyobb adatsoron is.
Én még annyit kavartam, hogy ha előfordulnának ismétlődő szabad dátumok, akkor azt egy collection-el előbb kiszűrtem.
Private Sub FillDates2()
Dim ws As Worksheet
Dim cell As Range
Dim greenColor As Long
greenColor = RGB(0, 204, 102)
Set ws = ThisWorkbook.Sheets("2025")
Dim datumokColl As New Collection 'collection esetén csak egyedi értékek maradnak meg
Dim datumokArr() 'majd ebbe a tömbbe másoljuk át a kapott értékeket
Dim c As Long
On Error Resume Next 'collection leáll ha duplikáció van, így átugorjuk ezt
For Each cell In ws.UsedRange
If cell.Interior.Color = greenColor And IsDate(cell.Value) Then
datumokColl.Add cell.Value, CStr(cell.Value)
End If
Next cell
On Error GoTo 0
'ha van szabad dátum akkor lehet tovább menni
If datumokColl.Count > 0 Then
'a szabad dátumokat egy tömbbe kell másolni, létrehozzuk a megfelelõ méretû tömböt
ReDim datumokArr(1 To datumokColl.Count)
'átmásoljuk a collection tartalmát a tömbbe
For c = 1 To datumokColl.Count
datumokArr(c) = datumokColl(c)
Next c
'növekvõ sorba rendezzük a dátumokat
Call QuickSort(datumokArr, 1, datumokColl.Count)
'comboxhoz adjuk a dátumokat
For c = 1 To UBound(datumokArr)
Me.ErkezesiDatum.AddItem Format(datumokArr(c), "yyyy.mm.dd")
Me.TavozasiDatum.AddItem Format(datumokArr(c), "yyyy.mm.dd")
Next c
End If
End Sub
'https://stackoverflow.com/questions/152319/vba-array-sort-function
Public Sub QuickSort(vArray As Variant, inLow As Long, inHi As Long)
Dim pivot As Variant
Dim tmpSwap As Variant
Dim tmpLow As Long
Dim tmpHi As Long
tmpLow = inLow
tmpHi = inHi
pivot = vArray((inLow + inHi) \ 2)
While (tmpLow <= tmpHi)
While (vArray(tmpLow) < pivot And tmpLow < inHi)
tmpLow = tmpLow + 1
Wend
While (pivot < vArray(tmpHi) And tmpHi > inLow)
tmpHi = tmpHi - 1
Wend
If (tmpLow <= tmpHi) Then
tmpSwap = vArray(tmpLow)
vArray(tmpLow) = vArray(tmpHi)
vArray(tmpHi) = tmpSwap
tmpLow = tmpLow + 1
tmpHi = tmpHi - 1
End If
Wend
If (inLow < tmpHi) Then QuickSort vArray, inLow, tmpHi
If (tmpLow < inHi) Then QuickSort vArray, tmpLow, inHi
End Subüdv
-
gycs02
tag
válasz
Fferi50 #52739 üzenetére
Szia!
Köszönöm a választ!
Keresgettem az ajánlásod alapján, de sajnos nem jutottam előrébb. Nem vagyok képben a makró világában, csak amit megtalálok a neten azokat próbálom több-kevesebb sikerrel felhasználni, s minimálisan módosítgatni.
Ez így most működik:Dim utvonal As String
utvonal = "c:\Dokumentumok\01\1.xlsx"
On Error GoTo 1
ActiveWorkbook.FollowHyperlink utvonal, NewWindow:=True
Exit Sub
1: MsgBox Err.DescriptionHogy mi miért van benne nem tudom, egyedül az útvonal ami számomra mond valamit.
Az elérési út az alkönyvtár kivételével minden esetben ua, a fájlnév sem változik. Azt szeretném elérni, hogyha az a fájl ami a makrót futtatja a 01-es mappában van, akkor az abban lévő 1.xls-t nyissa meg, ha a 02-ben van, akkor az abban lévőt stb.
Lehet így érthetőbb is a kérdésem, ha megoldható kijavítanád ezek alapján?Az excel-ben az összes makró engedélyezve van, és pipálva a VBA projekt objektumok is.
Az a tiltás feloldása rész nálam nincs vagy nem jó helyen keresem vagy le van tiltva. [kép]Köszi gycs!
-
TheSaint
aktív tag
válasz
Fferi50 #52503 üzenetére
Ezek stimmelnek.
Így néz ki a teljes kód, egy adatbázislekérés van a táblázatban. Még sose futottam bele ilyen megmagyarázhatatlan hibába:Private Sub Workbook_Open()
' Adatkapcsolatok frissítése
ThisWorkbook.RefreshAll
' Azonnal elindítjuk az időzítőt, amely a háttérben fut
StartTimer
End Sub
Sub StartTimer()
' Időzítő beállítása 15 másodpercre
Application.OnTime Now + TimeValue("00:00:15"), "ThisWorkbook.ProcessAfterDelay"
End Sub
Sub ProcessAfterDelay()
' Ellenőrizze, hogy a munkafüzet meg van-e nyitva
If ThisWorkbook.Name = "e.xlsm" Then
' Változók deklarálása
Dim ws1 As Worksheet ' "Munka1" lap
Dim ws3 As Worksheet ' "Munka3" lap
Dim filterRange As Range
Dim filterValues() As Variant
Dim filterValue As Variant
Dim bodyText As String
Dim emailTable As Object
Dim CDO_Mail As Object
Dim CDO_Config As Object
' CDO konfiguráció beállítása
Set CDO_Mail = CreateObject("CDO.Message")
Set CDO_Config = CreateObject("CDO.Configuration")
CDO_Config.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
CDO_Config.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "192.168.."
CDO_Config.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25
CDO_Config.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 1
CDO_Config.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusername") = ""
CDO_Config.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendpassword") = ""
CDO_Config.Fields.Update
Set CDO_Mail.Configuration = CDO_Config
' Munkalapok beállítása
Set ws1 = ThisWorkbook.Sheets("Munka1")
Set ws3 = ThisWorkbook.Sheets("Munka3")
ws1.AutoFilterMode = False
' Szűrési tartomány beállítása a "Munka1" lapon (A-M oszlop)
Set filterRange = ws1.Range("A3:M" & ws1.Cells(ws1.Rows.Count, "K").End(xlUp).Row)
' Kiválasztott nevek definiálása
filterValues = Array("X", "Y")
' E-mail címek táblázatának inicializálása a "Munka3" lapon
Set emailTable = CreateEmailTable(ws3)
' Minden egyedi értékhez készítünk egy külön e-mailt
For Each filterValue In filterValues
' Szűrés a K oszlop alapján a "Munka1" lapon
filterRange.AutoFilter Field:=11, Criteria1:=filterValue
' Csak folytatjuk, ha vannak szűrt sorok
If Application.WorksheetFunction.Subtotal(103, filterRange.Columns(1)) > 1 Then
' E-mail tartalma összeállítása
bodyText = "" & filterValue & " m:" & vbCrLf & vbCrLf
bodyText = bodyText & "" & vbCrLf & vbCrLf
' HTML formátumban konvertált táblázat hozzáadása az üzenethez
bodyText = bodyText & RangetoHTML(filterRange.SpecialCells(xlCellTypeVisible))
' E-mail cím meghatározása a filterValue alapján a "Munka3" lapon
Dim emailCim As String
emailCim = GetEmailFromTable(emailTable, filterValue)
' Csak folytatjuk, ha sikerült e-mail címet meghatározni
If emailCim <> "" Then
' E-mail küldése CDO objektummal
With CDO_Mail
.Subject = "D"
.From = "@.hu"
.To = emailCim
.cc = "@.hu"
.HTMLBody = bodyText ' HTML formátumú tartalom hozzáadása az üzenethez
.Send
End With
End If
End If
' Szűrés törlése
ws1.AutoFilterMode = False
Next filterValue
' CDO objektumok bezárása
Set CDO_Mail = Nothing
Set CDO_Config = Nothing
' Időzítő újraindítása 1 percre
Application.OnTime Now + TimeValue("00:01:00"), "ThisWorkbook.SaveAndCloseWorkbook"
End If
End Sub
Sub SaveAndCloseWorkbook()
' Táblázat mentése és bezárása
ThisWorkbook.Save
ThisWorkbook.Close
End Sub
Function RangetoHTML(rng As Range)
' Függvény a táblázat HTML formátumban történő konvertálásához
Dim fso As Object
Dim ts As Object
Dim TempFile As String
Dim TempWB As Workbook
TempFile = Environ$("temp") & "\" & Format(Now, "dd-mm-yy h-mm-ss") & ".htm"
' Táblázat exportálása HTML fájlba
rng.Copy
Set TempWB = Workbooks.Add(1)
With TempWB.Sheets(1)
.Cells(1).PasteSpecial Paste:=8
.Cells(1).PasteSpecial xlPasteValues, , False, False
.Cells(1).PasteSpecial xlPasteFormats, , False, False
.Cells(1).Select
Application.CutCopyMode = False
On Error Resume Next
.DrawingObjects.Visible = True
.DrawingObjects.Delete
On Error GoTo 0
End With
' HTML fájlba mentés
With TempWB.PublishObjects.Add( _
SourceType:=xlSourceRange, _
Filename:=TempFile, _
Sheet:=TempWB.Sheets(1).Name, _
Source:=TempWB.Sheets(1).UsedRange.Address, _
HtmlType:=xlHtmlStatic)
.Publish (True)
End With
' HTML tartalom olvasása
Set fso = CreateObject("Scripting.FileSystemObject")
Set ts = fso.GetFile(TempFile).OpenAsTextStream(1, -2)
RangetoHTML = ts.ReadAll
ts.Close
RangetoHTML = Replace(RangetoHTML, "align=center x:publishsource=", _
"align=left x:publishsource=")
' Táblázat törlése és ideiglenes munkafüzet bezárása
TempWB.Close SaveChanges:=False
Kill TempFile
Set ts = Nothing
Set fso = Nothing
Set TempWB = Nothing
End Function
Function CreateEmailTable(ws As Worksheet) As Object
' E-mail címek táblázatának létrehozása és feltöltése
Dim emailTable As Object
Set emailTable = CreateObject("Scripting.Dictionary")
Dim i As Long
Dim lastRow As Long
lastRow = ws.Cells(ws.Rows.Count, "B").End(xlUp).Row
For i = 1 To lastRow
Dim nev As String
Dim email As String
nev = ws.Cells(i, 2).Value
email = ws.Cells(i, 3).Value
emailTable(nev) = email
Next i
Set CreateEmailTable = emailTable
End Function
Function GetEmailFromTable(emailTable As Object, key As Variant) As String
' E-mail cím lekérdezése a táblázatból a megadott kulcs alapján
On Error Resume Next
GetEmailFromTable = emailTable(key)
On Error GoTo 0
End Function
-
Delila_1
veterán
válasz
andreas49 #52394 üzenetére
Megnyitod az első nagy fájlt. Felveszel egy változót a füzet nevével.
Rendezed a tartományt az évszám szerint. Evszam változót veszel fel. Az első évszám az oszlopban.
Kijelölöd a másolandó tartományt –első sor=Match(Evszam, columns(1),0) , utolsó sor= Match(Evszam, columns(1),1)
.
Innen lesz az ismétlés
Megnyitod a füzetet, ahova másolni akarod külön lapokra az évszám szerinti adatokat. Ellenőrzöd, hogy van-e már Evszam nevű lap.
Dim WS As Workbook, Evszam As String
Evszam = "2024" ’az oszlopban lévő első évszám
On Error Resume Next
Set WS = Sheets(Evszam)
If Err.Number = 9 Then
Sheets.Add.Name = Evszam
Else
Sheets(Evszam).Select
End If
On Error GoTo 0
Kikeresed az első üres sort, beilleszted a tartományt.
Eddig
Vissza az első nagy fájlba, megadod a következő évszámot – ennek asora=range(„A” & Match(Evszam, columns(1),1)+1
. Ezt az értéket adod meg új évszámként.Vajh' mennyire követhető ez?
-
föccer
nagyúr
válasz
föccer #52285 üzenetére
Private Sub Workbook_Open()
Dim oFSO As Object
Dim oFolder As Object
Dim oFile As Object
Dim i As Integer
Dim Fileok_szama As Integer
Dim Fnev As String
Dim Kell_e_menteni As Boolean
Dim SFnev As String
i = 0
Filok_szama = 0
Fnev = ""
Kell_e_menteni = True
SFnev = ""
Sheets("Save_log").Range("T:U").ClearContents
Set oFSO = CreateObject("Scripting.FileSystemObject")
On Error Resume Next
If Sheets("Save_log").Range("B7").Value <> "" Then
Set oFolder = oFSO.GetFolder(Sheets("Save_log").Range("B7").Value)
Else
Set oFolder = oFSO.GetFolder(Sheets("Save_log").Range("B8").Value)
End If
If Err = 0 Then
For Each oFile In oFolder.Files
If oFile.Name = Sheets("Save_log").Range("B5").Value Then
Kell_e_menteni = False
End If
Sheets("Save_log").Cells(i + 1, 20) = oFile.Name
Sheets("Save_log").Cells(i + 1, 21).Formula = "=IFERROR(MATCH(T" & i + 1 & ",M:M,0),0)"
i = i + 1
Next oFile
Filok_szama = i
For i = 1 To Filok_szama
If Sheets("Save_log").Cells(i, 21).Value = 0 Then
Fnev = oFolder & "\" & Sheets("Save_log").Cells(i, 20).Value
Kill Fnev
End If
Next
If Kell_e_menteni = True Then
SFnev = Sheets("Save_log").Range("B7").Value & Sheets("Save_log").Range("B5").Value
ActiveWorkbook.SaveAs Filename:=SFnev
End If
Else
If Sheets("Save_log").Range("B7").Value <> "" Then
MkDir Sheets("Save_log").Range("B7").Value
Else
MsgBox "Nem találom a biztonsági mentés helyét. Kérlek add meg a biztonsági mentés helyét."
Call XBUP_mentesi_hely_Valasztas
MkDir Sheets("Save_log").Range("B7").Value
End If
End If
On Error GoTo 0
End Sub
-
13128814
tag
válasz
Fferi50 #51270 üzenetére
Utána az AI:AR utolsó sora ami szintén sum függvényekből áll bemásolódik a következő helyre:
[link] (utolsó sor)
[link] (ide másolódik)Ami izgi, az az, hogy utána generálódik még egy pivot, viszont ott már azokat a kártyákat vizsgáljuk ahol a változás "1":
Biztos van szofisztikáltabb megoldás ezekre, én is csak örököltem ezt a feladatot, csak mivel simán elmegy 1 - 1,5 óra rá hetente, gondoltam megpróbálom lemakrózni. Az más kérdés hogy már annyi munkaórám van benne, mintha fél évig manuálisan töltögettem volna.
De ez a "tudás" már az enyém!
Végül is úgy oldottam meg, hogy bekapcsoltam a szűrőket, és utána húztam végig a képleteket:
With PSheet.PivotTables("PIVOT").PivotFields("változás")
.Orientation = xlPageField
.Position = 2
.PivotItems("0").Visible = True
On Error Resume Next
.PivotItems("(blank)").Visible = False
.PivotItems("1").Visible = False
On Error GoTo 0
End With
With PSheet.PivotTables("PIVOT").PivotFields("Elérhető")
.Orientation = xlPageField
.Position = 3
.PivotItems("1").Visible = True
.PivotItems("2").Visible = True
' Hide other items if present
On Error Resume Next
.PivotItems("(blank)").Visible = False
.PivotItems("0").Visible = False
On Error GoTo 0
End With
Bár ettől függetlenül nagyon zavar hogy ilyen lett, mert így nem tetszik. Kicsit tróger megoldásnak érzem. -
13128814
tag
Sziasztok!
Egy pivot generálásnál akadtam el és a ChatGPT sem barátom már ebben.
A jelenség az, hogy ha a generált pivotban szűrök, akkor a mellette lévő sorok nem követik le a szűrést hanem fixen ott maradnak (mármint a pivot tartomány melletti sorok). Ezzel az a baj, hogy az AH-nak egyenlőnek kell lennie az A oszlopban lévő adatokkal (ebben a formában: A6 = AH6), mert utána sok képletem van. Csak mivel a pivotban alkotott szűrés nincs kihatással az AH-tól kezdődő oszlopokra, így a képletek fals számokat kalkulálnak. Hogyan tudnám függővé tenni a többi oszlop sorát is a pivot szűrésétől?
Itt generálom le a pivotot:
Sub pivot(ByRef ujWb As Workbook)
Dim PTable As pivotTable
Dim PCache As PivotCache
Dim PRange As Range
Dim PSheet As Worksheet
Dim DSheet As Worksheet
Dim LR As Long
Set PSheet = ujWb.Worksheets(1)
Set DSheet = ujWb.Worksheets(2)
LR = DSheet.Cells(Rows.Count, 1).End(xlUp).Row
Set PRange = DSheet.Range("A2:S" & LR)
Set PCache = ujWb.PivotCaches.Create _
(xlDatabase, SourceData:=PRange)
On Error Resume Next
Set PTable = PCache.CreatePivotTable(TableDestination:=PSheet.Cells(1, 1), TableName:="PIVOT")
On Error GoTo 0
If PTable Is Nothing Then
MsgBox "Nem sikerült létrehozni a pivot táblát. Ellenőrizd a célcellát és az adatokat.", vbExclamation
Else
' Pivot tábla létrehozva sikeresen, folytasd a kód futtatását
With PSheet.PivotTables("PIVOT").PivotFields("Design_no")
.Orientation = xlRowField
.Position = 1
End With
With PSheet.PivotTables("PIVOT").PivotFields("Code")
.Orientation = xlColumnField
.Position = 1
End With
With PSheet.PivotTables("PIVOT").PivotFields("Kártya gyári szám")
.Orientation = xlDataField
.Position = 1
End With
With PSheet.PivotTables("PIVOT").PivotFields("CH")
.Orientation = xlPageField
.Position = 1
End With
With PSheet.PivotTables("PIVOT").PivotFields("változás")
.Orientation = xlPageField
.Position = 2
End With
With PSheet.PivotTables("PIVOT").PivotFields("Elérhető")
.Orientation = xlPageField
.Position = 3
End With
End If
End Sub
Itt töltöm ki az AH-t:
Sub pivotAtalakitas(ByRef ujWb As Workbook)
Dim LR As Long
Dim ws As Worksheet
Dim LastRowCell As Range
Set ws = ujWb.Worksheets("PIVOT")
Set LastRowCell = ws.Columns("A").Find(What:="*", After:=ws.Cells(1, "A"), LookIn:=xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlPrevious)
If Not LastRowCell Is Nothing Then
LR = LastRowCell.Row
Debug.Print LR
Dim i As Long
For i = 6 To LR
ws.Cells(i, "AH").Value = ws.Cells(i, "A")
Next i
Else
Debug.Print "A oszlop üres"
End If
ThisWorkbook.Worksheets("Fejléc").Range("A4:J5").Copy
ujWb.Worksheets(1).Range("AI4").PasteSpecial
Application.CutCopyMode = False
End Sub
-
Fferi50
Topikgazda
válasz
föccer #51018 üzenetére
Szia!
A fileokat begyűjtő ciklus elé:On Error Resume Next
A Workbooks.Open utasítás után:
If Err=0 Then
' Ide jönnek a sikeres megnyitás utáni műveletek
a fájlbegyűjtő ciklus Next utasítása elé (ami most az utolsó sor)
Else
' Ide jön a hibakezelő 2 sorod +
Err=0
End If
A folyamat (makró) legvégén pedig On Error Goto 0 - a hibakezelés visszaadása a VBA-nak.
Üdv. -
Mutt
senior tag
válasz
andreas49 #50785 üzenetére
Szia,
Nézd meg ezt az UDF-et.
Használata: =Hasonlo(<cella amihez hasonlót keresünk>;<tartomány a hasonló szövegekkel>;<max eltérések száma>;<kis és nagybetű eltérjen>)Function Hasonlok(mit As Range, hol As Range, Optional max_elteres As Long = 2, Optional kisnagybetuazonos As Boolean = False) As Variant
Dim dictMit As Object
Dim dictHol As Object
Dim adat As Range
Dim c As Long, elteres As Long
Dim key As String, val As Long
Dim collEredmeny As New Collection
Dim arrEredmeny()
'late biding-gal létrehozunk két szótárt, ahol {betű:darabszám} párosokat tudunk képezni
Set dictMit = CreateObject("Scripting.Dictionary")
Set dictHol = CreateObject("Scripting.Dictionary")
'on error a collection miatt kell, mert kiakad ha egy már létező elemet akarunk újra felvenni
On Error Resume Next
'végigmegyünk a megadott tartomány elemein
For Each adat In hol
'átugorjuk ha véletlenül a tartomány rész az eredeti szöveg amihez hasonlókat keresünk
If adat.Address <> mit.Address Then
'az eredeti szöveget és hasonlóság miatt vizsgáltat felbonyjuk {betű:darabszám} párosokra
Call felbont(Trim(adat.Text), dictHol, kisnagybetuazonos)
Call felbont(Trim(mit.Text), dictMit, kisnagybetuazonos)
'megnézzük, hogy a két szövegben mely betük egyeznek és a darabszámukat csökkentjük a
'másik szövegben található darabszámmal
For c = 0 To dictMit.Count - 1
key = dictMit.Keys()(c)
If dictHol.exists(key) Then
val = dictHol(key)
If val >= dictMit(key) Then
dictHol(key) = val - dictMit(key)
dictMit(key) = 0
Else
dictMit(key) = dictMit(key) - val
dictHol(key) = 0
End If
End If
Next c
'eltéresek megszámolása
elteres = szamol(dictMit) + szamol(dictHol)
'ha a limit alatt vagyunk eltérésekben akkor elrakjuk a szöveget
If elteres <= max_elteres Then collEredmeny.Add adat.Text
End If
Next adat
On Error GoTo 0
'tömbként visszaadjuk a talált elemeket ha vannak, különben üres szöveget adunk
If collEredmeny.Count > 0 Then
ReDim arrEredmeny(1 To collEredmeny.Count)
For c = 1 To collEredmeny.Count
arrEredmeny(c) = collEredmeny.Item(c)
Next c
Hasonlok = arrEredmeny
Else
Hasonlok = ""
End If
End Function
Private Function felbont(s As String, o As Object, m As Boolean)
Dim c As String
Dim x As Long
'töröljük az eddigi tartalmat
o.RemoveAll
'ha szükséges akkor mindent nagybetűsre alakítunk
If m Then s = UCase(s)
'felszabdaljuk a szöveget {betu:darabszám} párosokra
While Len(s) > 0
c = Left(s, 1)
x = Len(s) - Len(Replace(s, c, ""))
o.Add c, x
s = Replace(s, c, "")
Wend
End Function
Private Function szamol(o As Object) As Long
Dim x As Long
'megszámoljuk hány esetben fordul elő NEM nullaszor egy betű
'ezek azok amelyek a másik szövegben nem voltak megtalálhatók
szamol = 0
For x = 0 To o.Count - 1
If o.Items()(x) > 0 Then szamol = szamol + 1
Next x
End Functionüdv
-
Delila_1
veterán
válasz
Silious #50625 üzenetére
Indítás előtt érdemes kitörölni az eddig bevitt képeket: Ctrl + g-re előjön az Ugrás menü, Irányított, Objektumok. Ez kijelöli az összes képet, Delete.
Modulba tedd az alábbi makrót, ami az összes, A oszlopban szereplő képnév mellé beteszi a képet a C oszlopba..Sub Kepbeszuras()
Dim utvonal As String, kep As String, sor As Long, usor As Long
usor = Range("A" & Rows.Count).End(xlUp).Row
utvonal = "D:\Jpg\" ' itt add meg a saját útvonaladat
For sor = 1 To usor
kep = utvonal & Cells(sor, 1) & ".jpg"
Cells(sor, 3).Select
On Error Resume Next
ActiveSheet.Pictures.Insert(kep).Select
Selection.Left = Cells(sor, 3).Left + 5
Selection.Top = Cells(sor, 3).Top + 5
Selection.Width = 40 'a kép szélessége
Selection.Height = 30 'a kép magassága
On Error GoTo 0
Next
End Sub -
Delila_1
veterán
válasz
Silious #50610 üzenetére
A makrót a lapodhoz rendeld a Téma összefoglaló szerint.
Mikor beírsz az A oszlopba egy nevet, a megadott utvonal mappából betölti a kep nevű képet a C oszlop azonos sorába.
A makró megjegyzései sorában módosíthatsz az útvonalon, kiterjesztésen, és a képek méretein.Private Sub Worksheet_Change(ByVal Target As Range)
Dim utvonal As String, kep As String
If Target.Column = 1 Then
utvonal = "D:\Jpg\" ' itt add meg a saját útvonaladat
kep = utvonal & Target.Value & ".jpg" 'ha nem jpg a kiterjesztés, írd át
Range(Target.Address).Offset(0, 2).Select
On Error Resume Next
ActiveSheet.Pictures.Insert(kep).Select
Selection.Left = Target.Value.Offset(0, 2).Left + 5
Selection.Top = Target.Value.Offset(0, 2).Top + 5
Selection.Width = 40 'a kép szélessége
Selection.Height = 30 'a kép magassága
Range(Target.Address).Select
On Error GoTo 0
End If
End Sub -
TheSaint
aktív tag
Sziasztok!
Worksheet Change eseménnyel kapcsolatban kérnék segítséget, nem ismerem még sajnos.
A feladat egy oszlop (K) celláinak a változása esetén küldjön emailt az adott sor C oszlopában szereplő névhez tartozó email címre. Az emailcímet a munka1 lapon lévő L név oszlop mellett lévő M oszlopban található.
Az emilküldés része már le van kezelve, csak az eseményfigyeléssel nem bírok:Sub Visszajelzes()
On Error Resume Next
'Public Sub SendEMail(
Dim MailFr As String, MailCC As String, MailTo As String, MailSubject As String, MailText As String
Dim CDOMsg As Object
Dim CDOConf As Object
Dim CDOFields As Object
Then MailFr = Munka1.Cells(i, "M")
Next i
MailTo = Munka1.Cells(2, "H")
If IsEmpty(Munka1.Cells(3, "H")) = False Then MailCC = Munka1.Cells(3, "H")
If IsEmpty(Munka1.Cells(4, "H")) = False Then MailCC = MailCC & "; " & Munka1.Cells(4, "H")
MailCC = MailCC & "; " & MailFr
MailSubject = "Visszajelzés érkezett"
If
Then
MailText = MailText & Chr(10) & _
Munka2.Cells(i, "A") & " " & Munka2.Cells(i, "B") & " " & Munka2.Cells(i, "C") & " " & Munka2.Cells(i, "D") & " " & Munka2.Cells(i, "E") & " " & Munka2.Cells(i, "F") & " " & Munka2.Cells(i, "G") & " " & Munka2.Cells(i, "H") & " " & Munka2.Cells(i, "I") & Munka2.Cells(i, "J")
Next i
End If
'On Error GoTo ERRORHANDLER
Set CDOMsg = CreateObject("CDO.Message")
Set CDOConf = CreateObject("CDO.Configuration")
CDOConf.Load -1 ' CDO Source Defaults
Set CDOFields = CDOConf.Fields
With CDOFields
.Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "192.168.1."
.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25
.Item("http://schemas.microsoft.com/cdo/configuration/smtpconnectiontimeout") = 60
'Anonim
.Item("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 0
'Jelszóval:
'.Item("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 1
'.Item("http://schemas.microsoft.com/cdo/configuration/Sendusername") = ""
'.Item("http://schemas.microsoft.com/cdo/configuration/SendPassword") = ""
.Update
End With
Set CDOMsg.Configuration = CDOConf
CDOMsg.Subject = MailSubject
CDOMsg.From = MailFr
CDOMsg.To = MailTo
CDOMsg.CC = MailCC
CDOMsg.TextBody = MailText
CDOMsg.Send
Set CDOMsg = Nothing
Set CDOConf = Nothing
Set CDOFields = Nothing
End Sub
-
Delila_1
veterán
A lenti 3 makrót másold be egy modulba. Az elsőt indítod, az meghívja a másik kettőt.
Törli a Store lapot, majd feldob egy fájlválasztó ablakot.
Indítás előtt a harmadik makróban a Munka2 nevet írd át az Update füzeted másolandó lapja nevére.
Nem kell képletekkel "beszívni" az adatokat, mert az Update füzetből a teljes lapot másoljuk az Original-ba, majd az esetleges képletek helyére értékeket illesztünk be. Ez így gyorsabb, de az összevont cellák miatt mindenféle hiba állna elő nélküle.Option Explicit
Public WB
Sub Store_lap_torlese()
Dim FN
Application.DisplayAlerts = False
On Error Resume Next
Set FN = Sheets("Store")
If Err.Number = 0 Then Sheets("Store").Delete
On Error GoTo 0
Application.DisplayAlerts = True
Fajl_Valasztas
End Sub
Sub Fajl_Valasztas()
Dim b As Integer
Set WB = Application.FileDialog(3)
With WB
.AllowMultiSelect = False
.Show
If .SelectedItems.Count = 0 Then
MsgBox "Nem választottál fájlt, befejezzük.", vbInformation, "Értesítés"
Exit Sub
Else
WB = .SelectedItems(1)
End If
End With
For b = Len(WB) To 1 Step -1
If Mid(WB, b, 1) = "\" Then
WB = Mid(WB, b + 1, 50)
Exit For
End If
Next
Sheets("Name").Cells(1) = WB
Workbooks.Open WB
Lapmasolas WB
End Sub
Sub Lapmasolas(WB)
Sheets("Munka2").Copy After:=Workbooks("Original.xlsm").Sheets(2)
Sheets("Munka2").Name = "Store"
Columns("A:Z").Copy
Range("A1").PasteSpecial xlPasteValues
Application.DisplayAlerts = False
Workbooks(WB).Close False
Application.DisplayAlerts = True
Sheets("Store").Cells(1).Select
End Sub -
Fferi50
Topikgazda
válasz
Fferi50 #50015 üzenetére
No itt a makró javított kiadása:
Sub akarmi()
Dim answer As Integer, wsFound As Boolean
Dim wbSearch As Workbook, wsSearch As Worksheet
wsfound = False
On Error Resume Next
Set wsSearch = Sheets(Textbox11.Value)
If Err = 0 Then
'ha van már ilyen munkalap, akkor feltesszük a kérdést
answer = MsgBox("Ilyen nevű munkatárs már rögzítve! Biztos, hogy folytatod a rögzítést?", vbQuestion + vbYesNo + vbDefaultButton2, "Munkatárs rögzítése")
If answer = vbYes Then wsSearch.Copy after:=Sheets("Havi_TEMPLATE"): wsFound = True
Else
Err = 0
Sheets("Szemely_TEMPLATE").Copy after:=Sheets("Havi_TEMPLATE")
ActiveSheet.Name = Textbox11.Value
wsFound=True
End If
On Error GoTo 0
If wsFound Then
With ActiveSheet
.Range("A2") = Textbox11.Value & " " & ComboBox7.Value
.Range("B2") = TextBox12.Value
.Range("C2") = TextBox13.Value
.Range("D2") = TextBox14.Value
End With
MsgBox "Munkatárs sikeresen rögzitve! Kérlek zárd be és nyisd meg újra a programot!"
End If
Textbox11.Value = ""
ComboBox7.Value = ""
TextBox12.Value = ""
TextBox13.Value = ""
TextBox14.Value = ""
'Sheets(xx).Activate az alapmunkalap aktíválása, ha szükséges.
End Sub -
Fferi50
Topikgazda
válasz
istvankeresz #50013 üzenetére
Szia!
Inkább ezt próbáld ki, mert a másik nem igazán jó:Sub akarmi()
Dim answer As Integer, wsFound As Boolean
Dim wbSearch As Workbook, wsSearch As Worksheet
wsfound = True
On Error Resume Next
Set wsSearch = Sheets(Textbox11.Value)
If Err = 0 Then
'ha van már ilyen munkalap, akkor feltesszük a kérdést
answer = MsgBox("Ilyen nevű munkatárs már rögzítve! Biztos, hogy folytatod a rögzítést?", vbQuestion + vbYesNo + vbDefaultButton2, "Munkatárs rögzítése")
If answer = vbYes Then wsSearch.Copy after:=Sheets("Havi_TEMPLATE"): wsFound = True
Else
Err = 0
Sheets("Szemely_TEMPLATE").Copy after:=Sheets("Havi_TEMPLATE")
ActiveSheet.Name = Textbox11.Value
End If
On Error GoTo 0
If wsFound Then
With ActiveSheet
.Range("A2") = Textbox11.Value & " " & ComboBox7.Value
.Range("B2") = TextBox12.Value
.Range("C2") = TextBox13.Value
.Range("D2") = TextBox14.Value
End With
MsgBox "Munkatárs sikeresen rögzitve! Kérlek zárd be és nyisd meg újra a programot!"
End If
Textbox11.Value = ""
ComboBox7.Value = ""
TextBox12.Value = ""
TextBox13.Value = ""
TextBox14.Value = ""
'Sheets(xx).Activate az alapmunkalap aktíválása, ha szükséges.
End Sub
Egy kis magyarázat hozzá:
Nem kell végigpörgetni a munkalapokat, mivel a vba hibakezeléssel megállapítható, ha van már ilyen munkalap => a Set után ha nincs hiba, akkor van már. Amennyiben ugyanolyan nevű új személy van, akkor ezt a munkalapot másoljuk, aminek az lesz az eredménye, hogy az Excel automatikusan ad egy sorszámot a névhez! ezzel nekünk nem kell foglalkozni.
Ha nincs, akkor másoljuk a Templatet.
Mivel a másolt munkalap lesz az aktív, utána beírhatjuk a szükséges adatokat az új munkalapra.
Remélem sikerülni fog.
Üdv. -
istvankeresz
aktív tag
válasz
Fferi50 #50007 üzenetére
Szia!
Azért, mert a bezárás nélkül nem látszik az új berögzített személy, azaz a új worksheet egy másik comboboxban, ahol ezt az új worksheet-t ki lehet választani. Ezt még nem sikerült megoldanom. De rajta vagyok ezen is.
Esetleg valami GoTo megoldás nem lehet jó nekem? Talán ha az egyik feltétel teljesül, akkor ugorjon ide, ha a másik, akkor ugorjon oda.
-
the radish
senior tag
Köszönöm!
+1:
Adott egy zip fájlt kitömörítő makró:Sub Unzip()
Dim FSO As Object
Dim oApp As Object
Dim Fname As Variant
Dim FileNameFolder As Variant
Dim DefPath As String
Fname = Application.GetOpenFilename(Filefilter:="Zip Files (*.zip), *.zip", _
MultiSelect:=False)
If Fname = False Then
'Do nothing
Else
'Destination folder
DefPath = "D:\Data\" '<<< Change path
If Right(DefPath, 1) <> "\" Then
DefPath = DefPath & "\"
End If
FileNameFolder = DefPath
' 'Delete all the files in the folder DefPath first if you want
' On Error Resume Next
' Kill DefPath & "*.*"
' On Error GoTo 0
'Extract the files into the Destination folder
Set oApp = CreateObject("Shell.Application")
oApp.Namespace(FileNameFolder).CopyHere oApp.Namespace(Fname).items
MsgBox "You find the files here: " & FileNameFolder
On Error Resume Next
Set FSO = CreateObject("scripting.filesystemobject")
FSO.deletefolder Environ("Temp") & "\Temporary Directory*", True
End If
End SubSzeretném a "GetOpenFilename" opciójaként megadni, hogy pl. a fájl tallózása során a "munka" elnevézű fájlokra is szűrjön, de eddig csak a fájl típus szűrést találtam.
Egy másik formációval ez sikerült, ott meg a kitömörítéssel nem jutok dülőre:
Sub OpenFileFromDefaultPath()
Dim fileDialogBox As Office.FileDialog
Dim fileName As String
Set fileDialogBox = Application.FileDialog(msoFileDialogFilePicker)
With fileDialogBox
.InitialFileName = "D:\Data\"
.InitialFileName = "*munka*"
If .Show = True Then
' e nélkül is működik
fileName = .SelectedItems(1)
End If
End With
End Sub -
eszgé100
őstag
Sziasztok!
Az alabbi funkcioval megvizsgalom, hogy egy adott fajl meg van-e mar nyitva a ciklus egy korabbi lepesebeol, ha nincs, akkor a kovetkezo lepes a ciklusban megnyitja a hatterben elokeszitve a kod tovabbi lepeseihez.
Remekul mukodik, de sajnos halozaton megosztottak a munkafuzetek igy elofordul, hogy mas is eppen hasznalja valamelyiket. Ebben az esetben ugyanugy 70-es hibakodot kapok, ami szerint meg van nyitva, de nem tudok innentol kulonbseget tenni, hogy az a sajat gepemen van-e megnyitva, vagy valaki masen. Olyan feltetelt szeretnek megvizsgalni, hogyha mas felhasznalonal van megnyitva, akkor nalam automatikusan nyiljon meg Read-Only modban, ugyanugy hatterben.
Function IsFileOpen(sPath As String)
Dim fileNum As Integer
Dim errNum As Integer
'Allow all errors to happen
On Error Resume Next
fileNum = FreeFile()
'Try to open and close the file for input.
'Errors mean the file is already open
Open sPath For Input Lock Read As #fileNum
Close fileNum
'Get the error number
errNum = Err
'Do not allow errors to happen
On Error GoTo 0
'Check the Error Number
Select Case errNum
'errNum = 0 means no errors, therefore file closed
Case 0
IsFileOpen = False
'errNum = 70 means the file is already open
Case 70
IsFileOpen = True
'Something else went wrong
Case Else
IsFileOpen = errNum
End Select
End FunctionA kodreszlet, ami a megnyitast vegzi:
Application.ScreenUpdating = True
ma.Visible = True
fileName = Right(sPath, Len(sPath) - InStrRev(sPath, "\"))
Application.StatusBar = "Processing File: " & fileName
Application.ScreenUpdating = False
If IsFileOpen(sPath) = False Then Workbooks.Open sPath
Windows(fileName).Visible = False -
sztanozs
veterán
válasz
dreizwanzig #48138 üzenetére
1) Filter
2) Cellák kijelölése
3) Find & Search > GoTo Special...
4) Visible cells only
5) Conditional formatting ... -
Delila_1
veterán
válasz
Fferi50 #47918 üzenetére
Ez csak azt mutatja, hogy tabulálással jól lehet láttatni az összetartozó egységeket. Hibakezeléssel:
If Range("A1") > 0 Then
Go To Hiba
Else
Range("B1") = 20: Exit Sub
End If
Hiba:
MsgBox "..."
On Error GoTo 0
Egy rossz példa találomra erről a fórumról:
Select Case CStr(freq)
Case "4 weekly", "monthly"
nyomtatni = True
Case "2 monthly"
nyomtatni = Month(nextmonth) Mod 2 = 1
Case "3 monthly"
nyomtatni = Month(nextmonth) Mod 3 = 1
End Select
-
Fferi50
Topikgazda
válasz
eszgé100 #47915 üzenetére
Szia!
1.)"a ciklus későbbi lépéseiben még szükség lesz rájuk, pl amikor egy workbookban van 20 worksheet, de nem egyszerre ömlesztve akarom őket kinyomtatni,"
ugyanakkor a ciklusban minden sornál ott van a Workbooks.Open, anélkül, hogy megnéznéd, nincs-e már megnyitva az adott file.
"mert utána akkor még kézzel is le kell válogatnom később"
másrészt, ha egy következő file másik munkalapját nyomtatod utána, akkor nem kell kézzel leválogatni az előzőtől?
2.a) szerintem alapvetően akkor van szükség GoTo utasításra, ha a makró/folyamat rosszul van megtervezve, megszervezve. Az ugrálás rontja az áttekinthetőséget és szerintem lassítja is a végrehajtást. Egy esetben látom indokoltnak, a futási hibák kezelésénél, ott ahol a hiba természete miatt külön hibakezelési rutinra van szükség az adott makrón belül. (Lásd: On Error Goto .. utasítás ).
2.b) Mod funkció -> egy osztás maradék eredményét adja vissza. Nálad azért 1 a feltétel értéke, mert mindig az adott ciklus utáni első hónapban nyomtatod a munkafüzetet (vagy ha úgy jobban tetszik, a ciklus első hónapjában). 3 havonta esetén az 1,4,7,10 hónapban. De mondhatnád azt is, hogy a 3,6,9,12 hónapban akarod nyomtatni, akkor a 0 maradék lenne a feltétel. Tehát te döntöd el, melyik hónapban kezdődjön a nyomtatási ciklus és a maradékot annak megfelelően használod feltételnek. Ugyanez igaz a többi ciklikus feltételre is.
3.a) Hibakezelésen tehát a felhasználói hibák vizsgálatát érted (amivel egyrészt megelőzheted fals adatok dokumentálását, másrészt program futási hibák keletkezését). Azt gondolom, erre az esetre érdemes egy külön függvényt írni, ami megizsgálja a kritikus összefüggéseket és logikai értéket ad vissza a vizsgálat eredményéről, amitől függően megy tovább a ciklus vagy elengedi azt a munkafüzetet/lapot.
Érdemes ettől függően azon is gondolkodni, hogyan kezeljük a futás idejű hibákat, mivel nem szeretnénk, ha ezek miatt utólag kellene a felhasználókkal hibát javíttatni.
3.b) Szűrés esetén a Darabteli függvény nincs tekintettel a szűrt állapotra valóban. Ebben az esetben a Save&close cella tartalma helyett meg kell nézned a szűrt területet makróval.
A D oszlop szűrt tartományát a következőképpen kapod meg:ActiveSheet.UsedRange.Columns("D").SpecialCells (xlCellTypeVisible)
A Find metódussal meghatározhatod a keresett érték helyét.Dim scrange As Range
Majd a nyomtatás után:Set scrange=ActiveSheet.UsedRange.Columns("D").SpecialCells (xlCellTypeVisible).Find(what:=sPath,after:=Range("D" & counter))
If scrange.Row<=counter then --- save & close
Mivel nincs további találalat a szűrt tartományban, ezért az első találatra fog visszaugrani.
Üdv. -
eszgé100
őstag
válasz
Fferi50 #47894 üzenetére
1.) pontosan, ott nem kell bezárni a fájlt, mert még a ciklus későbbi lépéseiben még szükség lesz rájuk, pl amikor egy workbookban van 20 worksheet, de nem egyszerre ömlesztve akarom őket kinyomtatni, mert utána akkor még kézzel is le kell válogatnom később, amit nem szeretnék. A Save&Close oszlop celláinak értéke az =IF(COUNTIF(D2:INDIRECT("D" & COUNTIF(D
,"<>")),D2)>1,"no","yes") függvénnyel van meghatározva, ami eddigi tesztjeim alapján dinamikusan változik, amikor ugyanaz az elérési útvonal kerül a Path oszlop celláiba. Amennyiben az adott elérési útvonal nem ismétlődik többet a maradék cellatartományban az érték Save&Close "yes"-re változik és a workbook ment és bezárul
2a.) mi pontosan a hátránya, hogyha GoTo-val ugrálok?
2b.) Másik ezzel kapcsolatban, hogy a Mod funkció működését nem teljesen értem, legalábbis az én esetemben. Pl ha "6 monthly"-t keresem, akkor azokat a hónapokat keresem, amelyeket 6-al oszthatóak maradék 1-el? Ez január és július esetében (1/6= 0 maradék 1) és (7/6=1 maradék 1), "yearly" pedig (1/12=0 maradék 1)?
2c.) címkéket megszűntettem if - end if-eket használva3.) hibakezelés, pl valami létfontosságú cella nincs kitöltve. Szűrést pedig úgy értem, hogy kézzel leszűröm az adatokat, majd arra eresztem rá a makrót, hiba a Save&Close-nál van, mert olyankor is a maradék tartományt figyeli, mikor az egyébként a szűrés miatt nem látszik.
+ A kódhoz hozzáadtam egy response-t, ami a user arcába tolja, hogy a makró milyen nyomtatókat fog használni, mindkettőt le kell okézni, csak így kerül az ellenörző cellába, ahonnan a makró majd használja. Ha valamelyik cella üres, akkor a kód megáll, és informálja a usert. Ezen kívül még hozzáadtam egy manual update oszlopot is az adattáblán, alapból ki van kapcsolva, de ha "yes" az értéke, akkor csak megnyitja a workbookot, majd megy tovább a ciklus, valamint egy néhány sort, hogy szűrést és manual update-et alaphelyzetbe állítsa miután a fájl megnyílik.
így néznek ki:
Sub Auto_Open()
Dim start As Date
Dim weekcom As Date
Dim today As Date
Dim response As VbMsgBoxResult
Dim lo As ListObject
Dim ws As Worksheet, ma As Worksheet
Dim lastrow As Long
Set lo = Worksheets("OpenClose").ListObjects(1)
lo.AutoFilter.ShowAllData
Set ma = Workbooks("FillerPrinter.xlsm").Worksheets("MainAssembly")
'ma.Unprotect "123"
Set ws = Workbooks("FillerPrinter.xlsm").Worksheets("OpenClose")
lastrow = ws.Range("A" & ws.Rows.Count).End(xlUp).Row
ws.Range("P2:P" & lastrow) = "no"
Worksheets("MainAssembly").Activate
Range("A1").Select
start = Sheets("MainAssembly").Range("F3").Value
today = Sheets("MainAssembly").Range("F7").Value
weekcom = start
Do While weekcom < today
weekcom = weekcom + 28
Loop
Sheets("MainAssembly").Range("F6").Value = weekcom
Dim Printers() As String
Dim N As Long
Dim S As String
Dim col As String
Dim bw As String
Printers = GetPrinterFullNames()
Sheets("MainAssembly").Range("F8:F9").Value = ""
For N = LBound(Printers) To UBound(Printers)
S = Printers(N) 'S & Printers(N) & vbNewLine
If InStr(S, "Microsoft") <> 0 And InStr(S, "Print") <> 0 Then col = S
If InStr(S, "HP Photosmart Wireless B109n-z") <> 0 And InStr(S, "Print") = 0 Then bw = S
Next N
response = MsgBox(col, vbOKCancel, "Confirm the Colour Printer")
If response = vbOK Then
Sheets("MainAssembly").Range("F8").Value = col
Else: MsgBox "Stop-Call-Wait", vbOKOnly
Exit Sub
End If
response = MsgBox(bw, vbOKCancel, "Confirm the B&W Printer")
If response = vbOK Then
Sheets("MainAssembly").Range("F9").Value = bw
Else: MsgBox "Stop-Call-Wait", vbOKOnly
Exit Sub
End If
'ma.Protect "123"
End SubSub EOM_Main_Assy_Workbooks()
'loop:
Dim sPath As String, ssheet As String, fileName As String
Dim lastrow As Long, counter As Long
Dim ws As Worksheet, tp As Worksheet, ma As Worksheet
'print:
Dim bw As String, col As String
Dim toprint As Boolean
'from main worksheet:
Dim sDate As String
Dim sWeek As String
Dim sWkcom As String
Dim nextmonth As Date
'from Table:
Dim freq As String
Dim area As String
Dim loc As String
Dim dat As String
Dim week As String
Dim wkcom As String
Dim procloc As String
Dim procname As String
Dim machloc As String
Dim machname As String
Dim printer As String
Dim copies As Integer
Dim saveandclose As String
Dim manual As String
Dim manualcheck As Boolean
sDate = "=[FillerPrinter.xlsm]MainAssembly!$F$4"
sWeek = "=[FillerPrinter.xlsm]MainAssembly!$F$5"
sWkcom = "=[FillerPrinter.xlsm]MainAssembly!$F$6"
Set ma = Workbooks("FillerPrinter.xlsm").Worksheets("MainAssembly")
nextmonth = ma.Range("F4")
col = ma.Range("F9")
bw = ma.Range("F9")
'1st condition
If ma.Range("F8") = "" Or ma.Range("F9") = "" Then
MsgBox prompt:="One or both printers are not selected." & VBA.Constants.vbNewLine & "Please click on Update / Reset button!" & VBA.Constants.vbNewLine & "If not sure, please S-C-W!"
Exit Sub
End If
'End of 1st condition
Set ws = Workbooks("FillerPrinter.xlsm").Worksheets("OpenClose")
lastrow = ws.Range("A" & ws.Rows.Count).End(xlUp).Row
counter = 2
manualcheck = False
Do While counter <= lastrow
'2nd condition
If Not ws.Range("A" & counter).EntireRow.Hidden Then
freq = ws.Range("A" & counter)
area = ws.Range("B" & counter)
loc = ws.Range("C" & counter)
sPath = ws.Range("D" & counter)
ssheet = ws.Range("E" & counter)
dat = ws.Range("F" & counter)
week = ws.Range("G" & counter)
wkcom = ws.Range("H" & counter)
procloc = ws.Range("I" & counter)
procname = ws.Range("J" & counter)
machloc = ws.Range("K" & counter)
machname = ws.Range("L" & counter)
printer = ws.Range("M" & counter)
copies = ws.Range("N" & counter)
saveandclose = ws.Range("O" & counter)
manual = ws.Range("P" & counter)
'freq check
Select Case CStr(freq)
Case "4 weekly", "monthly"
toprint = True
Case "2 monthly"
toprint = Month(nextmonth) Mod 2 = 1
Case "3 monthly"
toprint = Month(nextmonth) Mod 3 = 1
Case "6 monthly"
toprint = Month(nextmonth) Mod 6 = 1
Case "yearly"
toprint = Month(nextmonth) Mod 12 = 1
End Select
'open sheets
'3rd condition
If toprint Then
Application.ScreenUpdating = True
ma.Visible = True
fileName = Right(sPath, Len(sPath) - InStrRev(sPath, "\"))
Application.StatusBar = "Processing File: " & fileName
Application.ScreenUpdating = False
Workbooks.Open sPath
Windows(fileName).Visible = False
'4th condition
If CStr(manual) = "no" Then
'update sheets if necessary
If CStr(dat) <> "" Then Workbooks(fileName).Sheets(ssheet).Range(dat).Formula = sDate
If CStr(week) <> "" Then Workbooks(fileName).Sheets(ssheet).Range(week).Formula = sWeek
If CStr(wkcom) <> "" Then Workbooks(fileName).Sheets(ssheet).Range(wkcom).Formula = sWkcom
If CStr(procloc) <> "" Then Workbooks(fileName).Sheets(ssheet).Range(procloc).Formula = procname
If CStr(machloc) <> "" Then Workbooks(fileName).Sheets(ssheet).Range(machloc).Formula = machname
'print sheets
Set tp = Workbooks(fileName).Worksheets(CStr(ssheet))
Select Case CStr(printer)
Case "col"
Application.ActivePrinter = col
tp.PrintOut copies:=CStr(copies)
Case "bw"
Application.ActivePrinter = bw
tp.PrintOut copies:=CStr(copies)
Case Else
MsgBox "No printer selected"
End Select
'wait here a bit
Do While ActiveWindow.View = xlPrint
Loop
'time to save&close
If CStr(saveandclose) = "yes" Then Excel.Workbooks(fileName).Close SaveChanges:=True
Else:
'Windows(fileName).Visible = True
manualcheck = True
'End of 4th condition
End If
'End of 3rd condition
End If
'End of 2nd condition
End If
counter = counter + 1
Loop
Application.StatusBar = "Done!"
Application.ScreenUpdating = True
ma.Activate
Range("A1").Select
If manualcheck = True Then
MsgBox "Update and print the sheets manually"
Else: MsgBox "Done!"
End If
End Sub -
Fferi50
Topikgazda
válasz
eszgé100 #47881 üzenetére
Szia!
Apróságokat tennék hozzá, talán gyorsít valamit rajta:
1. Kérdés: ahol Save&Close =no ott nem kell bezárni a fájlt? Mert ebben az esetben sok-sok fájlod nyitva fog maradni.
Ha mégis be kell zárni, akkorIf CStr(saveandclose) = "yes" Then
Excel.Workbooks(fileName).Close SaveChanges:=True
Else: GoTo nextraw
End If
helyett javaslom:Excel.Workbooks(fileName).Close SaveChanges:= CStr(saveandclose) = "yes"
Ha nyitva kell hagyni, akkor is elég az IF-es sor a következőképpen:If CStr(saveandclose) = "yes" Then Excel.Workbooks(fileName).Close SaveChanges:=True
Nem kell hozzá ELSE és END IF.
2. Javaslat: én nagyon nem szeretem az ugrálást makrón belül, általában mindig meg lehet oldani e nélkül a feladatot. Nálad 2 cimke van: openworksheets és nextraw.
Egy új változó bevezetésével el lehet kerülni a cimkéhez ugrást.
Dim nyomtatni As Boolean
Ennek a változónak adunk értéket a Select Case utasításokon belül - ezt is egy picit egyszerűsítve:Select Case CStr(freq)
Case "4 weekly", "monthly"
nyomtatni = True
Case "2 monthly"
nyomtatni = Month(nextmonth) Mod 2 = 1
Case "3 monthly"
nyomtatni = Month(nextmonth) Mod 3 = 1
End Select
A két cimke helyére pedig:openworksheets: helyett:
If nyomtatni Then
.
.
nextraw: helyett
End If
Áttekinthetőbb és szerintem gyorsabb is lehet.
3. Kérdés:
Milyen szűrést szeretnél? Hol lenne helye a hibakezelésnek?Üdv.
-
eszgé100
őstag
válasz
Fferi50 #44543 üzenetére
"Nem tudom hány xls-ed van, de nem hiszem, hogy mindegyiket külön-külön el kellene látni ugyanazon funkciókat végző makrókkal. Én egy alap Excelt használnék, amiben a makrók benne vannak és abból intézném az összes többinek a megnyitását és kezelését. Így csak egy fájlt kell karbantartani, nem pedig x db-ot.
De lehet, hogy rosszul látom.
Üdv."Üdv Fferi50,
Nem láttad rosszul a dolgokat, jelenleg így állok a dologgal:
Ez a kód lefut megnyitáskor:
Option Explicit
Private Const HKEY_CURRENT_USER As Long = &H80000001
Private Const HKCU = HKEY_CURRENT_USER
Private Const KEY_QUERY_VALUE = &H1&
Private Const ERROR_NO_MORE_ITEMS = 259&
Private Const ERROR_MORE_DATA = 234
Private Declare PtrSafe Function RegOpenKeyEx Lib "advapi32" _
Alias "RegOpenKeyExA" ( _
ByVal HKey As Long, _
ByVal lpSubKey As String, _
ByVal ulOptions As Long, _
ByVal samDesired As Long, _
phkResult As Long) As Long
Private Declare PtrSafe Function RegEnumValue Lib "advapi32.dll" _
Alias "RegEnumValueA" ( _
ByVal HKey As Long, _
ByVal dwIndex As Long, _
ByVal lpValueName As String, _
lpcbValueName As Long, _
ByVal lpReserved As Long, _
lpType As Long, _
lpData As Byte, _
lpcbData As Long) As Long
Private Declare PtrSafe Function RegCloseKey Lib "advapi32.dll" ( _
ByVal HKey As Long) As Long
Public Function GetPrinterFullNames() As String()
Dim Printers() As String ' array of names to be returned
Dim PNdx As Long ' index into Printers()
Dim HKey As Long ' registry key handle
Dim Res As Long ' result of API calls
Dim Ndx As Long ' index for RegEnumValue
Dim ValueName As String ' name of each value in the printer key
Dim ValueNameLen As Long ' length of ValueName
Dim DataType As Long ' registry value data type
Dim ValueValue() As Byte ' byte array of registry value value
Dim ValueValueS As String ' ValueValue converted to String
Dim CommaPos As Long ' position of comma character in ValueValue
Dim ColonPos As Long ' position of colon character in ValueValue
Dim M As Long ' string index
' registry key in HCKU listing printers
Const PRINTER_KEY = "Software\Microsoft\Windows NT\CurrentVersion\Devices"
PNdx = 0
Ndx = 0
' assume printer name is less than 256 characters
ValueName = String$(256, Chr(0))
ValueNameLen = 255
' assume the port name is less than 1000 characters
ReDim ValueValue(0 To 999)
' assume there are less than 1000 printers installed
ReDim Printers(1 To 1000)
' open the key whose values enumerate installed printers
Res = RegOpenKeyEx(HKCU, PRINTER_KEY, 0&, _
KEY_QUERY_VALUE, HKey)
' start enumeration loop of printers
Res = RegEnumValue(HKey, Ndx, ValueName, _
ValueNameLen, 0&, DataType, ValueValue(0), 1000)
' loop until all values have been enumerated
Do Until Res = ERROR_NO_MORE_ITEMS
M = InStr(1, ValueName, Chr(0))
If M > 1 Then
' clean up the ValueName
ValueName = Left(ValueName, M - 1)
End If
' find position of a comma and colon in the port name
CommaPos = InStr(1, ValueValue, ",")
ColonPos = InStr(1, ValueValue, ":")
' ValueValue byte array to ValueValueS string
On Error Resume Next
ValueValueS = Mid(ValueValue, CommaPos + 1, ColonPos - CommaPos)
On Error GoTo 0
' next slot in Printers
PNdx = PNdx + 1
Printers(PNdx) = ValueName & " on " & ValueValueS
' reset some variables
ValueName = String(255, Chr(0))
ValueNameLen = 255
ReDim ValueValue(0 To 999)
ValueValueS = vbNullString
' tell RegEnumValue to get the next registry value
Ndx = Ndx + 1
' get the next printer
Res = RegEnumValue(HKey, Ndx, ValueName, ValueNameLen, _
0&, DataType, ValueValue(0), 1000)
' test for error
If (Res <> 0) And (Res <> ERROR_MORE_DATA) Then
Exit Do
End If
Loop
' shrink Printers down to used size
ReDim Preserve Printers(1 To PNdx)
Res = RegCloseKey(HKey)
' Return the result array
GetPrinterFullNames = Printers
End Function
Sub Auto_Open()
Dim start As Date
Dim weekcom As Date
Dim today As Date
start = Sheets("MainAssembly").Range("F3").Value
today = Sheets("MainAssembly").Range("F7").Value
weekcom = start
Do While weekcom < today
weekcom = weekcom + 28
Loop
Sheets("MainAssembly").Range("F6").Value = weekcom
Dim Printers() As String
Dim N As Long
Dim S As String
Dim col As String
Dim bw As String
Printers = GetPrinterFullNames()
For N = LBound(Printers) To UBound(Printers)
S = Printers(N) 'S & Printers(N) & vbNewLine
If InStr(S, "Microsoft") <> 0 And InStr(S, "Print") <> 0 Then col = S
If InStr(S, "HP Photosmart Wireless B109n-z") <> 0 And InStr(S, "Print") = 0 Then bw = S
Next N
Sheets("MainAssembly").Range("F8").Value = col
Sheets("MainAssembly").Range("F9").Value = bw
MsgBox col, vbOKOnly, "Colour Printer"
MsgBox bw, vbOKOnly, "BW Printer"
End SubEz pedig elvégzi a piszkos munkát:
Sub EOM_Main_Assy_Workbooks()
'loop:
Dim sPath As String, ssheet As String, fileName As String
Dim lastrow As Long, counter As Long
Dim ws As Worksheet, tp As Worksheet, ma As Worksheet
'printers:
Dim bw As String, col As String
'from main worksheet:
Dim sDate As String
Dim sWeek As String
Dim sWkcom As String
Dim nextmonth As Date
'from Table:
Dim freq As String
Dim area As String
Dim loc As String
Dim dat As String
Dim week As String
Dim wkcom As String
Dim procloc As String
Dim procname As String
Dim machloc As String
Dim machname As String
Dim printer As String
Dim copies As Integer
Dim saveandclose As String
sDate = "=[FillerPrinter.xlsm]MainAssembly!$F$4"
sWeek = "=[FillerPrinter.xlsm]MainAssembly!$F$5"
sWkcom = "=[FillerPrinter.xlsm]MainAssembly!$F$6"
Set ma = Workbooks("FillerPrinter.xlsm").Worksheets("MainAssembly")
nextmonth = ma.Range("F4")
col = ma.Range("F9")
bw = ma.Range("F9")
Set ws = Workbooks("FillerPrinter.xlsm").Worksheets("OpenClose")
lastrow = ws.Range("A" & ws.Rows.Count).End(xlUp).Row
counter = 2
Do While counter <= lastrow
ws.Activate
freq = Range("A" & counter)
area = Range("B" & counter)
loc = Range("C" & counter)
sPath = Range("D" & counter)
ssheet = Range("E" & counter)
dat = Range("F" & counter)
week = Range("G" & counter)
wkcom = Range("H" & counter)
procloc = Range("I" & counter)
procname = Range("J" & counter)
machloc = Range("K" & counter)
machname = Range("L" & counter)
printer = Range("M" & counter)
copies = Range("N" & counter)
saveandclose = Range("O" & counter)
'freq check
Select Case CStr(freq)
Case "4 weekly"
GoTo openworksheets
Case "monthly"
GoTo openworksheets
Case "2 monthly"
Select Case Month(nextmonth)
Case 1, 3, 5, 7, 9, 11
GoTo openworksheets
Case Else
GoTo nextraw
End Select
Case "3 monthly"
Select Case Month(nextmonth)
Case 1, 4, 7, 10
GoTo openworksheets
Case Else
GoTo nextraw
End Select
Case Else
GoTo nextraw
End Select
'open sheets
openworksheets:
Workbooks.Open sPath
fileName = Right(sPath, Len(sPath) - InStrRev(sPath, "\"))
'update sheets if necessary
Set tp = Workbooks(fileName).Worksheets(CStr(ssheet))
If CStr(dat) <> "" Then
Sheets(ssheet).Select
Range(dat).Select
ActiveCell.Formula = sDate
End If
If CStr(week) <> "" Then
Sheets(ssheet).Select
Range(week).Select
ActiveCell.Formula = sWeek
End If
If CStr(wkcom) <> "" Then
Sheets(ssheet).Select
Range(wkcom).Select
ActiveCell.Formula = sWkcom
End If
If CStr(procloc) <> "" Then
Sheets(ssheet).Select
Range(procloc).Select
ActiveCell.Formula = procname
End If
If CStr(machloc) <> "" Then
Sheets(ssheet).Select
Range(machloc).Select
ActiveCell.Formula = machname
End If
'print sheets
Select Case CStr(printer)
Case "col"
Application.ActivePrinter = col
tp.PrintOut copies:=CStr(copies)
Case "bw"
Application.ActivePrinter = bw
tp.PrintOut copies:=CStr(copies)
Case Else
MsgBox "No printer selected"
End Select
'wait here a bit
Do While ActiveWindow.View = xlPrint
Loop
'time to save&close
If CStr(saveandclose) = "yes" Then
Excel.Workbooks(fileName).Close SaveChanges:=True
Else: GoTo nextraw
End If
nextraw:
counter = counter + 1
Loop
Worksheets("MainAssembly").Select
Range("A1").Select
MsgBox "Done!"
End SubEz nem az összes workbook, amivel foglalkoznom kell, de egyelőre tesztnek elegendőek ezek is. Jelenlegi formájában a kód 88 sheetet kevesebb, mint 2 perc alatt megnyitott, update-elt, nyomtatóra küldött, majd bezárt
Már csak szűrést és hibakezelést kellene beleszőnöm valahogy.
Az egész csoportnak köszönöm mégegyszer az eddigi segítséget -
eszgé100
őstag
válasz
Delila_1 #47877 üzenetére
Köszönöm, de nem pontosan ilyen formában kerestem a duplikációt.
Van egy vba ciklusom, fentről lefelé halad, ezért nem releváns, hogy a tartomány felső részében található-e a duplikáció, lényeg, hogy a maradékban ne legyen, erre tökéletes volt Pakliman formulája, szerencsére működik ez is automatikusan, ha táblává alakítom. egyébként örök hálám az ötletért, megmentettél egy kör guglizástólValós felhasználása egyébként az lesz, hogy B oszlopban lesznek elérési útvonalak, többi oszlopban különböző paraméterek a ciklusnak, és az utolsó oszlopban lesznek tárolva a válaszok a Save&Close-ra. Ha az adott fájlt később még használja a ciklus, akkor nyitva hagyom (válasz no), ha nem akkor mentés és zárás (yes), példában pont fordítva kérdeztem, de az már csak részletkérdés.
Ezzel kapcsolatban meg is érkeztem ma esti fejtörőmhöz:
Ciklusomban egy bizonyos ponton elérkezek a nyomtatáshoz
Select Case CStr(printer)
Case "col"
Application.ActivePrinter = col
tp.PrintOut copies:=CStr(copies)
Case "bw"
Application.ActivePrinter = bw
tp.PrintOut copies:=CStr(copies)
Case Else
MsgBox "No printer selected"
End SelectMajd ezután megvizsgálom, hogy Save&Close "yes"-e?
If CStr(saveandclose) = "yes" Then
Excel.Workbooks(fileName).Close SaveChanges:=True
Else: GoTo nextraw
End If
Itt kezdődnek a bajok, a kettő közé kellene valami, ami megakasztja a cilkus további futását, amíg ez az ablak be nem záródik.Ugyanis, ha várni kell a nyomtatóra valamiért, akkor az ciklus egyszerűen bezárja a fájlom még mielőtt el lett volna küldve a nyomtatóra.
Próbáltam ezt, wordben ok, de sajnos excelben nem működik:
While Application.backgroundPrintingStatus > 0
Application.Wait (Now + TimeValue("00:00:01"))
WendSimán Application.Wait-et sem akarok használni, mert akkor 1000 évig tartana, míg végez a ciklus, plusz azt sem tudom mennyi időt kellene pontosan meghatároznom.
-
válasz
eszgé100 #47660 üzenetére
A megoldást már más megírta, úgy hogy csak INNEN bemásolom a kódot.
Annyi módosítást hajtottam csak végre a kódban, hogy a 3 db privát funkció deklarációban beleírtam a PtrSafe tulajdonságot, mivel enélkül 64 bites rendszer alatt nem futna le a kód.Module1-be kerülő kód:
Option Explicit
Private Const HKEY_CURRENT_USER As Long = &H80000001
Private Const HKCU = HKEY_CURRENT_USER
Private Const KEY_QUERY_VALUE = &H1&
Private Const ERROR_NO_MORE_ITEMS = 259&
Private Const ERROR_MORE_DATA = 234
Private Declare PtrSafe Function RegOpenKeyEx Lib "advapi32" _
Alias "RegOpenKeyExA" ( _
ByVal HKey As Long, _
ByVal lpSubKey As String, _
ByVal ulOptions As Long, _
ByVal samDesired As Long, _
phkResult As Long) As Long
Private Declare PtrSafe Function RegEnumValue Lib "advapi32.dll" _
Alias "RegEnumValueA" ( _
ByVal HKey As Long, _
ByVal dwIndex As Long, _
ByVal lpValueName As String, _
lpcbValueName As Long, _
ByVal lpReserved As Long, _
lpType As Long, _
lpData As Byte, _
lpcbData As Long) As Long
Private Declare PtrSafe Function RegCloseKey Lib "advapi32.dll" ( _
ByVal HKey As Long) As Long
Public Function GetPrinterFullNames() As String()
Dim Printers() As String ' array of names to be returned
Dim PNdx As Long ' index into Printers()
Dim HKey As Long ' registry key handle
Dim Res As Long ' result of API calls
Dim Ndx As Long ' index for RegEnumValue
Dim ValueName As String ' name of each value in the printer key
Dim ValueNameLen As Long ' length of ValueName
Dim DataType As Long ' registry value data type
Dim ValueValue() As Byte ' byte array of registry value value
Dim ValueValueS As String ' ValueValue converted to String
Dim CommaPos As Long ' position of comma character in ValueValue
Dim ColonPos As Long ' position of colon character in ValueValue
Dim M As Long ' string index
' registry key in HCKU listing printers
Const PRINTER_KEY = "Software\Microsoft\Windows NT\CurrentVersion\Devices"
PNdx = 0
Ndx = 0
' assume printer name is less than 256 characters
ValueName = String$(256, Chr(0))
ValueNameLen = 255
' assume the port name is less than 1000 characters
ReDim ValueValue(0 To 999)
' assume there are less than 1000 printers installed
ReDim Printers(1 To 1000)
' open the key whose values enumerate installed printers
Res = RegOpenKeyEx(HKCU, PRINTER_KEY, 0&, _
KEY_QUERY_VALUE, HKey)
' start enumeration loop of printers
Res = RegEnumValue(HKey, Ndx, ValueName, _
ValueNameLen, 0&, DataType, ValueValue(0), 1000)
' loop until all values have been enumerated
Do Until Res = ERROR_NO_MORE_ITEMS
M = InStr(1, ValueName, Chr(0))
If M > 1 Then
' clean up the ValueName
ValueName = Left(ValueName, M - 1)
End If
' find position of a comma and colon in the port name
CommaPos = InStr(1, ValueValue, ",")
ColonPos = InStr(1, ValueValue, ":")
' ValueValue byte array to ValueValueS string
On Error Resume Next
ValueValueS = Mid(ValueValue, CommaPos + 1, ColonPos - CommaPos)
On Error GoTo 0
' next slot in Printers
PNdx = PNdx + 1
Printers(PNdx) = ValueName & " on " & ValueValueS
' reset some variables
ValueName = String(255, Chr(0))
ValueNameLen = 255
ReDim ValueValue(0 To 999)
ValueValueS = vbNullString
' tell RegEnumValue to get the next registry value
Ndx = Ndx + 1
' get the next printer
Res = RegEnumValue(HKey, Ndx, ValueName, ValueNameLen, _
0&, DataType, ValueValue(0), 1000)
' test for error
If (Res <> 0) And (Res <> ERROR_MORE_DATA) Then
Exit Do
End If
Loop
' shrink Printers down to used size
ReDim Preserve Printers(1 To PNdx)
Res = RegCloseKey(HKey)
' Return the result array
GetPrinterFullNames = Printers
End Function
Sub Test()
Dim Printers() As String
Dim N As Long
Dim S As String
Printers = GetPrinterFullNames()
For N = LBound(Printers) To UBound(Printers)
S = S & Printers(N) & vbNewLine
Next N
MsgBox S, vbOKOnly, "Printers"
End SubEredménye (most az Én gépemen futtatva)
Nyilván esetedben annyiban kell módosítani pluszban a kódot, hogy ne a képernyőre irogassa ki az összes nyomtatót, hanem a cikluson belül, megvizsgálod, hogy az aktuális printer neve tratalmazza-e az általad használt 2 printer nevének egyikét, ha igen, akkor "elévarázsololod" a \\ jelet és a megfelelő változódnak meg is van az értéke és kb. meg is vagy.
-
ReSeTer
senior tag
Helló!
Egyszerűen nem tudok rájönni, hogy miért működik első ciklusban az egész, majd amikor az első ismétlés elkezdődik, hibára fut:
holkeressen = "A1:A1000"
For megintismetel = 1 To 3talalatsorszama = Application.Match(munkaszam, Range(holkeressen), 0)
holkeressen = "A" & talalatsorszama + 1 & ":A1000"If VarType(talalatsorszama) = vbError Then
MsgBox " nincs talalat", vbInformation, "Hiba"
Else
MsgBox "cella tartalmának sorszáma az A oszlopban: " & talalatsorszama, vbInformation, "Eredmény üzenet"
End If
On Error GoTo
Egyéb kód itt
Next megintismetel
A cél az, hogy addig ismételje, amíg van találat, de próbaképp csak 3x akarom ismételni, majd később átírom. De így se fut le. Elvileg át kellene írnia mindig a keresési tartomány elejét az "előző találat+1"-re, hogy ne számolja bele az előbbi találat.
Hibaüzenet: Runtime error '13'
Type MismatchAmikor debug módban rámutatok egérrel a talalatsorszama-ra akkor: Error 2042 az értéke
Mi lehet a probléma?
-
Delila_1
veterán
válasz
ReSeTer #47617 üzenetére
Betettem két soremelést az Else ágba, hogy feltünőbb legyen a sorszám.
Sub Talalat()
Dim talal
On Error Resume Next
Columns(2).ClearContents 'A későbbi beírás miatt törlöm a B oszlop adatait
talal = Application.Match(Range("G1"), Columns(1), 0)
If VarType(talal) = vbError Then
MsgBox "Nem található a G1 cella értéke az A oszlopban", vbInformation, "Hiányzó szöveg"
On Error GoTo 0
Else
MsgBox "G1 cella tartalmának sorszáma az A oszlopban: " & vbLf & vbLf & talal, vbInformation, "Sorszám"
'Itt felhasználjuk a talal változó értékét
Range("B" & talal) = "Ebben a sorban van a G1 cella értéke"
End If
End Sub
-
Delila_1
veterán
válasz
ReSeTer #47611 üzenetére
Sub Talalat()
Dim talal
On Error Resume Next
talal = Application.Match(Range("G1"), Columns(1), 0)
If VarType(talal) = vbError Then
MsgBox "Nem található a G1 cella értéke az A oszlopban", vbInformation, "Hiányzó szöveg"
Else
MsgBox "G1 cella tartalmának sorszáma az A oszlopban: " & talal, vbInformation, "Sorszám"
End If
On Error GoTo 0
End Sub
-
Sprite75
tag
Sziasztok
Van egy ilyen kód az egyik táblázatomban a Rendelés lapon ami egy Combo boxban történő keresést működtet.
Private Sub ComboBox1_Change()
Dim i As Long
If Not IsArrow Then
With Me.ComboBox1
.List = Worksheets("Rendelés").Range("BD5", Worksheets("Rendelés").Cells(Rows.Count, "BD").End(xlUp)).Value
.ListRows = Application.WorksheetFunction.Min(20, .ListCount)
.DropDown
If Len(.Text) Then
For i = .ListCount - 1 To 0 Step -1
If InStr(1, .List(i), .Text, vbTextCompare) = 0 Then .RemoveItem i
Next
.DropDown
End If
End With
End If
On Error Resume Next
i = Application.Match(Cells(1, 1), Columns(2), 0)
If Not VarType(i) = vbError Then Cells(i, 3).Select
On Error GoTo 0
End Sub
Private Sub ComboBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
IsArrow = (KeyCode = vbKeyUp) Or (KeyCode = vbKeyDown)
If KeyCode = vbKeyReturn Then Me.ComboBox1.List = Worksheets("Rendelés").Range("BD5", Worksheets("Rendelés").Cells(Rows.Count, "BD").End(xlUp)).Value
End Sub
Private Sub ComboBox1_DropButtonClick()
With Me.ComboBox1
.List = Worksheets("Rendelés").Range("BD5", Worksheets("Rendelés").Cells(Rows.Count, "BD").End(xlUp)).Value
.ListRows = Application.WorksheetFunction.Min(20, .ListCount)
.DropDown
End With
End Sub
Viszont ugyanebben a táblázatban fut egy ilyen kód ami a táblázat 2 különböző lapjának PDF-be történő mentését futtatja 20 percennénk.
Sub TimerPDFStart()
If kovidoPDF > Now Then Exit Sub
kovidoPDF = Now + TimeSerial(0, 20, 0) '1 perces időzítési idő
Application.OnTime kovidoPDF, "PDFautoment", , True
End Sub
A problémám az, hogy ha épp nyitva van a Combo box, ép pont akkor jár le a 20 merc amikor a
PDFautoment
makró lefutna, akkor hibát amikor aPDFautoment
át akar lépni egy másik munkalapra, hogy mentsen PDF-be (Sheets("Összesítve").Select)Meg lehet azt oldani hogy ha nyitva van a Combo box és épp akkor indítaná a
TimerPDFStart()
időzítő a mentést akkor az várakozzon amíg a combo box használata be nem fejeződik.Bocsi hogy egy kicsit hosszú lett.
-
Fferi50
Topikgazda
válasz
andreas49 #47243 üzenetére
Szia!
Ezt a makrót másold be egy modulba (vagy a munkalap kódlapjára).Sub kerescserel()
Dim wb As Workbook, ws As Worksheet, mit, mire
On Error GoTo hibas
mit = "": mire = ""
mit = Application.InputBox("Mit cseréljek", "Cserélés", mit)
If mit <> "" And mit <> "False" Then
mire = Application.InputBox("Mire cseréljem a: " & mit & " szöveget?", "Cserélés", mire)
If mire <> "" And mire <> "False" Then
Application.ScreenUpdating = False
For Each wb In Workbooks
For Each ws In Worksheets
ws.UsedRange.Replace what:=mit, replacement:=mire, lookat:=xlWhole
Next
Application.StatusBar = "Cserélem a " & mit & " " & mire & "a(z) " & wb.Name & " munkafüzetben!"
DoEvents
Next
End If
End If
Application.ScreenUpdating = True
Application.StatusBar = False
Exit Sub
hibas:
MsgBox "Hiba van: " & Error
End Sub
Meg kell adnod, hogy mit cseréljen, majd azt, hogy mire szeretnéd cserélni.
A cserélés csak teljes cellatartalomra vonatkozik, részekre nem. Nem érzékeny a kisbetű-nagybetű különbségre.
A makró minden nyitott munkafüzet minden munkalapján cseréli az adott szöveget.
Hozzá rendelheted egy billentyű kombinációhoz, akkor azzal gyorsan tudod hívni - vagy felteheted a menüszalagra is a beállítások - menüszalag - makrók útján.
Ha hibával megáll, akkor jelezz vissza légy szíves.
Remélem, tudod használni.
Üdv. -
lappy
őstag
legördülő lista több elem kiválasztása esetén ezzel a kóddal lehetne, de nem működik és nem tudom miért
ha vki ránézne köszönöm
Option ExplicitPrivate Sub Worksheet_Change(ByVal Target As Range)
Dim rngDV As Range
Dim oldVal As String
Dim newVal As String
Dim strVal As String
Dim i As Long
Dim lCount As Long
Dim Ar As Variant
On Error Resume Next
Dim lType As Long
If Target.Count > 1 Then GoTo exitHandlerlType = Target.Validation.Type
If lType = 3 Then
Application.EnableEvents = False
newVal = Target.Value
Application.Undo
oldval = Target.Value
Target.Value = newVal
If Target.Column = 3 Then
If oldVal = "" Then
Else
If newVal = "" Then
Else
On Error Resume Next
Ar = Split(oldVal, ", ")
strVal = ""
For i = LBound(Ar) To UBound(Ar)
Debug.Print strVal
Debug.Print CStr(Ar(i))
If newVal = CStr(Ar(i)) Then
strVal = strVal
lCount = 1
Else
strVal = strVal & CStr(Ar(i)) & ", "
End If
Next i
If lCount > 0 Then
Target.Value = Left(strVal, Len(strVal) - 2)
Else
Target.Value = strVal & newVal
End If
End If
End If
End If
End IfexitHandler:
Application.EnableEvents = True
End Sub -
logitechh
csendes tag
válasz
logitechh #46561 üzenetére
Sziasztok!
Összetákoltam valait de sajnos valami nem ok.
Össze vissza megismétli a nevet és nem mindig abba a mappába ment ahová kellene hanem egyel kijjebb majd ismét egy mappával kijjebb
Esetleg valaki tudja hol ronthattam el?Sub AutomatikusMentes()
ActiveSheetExportToTXT
MunkalapAtnevez
ActiveSheetExportToXLSM
End Sub
Sub MunkalapAtnevez()
Dim strMunkalapNev As String 'hely foglalás a memóriában
strMunkalapNev = "létszámjelentő" 'név deklarálása
ActiveSheet.Select 'aktív munkalap kijelölése
ActiveSheet.Name = strMunkalapNev 'aktív munkalap neének megadása a deklarált név alapján
End Sub
Sub ActiveSheetExportToTXT()
'aktív munkalap lementése a név:a munkafüzet neve_létszám_dátum_óra perc_másodperc
cntr = ""
If Dir(ThisWorkbook.Path & "\" & Left(ThisWorkbook.Name, (InStrRev(ThisWorkbook.Name, ".", -1, vbTextCompare) - 1)) & "_Dezsike_" & cntr & ".txt") = "" Then GoTo xprt
If Dir(ThisWorkbook.Path & "\" & Left(ThisWorkbook.Name, (InStrRev(ThisWorkbook.Name, ".", -1, vbTextCompare) - 1)) & "_Dezsike_" & cntr & ".txt") <> "" Then
cntr = 1
Do Until Dir(ThisWorkbook.Path & "\" & Left(ThisWorkbook.Name, (InStrRev(ThisWorkbook.Name, ".", -1, vbTextCompare) - 1)) & "_Dezsike_" & cntr & ".txt") = ""
cntr = cntr + 1
Loop
End If
xprt:
ActiveWorkbook.SaveAs filename:= _
ThisWorkbook.Path & "\" & Left(ThisWorkbook.Name, (InStrRev(ThisWorkbook.Name, ".", -1, vbTextCompare) - 1)) & "_Dezsike_" & Format(Now, "yyyymmdd_hhnn_ss") & ".txt", _
FileFormat:=xlText, _
CreateBackup:=False
End Sub
Sub ActiveSheetExportToXLSM()
'aktív munkalap lementése a név:a munkafüzet neve_létszám_dátum_óra perc_másodperc
cntr = ""
If Dir(ThisWorkbook.Path & "\" & Left(ThisWorkbook.Name, (InStrRev(ThisWorkbook.Name, ".", -1, vbTextCompare) - 1)) & "Létszámjelentő" & cntr & ".xlsm") = "" Then GoTo xprt
If Dir(ThisWorkbook.Path & "\" & Left(ThisWorkbook.Name, (InStrRev(ThisWorkbook.Name, ".", -1, vbTextCompare) - 1)) & "Létszámjelentő" & cntr & ".xlsm") <> "" Then
cntr = 1
Do Until Dir(ThisWorkbook.Path & "\" & Left(ThisWorkbook.Name, (InStrRev(ThisWorkbook.Name, ".", -1, vbTextCompare) - 1)) & "Létszámjelentő" & cntr & ".xlsm") = ""
cntr = cntr + 1
Loop
End If
xprt:
ActiveWorkbook.SaveAs filename:= _
ThisWorkbook.Path & "\" & Left(ThisWorkbook.Name, (InStrRev(ThisWorkbook.Name, ".", -1, vbTextCompare) - 1)) & "Létszámjelentő" & Format(Now, "yyyymmdd_hhnn_ss") & ".xlsm", _
FileFormat:=xlOpenXMLWorkbookMacroEnabled, CreateBackup:=False
End Sub -
spe88
senior tag
Ismét kéne egy kis segítség. Van egy PDF-küldős makróm.
Az alábbi pontokkal szembesülök.
1. Az A1 cellában egy hiperhivatkozás van. A PDF-ben ez nem jelenik meg, csak mint szöveg látom.
2. Az Outlook-üzenet első sora nem "Hallo Kollegen" ahogy megadtam, hanem "FalseHallo Kollegen"
2. Az e-mail törzsben az első sor ( "FalseHallo Kollegen") az Times New Roman 12-es betűméret, míg a 2-3. sor 9-es betűméret Calibri.Megadtam milyen legyen a betűtípus a makróban és mégsem olyan. Illetve alapból Arial 10-es a betűtípus az e-mail-írásnál, szóval nem értem miért változtatja random Times New Romanra meg Calibrire.
Köszönöm
A makró:
Sub SendPDF_WithAccountSignatiure()
' --> User settings, change to suit
Const IsDisplay As Boolean = True ' Change to False for .Send instead of .Display
Const IsSilent As Boolean = False ' Change to True to show Send status
Const FontName = "Arial" ' Font name of the email body
Const FontSize = 11 ' Font size of the email body
Const Account = 1 ' Index or Name of the account to send from
' <-- End of the settings
Dim IsCreated As Boolean
Dim OutlApp As Object
Dim char As Variant
Dim PdfFile As String, HtmlFont As String, HtmlBody As String, HtmlSignature As String
' Edit the body's html text as required
' The tags are: h3 is for Header#3; b is for Bold; br is for line break
HtmlBody = "Hallo Kollegen, <br>" _
& "<br>" _
& "Im Anhang sehen Sie die aktuelle PIP-Liste von BOS MOS."
' Set the font for the html-body (parentheses are just because of MrExcel posting limitation)
HtmlFont = HtmlFont = "<body font: " & 11 & "pt " & Arial & ";color:black"">"
' Define PDF filename
PdfFile = Range("'help_MOS'!an1")
' Replace illegal symbols in PdfFile by underscore
For Each char In Split("? "" / \ < > * | :")
PdfFile = Replace(PdfFile, char, "_")
Next
' Apply %TEMP% path to the file name
PdfFile = Environ("F:\03_PROJEKTE\02_BOS\2.4 SERIENBETREUUNG") & PdfFile & ".pdf"
' Try to delete PDF file if present
If Len(Dir(PdfFile)) Then Kill PdfFile
' Export the specific worksheet as PDF
With Worksheets("Report MOS")
.ExportAsFixedFormat Type:=xlTypePDF, Filename:=PdfFile, Quality:=xlQualityStandard, IncludeDocProperties:=True, IgnorePrintAreas:=False, OpenAfterPublish:=False
End With
' Use the already open Outlook if possible
On Error Resume Next
Set OutlApp = GetObject(, "Outlook.Application")
If Err Then
Set OutlApp = CreateObject("Outlook.Application")
IsCreated = True
End If
OutlApp.Visible = True
On Error GoTo 0
' Prepare email with PDF attachment and the default signature
With OutlApp.CreateItem(0)
' Set HTML format
.BodyFormat = 2
' Add the attachment first for correct attachment's name with non English symbols
.Attachments.Add PdfFile
' Set the required account by const Account
Set .SendUsingAccount = OutlApp.Session.Accounts.Item(Account)
' Get default email signature without blinking (instead of .Display method)
With .GetInspector: End With
HtmlSignature = .HtmlBody
' Prepare e-mail
.Subject = Range("'help_MOS'!an1")
.To = Range("'help_MOS'!an2") ' <-- Put email of the recipient here
.HtmlBody = HtmlFont & HtmlBody & HtmlSignature
' Try to send or just display the e-mail
On Error Resume Next
If IsDisplay Then .Display Else .Send
' Show error of the .Send method
If Not IsDisplay Then
' Return focus to Excel's window
Application.Visible = True
' Show error/success message
If Err Then
MsgBox "E-mail was not sent for some reasons" & vbLf & "Please check it", vbExclamation
.Display
Else
If Not IsSilent Then
MsgBox "E-mail successfully sent", vbInformation
End If
End If
End If
On Error GoTo 0
End With
' Try to quit Outlook if it was not previously open
If IsCreated Then OutlApp.Quit
' Try to release the memory of object variable
Set OutlApp = Nothing
End Sub
-
spe88
senior tag
válasz
Pakliman #46446 üzenetére
az enyém ilyen, de nem értem ott mi a baj. Igaz nem is értek hozzá túlzottan
Sub SendPDF_WithAccountSignatiure()
' --> User settings, change to suit
Const IsDisplay As Boolean = True ' Change to False for .Send instead of .Display
Const IsSilent As Boolean = False ' Change to True to show Send status
Const FontName = "Arial" ' Font name of the email body
Const FontSize = 11 ' Font size of the email body
Const Account = 2 ' Index or Name of the account to send from
' <-- End of the settings
Dim IsCreated As Boolean
Dim OutlApp As Object
Dim char As Variant
Dim PdfFile As String, HtmlFont As String, HtmlBody As String, HtmlSignature As String
' Edit the body's html text as required
' The tags are: h3 is for Header#3; b is for Bold; br is for line break
' HTML tag's are not displayed properly in the post of MrExcel forum, thus replacing is used to fix this problem
HtmlBody = "Hello, (br)" _
& ".(br)" _
& "Proba."
HtmlBody = Replace(HtmlBody, "(", "<")
HtmlBody = Replace(HtmlBody, ")", ">")
' Set the font for the html-body (parentheses are just because of MrExcel posting limitation)
HtmlFont = HtmlFont = "(body font: " & 11 & "pt " & Arial & ";color:black"")"
HtmlFont = Replace(HtmlFont, "(", "<")
HtmlFont = Replace(HtmlFont, ")", ">")
' Define PDF filename
PdfFile = Range("'Report MOS'!L1")
' Replace illegal symbols in PdfFile by underscore
For Each char In Split("? "" / \ < > * | :")
PdfFile = Replace(PdfFile, char, "_")
Next
' Apply %TEMP% path to the file name and limit lenght of the pathname
PdfFile = Environ("F:\03_PROJEKTE\02_BOS\2.4 SERIENBETREUUNG") & PdfFile & ".pdf"
' Try to delete PDF file if present
If Len(Dir(PdfFile)) Then Kill PdfFile
' Export the activesheet as PDF
With Worksheets("Report MOS")
.ExportAsFixedFormat Type:=xlTypePDF, Filename:=PdfFile, Quality:=xlQualityStandard, IncludeDocProperties:=True, IgnorePrintAreas:=False, OpenAfterPublish:=False
End With
' Use the already open Outlook if possible
On Error Resume Next
Set OutlApp = GetObject(, "Outlook.Application")
If Err Then
Set OutlApp = CreateObject("Outlook.Application")
IsCreated = True
End If
OutlApp.Visible = True
On Error GoTo 0
' Prepare email with PDF attachment and the default signature
With OutlApp.CreateItem(0)
' Set HTML format
.BodyFormat = 2
' Add the attachment first for correct attachment's name with non English symbols
.Attachments.Add PdfFile
' Set the required account by const Account
Set .SendUsingAccount = OutlApp.Session.Accounts.Item(Account)
' Get default email signature without blinking (instead of .Display method)
With .GetInspector: End With
HtmlSignature = .HtmlBody
' Prepare e-mail
.Subject = Range("'Report MOS'!L1")
.To = Range("'Report MOS'!L2") ' <-- Put email of the recipient here
.HtmlBody = HtmlFont & HtmlBody & HtmlSignature
' Try to send or just display the e-mail
On Error Resume Next
If IsDisplay Then .Display Else .Send
' Show error of the .Send method
If Not IsDisplay Then
' Return focus to Excel's window
Application.Visible = True
' Show error/success message
If Err Then
MsgBox "E-mail was not sent for some reasons" & vbLf & "Please check it", vbExclamation
.Display
Else
If Not IsSilent Then
MsgBox "E-mail successfully sent", vbInformation
End If
End If
End If
On Error GoTo 0
End With
' Try to quit Outlook if it was not previously open
If IsCreated Then OutlApp.Quit
' Try to release the memory of object variable
Set OutlApp = Nothing
End Sub
-
Pakliman
tag
Igen, arra rájöttem, hogy el is akarod küldeni, csak a PDF készítésnek és a küldésnek nincs köze egymáshoz.
Mondjuk úgy, hogy kicsit kötözködtem VeledÉn céges gépen vagyok, automatikusan küldök ki címekre automatikusan generált pdf fájlokat, de ilyen hibával nem találkoztam.
Tény, hogy nálam nincs a kódbanAccount
-ot kérő sor.
Ha érdekel, én egy ilyen eljárást hoztam össze:Public Sub SendEmail( _
xTo As String, _
xSubject As String, _
Optional xCC As String = "", _
Optional xBCC As String = "", _
Optional xBody As String = "", _
Optional xHTMLBody As Variant = "", _
Optional bSend As Boolean = False, _
Optional bTörölniKüldésUtán As Boolean = False, _
Optional vFiles As Variant = Empty _
)
Const olFolderSentMail As Long = 5
Const olByValue As Long = 1
Dim OutApp As Object
Dim OutMail As Object
Dim oFolder As Object
Dim oEditor As Object
Dim cFile As Long
Dim sBody As String
If (xTo <> "") And (xSubject <> "") Then
Set OutApp = CreateObject("Outlook.Application")
Set OutMail = OutApp.CreateItem(0)
On Error Resume Next
With OutMail
.To = xTo
.cc = xCC
.BCC = xBCC
.Subject = xSubject
If TypeName(xHTMLBody) = "Range" Then
xHTMLBody.Copy
Set oEditor = .GetInspector.WordEditor
oEditor.Content.Paste
Else
sBody = IIf(xHTMLBody = "", xBody, xHTMLBody): If sBody = "" Then sBody = " "
.HTMLBody = sBody
End If
If IsArray(vFiles) Then
For cFile = LBound(vFiles) To UBound(vFiles)
If Dir(vFiles(cFile)) <> "" Then .Attachments.Add (vFiles(cFile)) 'Source:=vFiles(cFile), Type:=olByValue
Next cFile
Else
If Dir(vFiles) <> "" Then .Attachments.Add (vFiles) 'Source:=vFiles, Type:=olByValue
End If
If bSend Then
.DeleteAfterSubmit = bTörölniKüldésUtán
.Send
Else
.Display
End If
End With
On Error GoTo 0
Set OutMail = Nothing
Set OutApp = Nothing
End If
End Sub -
lcdtv
tag
Ha valakinek kellene. A cellatartalom hyperlink kell, hogy legyen (ez nálam hiba volt), mivel több száz F2+entert nem akartam nyomogatni ezért van ez a script. Ez minden cella adatból hyperlinket csinál.
Sub HyperAdd()
'Converts each text hyperlink selected into a working hyperlink
Dim xCell As Range
For Each xCell In Selection
ActiveSheet.Hyperlinks.Add Anchor:=xCell, Address:=xCell.Formula
Next xCell
End Sub
majd ez a script meg letölti egy adott könyvtárbaConst TargetFolder = "C:\temp\"
#If VBA7 And Win64 Then
Private Declare PtrSafe Function URLDownloadToFile Lib "urlmon" _
Alias "URLDownloadToFileA" ( _
ByVal pCaller As LongPtr, _
ByVal szURL As String, _
ByVal szFileName As String, _
ByVal dwReserved As LongPtr, _
ByVal lpfnCB As LongPtr _
) As Long
Private Declare PtrSafe Function DeleteUrlCacheEntry Lib "Wininet.dll" _
Alias "DeleteUrlCacheEntryA" ( _
ByVal lpszUrlName As String _
) As Long
#Else
Private Declare Function URLDownloadToFile Lib "urlmon" _
Alias "URLDownloadToFileA" ( _
ByVal pCaller As Long, _
ByVal szURL As String, _
ByVal szFileName As String, _
ByVal dwReserved As Long, _
ByVal lpfnCB As Long _
) As Long
Private Declare Function DeleteUrlCacheEntry Lib "Wininet.dll" _
Alias "DeleteUrlCacheEntryA" ( _
ByVal lpszUrlName As String _
) As Long
#End If
Public Const ERROR_SUCCESS As Long = 0
Public Const BINDF_GETNEWESTVERSION As Long = &H10
Public Const INTERNET_FLAG_RELOAD As Long = &H80000000
Public Const folderName As String = "c:\temp\"
Sub MyFileDownload()
For Each Hyperlink In ActiveSheet.Hyperlinks
For N = Len(Hyperlink.Address) To 1 Step -1
If Mid(Hyperlink.Address, N, 1) <> "/" Then
LocalFileName = Mid(Hyperlink.Address, N, 1) & LocalFileName
Else
Exit For
End If
Next N
Call HTTPDownloadFile(Hyperlink.Address, TargetFolder & LocalFileName)
LocalFileName = “”
Next Hyperlink
End Sub
Sub HTTPDownloadFile(ByVal URL As String, ByVal LocalFileName As String)
Dim Res As Long
On Error Resume Next
Kill LocalFileName
On Error GoTo 0
Res = URLDownloadToFile(0&, URL, LocalFileName, 0&, 0&)
End Sub
Sub bcvb()
End Sub -
Delila_1
veterán
válasz
Lokids #45498 üzenetére
Az előbb a képlet helyét rosszul írtam, az 1. ws lap D5 cellájába kell írni.
Makróval:
Sub Masolas()
Dim sor As Integer, IttVan As Variant
Sheets("1. ws").Select
For sor = 5 To 1500
On Error Resume Next
IttVan = Application.Match(Cells(sor, 1), Sheets("2. ws").Columns(1), 0)
If VarType(IttVan) = vbError Then
On Error GoTo 0
Else
Sheets("2. ws").Range("B" & IttVan & ":E" & IttVan).Copy Cells(sor, 4)
End If
Next
End Sub -
Delila_1
veterán
válasz
Fferi50 #45398 üzenetére
Hát még, ha tagolva lenne a makró! Akkor látszana, ki kivel van.
Function Poisson2(Feltétel2 As Range) As Long
Call kep_ki
Application.Volatile 'Prohardver Delila_1 nyomán
k = 0
Kezd = Cells(8, 7) 'Feltétel kezdete oszlop
Kezd5 = Kezd + 5 'Javasolt számok terület előtti oszlop száma
Kezd22 = Kezd + 22 'Feltételek a javaslat válogatásához
a = Cells(12, Kezd) 'A munkatábla kezdő előtti oszlop száma
Előford = Kezd + a 'K(i) táblázat kezdő előtti oszlop száma
Valószín = Előford + 90 'P(x=1) táblázat kezdő előtti oszlop száma
Várak = Valószín + 90 'n(i) táblázat kezdő előtti oszlop száma
Us = Cells(4, 7) + Cells(2, 7) 'Táblázat utolsó sora
Cikl = Cells(5, Előford + 1) 'A számolás kezdete sor
Cells(6, Előford + 1) = Cikl 'Ez lesz a Ciklusváltozó kezdete
Range(Cells(Cikl + 1, Kezd + 1), Cells(Us, Kezd + 15)).ClearContents 'számítása sorok törlése
Range(Cells(Cikl, Előford + 1), Cells(Us, Valószín)).ClearContents 'K(i) táblázat törlése
Range(Cells(8, Előford + 1), Cells(8, Valószín)).Value = _
Range(Cells(Cikl - 1, Várak + 1), Cells(Cikl - 1, Várak + 90)).Value 'Az n(i-1) sor feltöltése
Cells(14, Előford + 1).Formula = Cells(14, Kezd + 49).Formula
Cells(14, Előford + 1).Select 'Kijelölés kitöltéshez
Selection.AutoFill Destination:=Range(Cells(14, Előford + 1), Cells(14, Valószín)), Type:=xlFillDefault
'Feltételek
Range("AF11:AJ11").Value = Range("AF4:AJ4").Value 'Manuális számítás
'Calculate 'A munkalapfüggvények számolása
For Cikl = Cells(6, Előford + 1) To Us 'Az utolsó + 1-ig
'1. : 'Az n(i-1) és az előző ciklusban kitörölt képletek újrafelépítése a Tartalék raktárcellából BF14
Range(Cells(8, Előford + 1), Cells(8, Valószín)).Value = _
Range(Cells(Cikl - 1, Várak + 1), Cells(Cikl - 1, Várak + 90)).Value 'Az n(i-1) sor feltöltése
Cells(14, Előford + 1).Formula = Cells(14, Kezd + 49).Formula 'Képlet
Cells(14, Előford + 1).Select 'Kijelölés kitöltéshez
Selection.AutoFill Destination:=Range(Cells(14, Előford + 1), Cells(14, Valószín)), Type:=xlFillDefault
'[P(x=1) 13-dik sor]
For i = 1 To 5
For j = 1 To 90
Calculate 'A munkalapfüggvények kiszámolják a 14-dik
If Cells(13, Előford + j) <= Cells(11, Kezd22 + i) And Cells(14, Előford + j) Then
For k = 1 To 5
If Cells(14, Előford + j) = Cells(Cikl, Kezd5 + k) Then GoTo Köv
Next k
Cells(Cikl, Kezd5 + Cells(17, Kezd5 + i)) = Cells(14, Előford + j)
Cells(Cikl, Kezd + 10 + Cells(17, Kezd5 + i)) = Cells(13, Előford + j)
Cells(14, Előford + j) = ""
j = 90
End If
Köv:
Next j
Next i
'2.
Cells(6, Előford + 1) = Cikl
'Calculate 'A munkalapfüggvények számolása
If Cells(Cikl, 4) Then
For j = 1 To 5
Cells(Cikl, Kezd + j) = Cells(12, Előford + Cells(Cikl, 3 + j))
Next j
End If
'Calculate 'A munkalapfüggvények számolása
Range(Cells(Cikl, Előford + 1), Cells(Cikl, Valószín)).Value _
= Range(Cells(Cikl - 1, Előford + 1), Cells(Cikl - 1, Valószín)).Value
For j = 1 To 90
Cells(8, Előford + j) = Cells(8, Előford + j) + 1 'n(i) cellasor munkatáblában(i) cellasor
Next j
If Cells(Cikl, 4) Then
For j = 1 To 5
Cells(Cikl, Előford + Cells(Cikl, 3 + j)) _
= Cells(Cikl, Előford + Cells(Cikl, 3 + j)) + 1
Cells(8, Előford + Cells(Cikl, 3 + j)) = 0 'n(i) cellasor
Next j
End If
'Calculate
Range(Cells(Cikl, Valószín + 1), Cells(Cikl, Várak)).Value _
= Range(Cells(12, Előford + 1), Cells(12, Valószín)).Value
Range(Cells(Cikl, Várak + 1), Cells(Cikl, Várak + 90)).Value _
= Range(Cells(8, Előford + 1), Cells(8, Valószín)).Value
Next Cikl
Call CountCcolor 'Prohardver nyomám Színes cellák számolása**** Modul3 lapon
Poisson2 = WorksheetFunction.Sum(Range("O14:S14")) 'Solver Célcella
Call kep_be
End Function -
Fferi50
Topikgazda
Szia!
Mutatom a </> gombot:
És az eredménye:Function Poisson2(Feltétel2 As Range) As Long
Call kep_ki
Application.Volatile ’Prohardver Delila_1 nyomán
k = 0
Kezd = Cells(8, 7) 'Feltétel kezdete oszlop
Kezd5 = Kezd + 5 'Javasolt számok terület előtti oszlop száma
Kezd22 = Kezd + 22 'Feltételek a javaslat válogatásához
a = Cells(12, Kezd) 'A munkatábla kezdő előtti oszlop száma
Előford = Kezd + a 'K(i) táblázat kezdő előtti oszlop száma
Valószín = Előford + 90 'P(x=1) táblázat kezdő előtti oszlop száma
Várak = Valószín + 90 'n(i) táblázat kezdő előtti oszlop száma
Us = Cells(4, 7) + Cells(2, 7) 'Táblázat utolsó sora
Cikl = Cells(5, Előford + 1) 'A számolás kezdete sor
Cells(6, Előford + 1) = Cikl 'Ez lesz a Ciklusváltozó kezdete
Range(Cells(Cikl + 1, Kezd + 1), Cells(Us, Kezd + 15)).ClearContents 'számítása sorok törlése
Range(Cells(Cikl, Előford + 1), Cells(Us, Valószín)).ClearContents 'K(i) táblázat törlése
Range(Cells(8, Előford + 1), Cells(8, Valószín)).Value = _
Range(Cells(Cikl - 1, Várak + 1), Cells(Cikl - 1, Várak + 90)).Value 'Az n(i-1) sor feltöltése
Cells(14, Előford + 1).Formula = Cells(14, Kezd + 49).Formula
Cells(14, Előford + 1).Select 'Kijelölés kitöltéshez
Selection.AutoFill Destination:=Range(Cells(14, Előford + 1), Cells(14, Valószín)), Type:=xlFillDefault
'Feltételek
Range("AF11:AJ11").Value = Range("AF4:AJ4").Value 'Manuális számítás
'Calculate 'A munkalapfüggvények számolása
For Cikl = Cells(6, Előford + 1) To Us 'Az utolsó + 1-ig
'1. : 'Az n(i-1) és az előző ciklusban kitörölt képletek újrafelépítése a Tartalék raktárcellából BF14
Range(Cells(8, Előford + 1), Cells(8, Valószín)).Value = _
Range(Cells(Cikl - 1, Várak + 1), Cells(Cikl - 1, Várak + 90)).Value 'Az n(i-1) sor feltöltése
Cells(14, Előford + 1).Formula = Cells(14, Kezd + 49).Formula 'Képlet
Cells(14, Előford + 1).Select 'Kijelölés kitöltéshez
Selection.AutoFill Destination:=Range(Cells(14, Előford + 1), Cells(14, Valószín)), Type:=xlFillDefault
'[P(x=1) 13-dik sor]
For i = 1 To 5
For j = 1 To 90
Calculate 'A munkalapfüggvények kiszámolják a 14-dik
If Cells(13, Előford + j) <= Cells(11, Kezd22 + i) _
And Cells(14, Előford + j) Then
For k = 1 To 5
If Cells(14, Előford + j) = Cells(Cikl, Kezd5 + k) Then GoTo Köv
Next k
Cells(Cikl, Kezd5 + Cells(17, Kezd5 + i)) = Cells(14, Előford + j)
Cells(Cikl, Kezd + 10 + Cells(17, Kezd5 + i)) = Cells(13, Előford + j)
Cells(14, Előford + j) = ""
j = 90
End If
Köv: Next j
Next i
'2.
Cells(6, Előford + 1) = Cikl
'Calculate 'A munkalapfüggvények számolása
If Cells(Cikl, 4) Then
For j = 1 To 5
Cells(Cikl, Kezd + j) = Cells(12, Előford + Cells(Cikl, 3 + j))
Next j
Else
End If
'Calculate 'A munkalapfüggvények számolása
Range(Cells(Cikl, Előford + 1), Cells(Cikl, Valószín)).Value _
= Range(Cells(Cikl - 1, Előford + 1), Cells(Cikl - 1, Valószín)).Value
For j = 1 To 90
Cells(8, Előford + j) = Cells(8, Előford + j) + 1 'n(i) cellasor munkatáblában(i) cellasor
Next j
If Cells(Cikl, 4) Then
For j = 1 To 5
Cells(Cikl, Előford + Cells(Cikl, 3 + j)) _
= Cells(Cikl, Előford + Cells(Cikl, 3 + j)) + 1
Cells(8, Előford + Cells(Cikl, 3 + j)) = 0 'n(i) cellasor
Next j
End If
'Calculate
Range(Cells(Cikl, Valószín + 1), Cells(Cikl, Várak)).Value _
= Range(Cells(12, Előford + 1), Cells(12, Valószín)).Value
Range(Cells(Cikl, Várak + 1), Cells(Cikl, Várak + 90)).Value _
= Range(Cells(8, Előford + 1), Cells(8, Valószín)).Value
Next Cikl
Call CountCcolor 'Prohardver nyomám Színes cellák számolása**** Modul3 lapon
Poisson2 = WorksheetFunction.Sum(Range("O14:S14")) 'Solver Célcella
Call kep_be
End Function
Amint látod, sokkal olvashatóbb.
Érdekes lenne még az a munkalap, amin futtatod ezt a makrót. Legalább egy kép a használt területről.
Üdv. -
KBaj
kezdő
válasz
Fferi50 #45396 üzenetére
Kedves Fferi50 !
Ime a program, elég hosszú. Persze ez is függvény azért, mert ha fog működni SOLVER célcellájaként akarom alkalmazni.
Function Poisson2(Feltétel2 As Range) As Long
Call kep_ki
Application.Volatile ’Prohardver Delila_1 nyomán
k = 0
Kezd = Cells(8, 7) 'Feltétel kezdete oszlop
Kezd5 = Kezd + 5 'Javasolt számok terület előtti oszlop száma
Kezd22 = Kezd + 22 'Feltételek a javaslat válogatásához
a = Cells(12, Kezd) 'A munkatábla kezdő előtti oszlop száma
Előford = Kezd + a 'K(i) táblázat kezdő előtti oszlop száma
Valószín = Előford + 90 'P(x=1) táblázat kezdő előtti oszlop száma
Várak = Valószín + 90 'n(i) táblázat kezdő előtti oszlop száma
Us = Cells(4, 7) + Cells(2, 7) 'Táblázat utolsó sora
Cikl = Cells(5, Előford + 1) 'A számolás kezdete sor
Cells(6, Előford + 1) = Cikl 'Ez lesz a Ciklusváltozó kezdete
Range(Cells(Cikl + 1, Kezd + 1), Cells(Us, Kezd + 15)).ClearContents 'számítása sorok törlése
Range(Cells(Cikl, Előford + 1), Cells(Us, Valószín)).ClearContents 'K(i) táblázat törlése
Range(Cells(8, Előford + 1), Cells(8, Valószín)).Value = _
Range(Cells(Cikl - 1, Várak + 1), Cells(Cikl - 1, Várak + 90)).Value 'Az n(i-1) sor feltöltése
Cells(14, Előford + 1).Formula = Cells(14, Kezd + 49).Formula
Cells(14, Előford + 1).Select 'Kijelölés kitöltéshez
Selection.AutoFill Destination:=Range(Cells(14, Előford + 1), Cells(14, Valószín)), Type:=xlFillDefault
'Feltételek
Range("AF11:AJ11").Value = Range("AF4:AJ4").Value 'Manuális számítás
'Calculate 'A munkalapfüggvények számolása
For Cikl = Cells(6, Előford + 1) To Us 'Az utolsó + 1-ig
'1. : 'Az n(i-1) és az előző ciklusban kitörölt képletek újrafelépítése a Tartalék raktárcellából BF14
Range(Cells(8, Előford + 1), Cells(8, Valószín)).Value = _
Range(Cells(Cikl - 1, Várak + 1), Cells(Cikl - 1, Várak + 90)).Value 'Az n(i-1) sor feltöltése
Cells(14, Előford + 1).Formula = Cells(14, Kezd + 49).Formula 'Képlet
Cells(14, Előford + 1).Select 'Kijelölés kitöltéshez
Selection.AutoFill Destination:=Range(Cells(14, Előford + 1), Cells(14, Valószín)), Type:=xlFillDefault
'[P(x=1) 13-dik sor]
For i = 1 To 5
For j = 1 To 90
Calculate 'A munkalapfüggvények kiszámolják a 14-dik
If Cells(13, Előford + j) <= Cells(11, Kezd22 + i) _
And Cells(14, Előford + j) Then
For k = 1 To 5
If Cells(14, Előford + j) = Cells(Cikl, Kezd5 + k) Then GoTo Köv
Next k
Cells(Cikl, Kezd5 + Cells(17, Kezd5 + i)) = Cells(14, Előford + j)
Cells(Cikl, Kezd + 10 + Cells(17, Kezd5 + i)) = Cells(13, Előford + j)
Cells(14, Előford + j) = ""
j = 90
End If
Köv: Next j
Next i
'2.
Cells(6, Előford + 1) = Cikl
'Calculate 'A munkalapfüggvények számolása
If Cells(Cikl, 4) Then
For j = 1 To 5
Cells(Cikl, Kezd + j) = Cells(12, Előford + Cells(Cikl, 3 + j))
Next j
Else
End If
'Calculate 'A munkalapfüggvények számolása
Range(Cells(Cikl, Előford + 1), Cells(Cikl, Valószín)).Value _
= Range(Cells(Cikl - 1, Előford + 1), Cells(Cikl - 1, Valószín)).Value
For j = 1 To 90
Cells(8, Előford + j) = Cells(8, Előford + j) + 1 'n(i) cellasor munkatáblában(i) cellasor
Next j
If Cells(Cikl, 4) Then
For j = 1 To 5
Cells(Cikl, Előford + Cells(Cikl, 3 + j)) _
= Cells(Cikl, Előford + Cells(Cikl, 3 + j)) + 1
Cells(8, Előford + Cells(Cikl, 3 + j)) = 0 'n(i) cellasor
Next j
End If
'Calculate
Range(Cells(Cikl, Valószín + 1), Cells(Cikl, Várak)).Value _
= Range(Cells(12, Előford + 1), Cells(12, Valószín)).Value
Range(Cells(Cikl, Várak + 1), Cells(Cikl, Várak + 90)).Value _
= Range(Cells(8, Előford + 1), Cells(8, Valószín)).Value
Next Cikl
Call CountCcolor 'Prohardver nyomám Színes cellák számolása**** Modul3 lapon
Poisson2 = WorksheetFunction.Sum(Range("O14:S14")) 'Solver Célcella
Call kep_be
End Function
Elég hosszú a program, van még mit csiszolni, egyszerűsíteni rajta. Mint már említettem kezdő programozó vagyok, nem értem a (</>) gombot mit jelent.
Segítségedet előre is köszönöm.
Üdvözlettel:
KBaj -
Delila_1
veterán
válasz
zsolti_20 #45192 üzenetére
Nem volt egyszerű, de végül sikerült.
Sub Eredmeny()
Dim sorSzuro As Integer, sorEredm As Integer, db As Integer, csoport As Integer
Dim usorLista, x As Integer, elso As Integer, ucso As Integer, nev As String, van
sorEredm = 2: csoport = 1
usorLista = Range("D" & Rows.Count).End(xlUp).Row
Kezd:
elso = Application.Match(csoport, Columns(1), 0)
ucso = Application.Match(csoport, Columns(1))
db = 0
For x = elso To ucso
If Application.WorksheetFunction.CountIf(Columns(4), Cells(x, 2)) > 0 Then db = db + 1
If db = ucso - elso + 1 Then
For sorSzuro = 2 To usorLista
nev = Cells(sorSzuro, "D")
On Error Resume Next
van = Application.Match(nev, Range(Cells(elso, "B"), Cells(ucso, "B")), 0)
If VarType(van) = vbError Then
On Error GoTo 0
Else
Cells(sorEredm, "F") = csoport
Cells(sorEredm, "G") = nev
sorEredm = sorEredm + 1
End If
Next
End If
Next
csoport = csoport + 1
If csoport > Application.WorksheetFunction.Max(Columns(1)) Then
Exit Sub
Else
GoTo Kezd
End If
End Sub -
Pakliman
tag
válasz
Norbika1493 #45186 üzenetére
Egy pl...
Ez egy meglévő táblázatban halad végig és bizonyos cellák értéke alapján színez bizonyos számokat is.
Készít egy táblázatot az így létrejótt listából és elküldi a megadott címzetteknek:Public Enum OlBodyFormat
olFormatUnspecified = 0
olFormatPlain = 1
olFormatHTML = 2
olFormatRichText = 3
End Enum
Private Function TableDataColor(strIn As String, Optional color As String = "") As String
If color = "" Then
TableDataColor = strIn
Else
TableDataColor = "<FONT COLOR=" & color & ">" & strIn & "</FONT>"
End If
End Function
Private Function Table(strIn As String, Optional lBorder As Long = 0) As String
Dim sBorder As String
If lBorder = 0 Then
sBorder = ""
Else
sBorder = " border=" & lBorder
End If
Table = "<TABLE" & sBorder & ">" & strIn & "</TABLE>"
End Function
Private Function TableData(strIn As String, Optional alignment As String = "") As String
TableData = "<TD nowrap align=" & alignment & ">" & strIn & "</TD>"
End Function
Private Function TableRow(strIn As String) As String
TableRow = "<TR>" & strIn & "</TR>"
End Function
Public Sub Email_Humányügyre()
Dim sSzöveg1 As String: sSzöveg1 = "Kedves Lányok!" & "<br /><br />"
Dim sSzöveg2 As String: sSzöveg2 = "Szíves hasznosításra..." & "<br /><br />" & _
"Üdv," & "<br /><br />"
Dim OutApp As Object
Dim OutMail As Object
Dim strFej As String
Dim strTB As String
Dim sDátum As String: sDátum = Format(Format(Range("Z1"), "0000"".""00"".""00"), "yyyy. mmmm")
Dim sTárgy As String: sTárgy = "Külsősök teljesítései " & sDátum
Dim lAktSor As Long
Dim lÚjSor As Long
Dim szín As String
strFej = TableRow( _
TableData("HR") & _
TableData("Név") & _
TableData("Összes óra") _
)
For lAktSor = 3 To Cells.Rows.Count 'Az utolsó sort célszerű először meghatározni...
If IsEmpty(Cells(lAktSor, 1)) Then Exit For
If Cells(lAktSor, 15) = "Külsős" Then
Select Case Cells(lAktSor, 11)
Case 60 To 79.9
szín = "blue"
Case Is > 80
szín = "red"
Case Else
szín = ""
End Select
strTB = strTB & _
TableRow( _
TableData(Cells(lAktSor, 1)) & _
TableData(Cells(lAktSor, 2)) & _
TableData( _
TableDataColor( _
Format(Cells(lAktSor, 11), "0.0"), _
szín _
), _
"right" _
) _
)
End If
Next lAktSor
Set OutApp = CreateObject("Outlook.Application")
Set OutMail = OutApp.CreateItem(0)
On Error Resume Next
With OutMail
.To = "Humánügyek"
.CC = "hum1@hum.hu; hum2@hum.hu"
.BCC = ""
.Subject = sTárgy
.BodyFormat = 2 'olFormatHTML
.HTMLBody = sSzöveg1 & _
Table( _
"<Caption>Külsős órák</Caption>" & _
strFej & _
strTB _
, 1) & "<br /><br />" & _
sSzöveg2
.Display ' vagy elküldéshez .Send
End With
On Error GoTo 0
Set OutMail = Nothing
Set OutApp = Nothing
End Sub -
lappy
őstag
válasz
andreas49 #45062 üzenetére
Itt van egy ilyen kód amire szükséged van
Sub InsertRowsAtCursor()
Answer = InputBox("How many Rows to insert? (50 Rows maximum)")
NumLines = Int(Val(Answer))
If NumLines > 50 Then
NumLines = 50
End If
If NumLines = 0 Then
GoTo EndInsertLines
End If
Do
Selection.EntireRow.Insert
Count = Count + 1
Loop While Count < NumLines
EndInsertLines:
End Sub -
Mutt
senior tag
Szia,
Nincs CS01 hozzáférésem, így nem tudtam tesztelni de ezt próbáld meg:
Dim objExcel
Dim objSheet, intRow, i
Set objExcel = GetObject(, "Excel.Application")
Set objSheet = objExcel.Workbooks("dj feltolt").Sheets("Munka1")
For i = 2 To objSheet.UsedRange.Rows.Count
COL1 = Trim(CStr(objSheet.Cells(i, 1).Value)) 'Column1
'CS01 fõképernyõn anyagszám / plant / BOM usage megadása
session.findById("wnd[0]/usr/ctxtRC29N-MATNR").Text = COL1
'session.findById("wnd[0]/usr/ctxtRC29N-WERKS").text = "0610"
session.findById("wnd[0]/usr/ctxtRC29N-STLAN").Text = "1"
session.findById("wnd[0]/usr/txtRC29N-WTEXT").SetFocus
session.findById("wnd[0]/usr/txtRC29N-WTEXT").caretPosition = 0
session.findById("wnd[0]").sendVKey 0
session.findById("wnd[0]").sendVKey 0
'component screen amiről csak akkor kell elmenni, ha másik anyagot kell felépíteni
j = -1
Do
j = j + 1
COL2 = Trim(CStr(objSheet.Cells(i + j, 2).Value)) 'Column2
COL3 = Trim(CStr(objSheet.Cells(i + j, 3).Value)) 'Column3
session.findById("wnd[0]/usr/tabsTS_ITOV/tabpTCMA/ssubSUBPAGE:SAPLCSDI:0152/tblSAPLCSDITCMAT/ctxtRC29P-POSTP[1," & CStr(j) & "]").Text = "L"
session.findById("wnd[0]/usr/tabsTS_ITOV/tabpTCMA/ssubSUBPAGE:SAPLCSDI:0152/tblSAPLCSDITCMAT/ctxtRC29P-IDNRK[2," & CStr(j) & "]").Text = COL2
session.findById("wnd[0]/usr/tabsTS_ITOV/tabpTCMA/ssubSUBPAGE:SAPLCSDI:0152/tblSAPLCSDITCMAT/txtRC29P-MENGE[5," & CStr(j) & "]").Text = COL3
session.findById("wnd[0]/usr/tabsTS_ITOV/tabpTCMA/ssubSUBPAGE:SAPLCSDI:0152/tblSAPLCSDITCMAT/txtRC29P-MENGE[5," & CStr(j) & "]").SetFocus
session.findById("wnd[0]/usr/tabsTS_ITOV/tabpTCMA/ssubSUBPAGE:SAPLCSDI:0152/tblSAPLCSDITCMAT/txtRC29P-MENGE[5," & CStr(j) & "]").caretPosition = 5
session.findById("wnd[0]").sendVKey 0
session.findById("wnd[0]").sendVKey 0
Loop Until COL1 <> Trim(CStr(objSheet.Cells(i + j + 1, 1).Value))
'mentés
session.findById("wnd[0]/tbar[0]/btn[11]").press
'léptetni kell az i értékét
i = i + j
Next i
MsgBox "Keszen vagyunk"Neked egy fájlban vannak a létrehozandó anyagtörzsek (az aktuális mindig a COL1 változóban van), így addig nem kell kilépned CS01-ből amíg új anyaghoz nem érsz.
A fenti megoldásban van egy Do - Loop ciklus ami addig adogatja a komponenseket a listához amíg a COL1 értéke meg nem változik.A másik fontos dolog, hogy a rácson hivatkozni SAP-ban sor és oszlop azonosítóval lehet.
pl. .. CMAT/ctxtRC29P-IDNRK[2,0] mindig a második mezőt az első soron jelenti, vagyis a komponenst.
A sor változót kell léptetni, hogy a komponensek egymás alá kerüljenek és ne mindig az első sor legyen felülírva. Ezért van mindegyik sorban a j belső változó meghívva.Ami fontos, hogy a script el fog hasalni ha olyan sorra hivatkozol ami a nem látható képernyő része. A képernyőmentéseden látszik 19 sor, de ha kisebbre teszed a GUI-t akkor lehet hogy csak 5 sort fogsz látni. Ezt kivédeni úgy lehet, hogy mielőtt írnál megnézed hogy létezik-e az adott sor. Tippre vhogy így:
On Error Resume Next
If session.findById("wnd[0]/usr/tabsTS_ITOV/tabpTCMA/ssubSUBPAGE:SAPLCSDI:0152/tblSAPLCSDITCMAT/ctxtRC29P-POSNR[0," & CStr(j) & "]").Text <> Right("000" & j, 4) Then
MsgBox "hiba"
End If
On Error GoTo 0Megkértem a jogosultságot a CS01-hez így ha majd megkapom akkor tudom tesztelni, hogy az elmélet párosul-e a valósággal.
üdv
-
DeFranco
nagyúr
Sziasztok,
írogattam már VBA kódokat, túl sok szakmai alapom nincs hozzá, de általában összekalapálok egész használható dolgokat ami megkönnyíti a munkámat, viszont előfordul hogy az alapok hiánya miatt megáll a tudomány egy egyszerű lépésnél, ez van most is.
Azt szeretném automatizálni hogy ha kiválasztok egy tartományt, akkor a kód lépkedjen végig a kiválasztott tartomány egyes celláin és hajtsa végre a következő műveleteket:
0: kiválasztom az A1:D4 tartományt
1: nézze meg a soron következő cella (pl. A1) értékét
A1 cella tartalma:rántotta
),
azt írja be magának egy változóba
2: ugyanebbe a cellába (A1) írjon be egy előre definiált képletet (legyen mondjuk=BAL([A1];2)
) ahol az[A1]
paraméter értéke értelemszerűen az A1 cellából felírt érték:
eredmény (A1 cella tartalma)=BAL("rántotta";2)
3: fogja meg az A1 cellát és a tartalmát mentse értékre:
eredmény (A1 cella tartalma)rá
4: lépjen a kiválasztásban a soron következő cellára
5: GOTO 1tegye ezt addig amíg a kijelölés végére nem ér (D4)
gondolom ez egy FOR ciklus lesz, ami nehézséget okoz, hogy hogyan olvasom ki a kijelölés paramétereit, tehát a kijelölt terület első cellája, sorok és oszlopok száma, amit a ciklus paramétereinek beadok. a többi elvileg menne.
-
bucihost
senior tag
Sziasztok!
Találtam egy kódot, amit ökéletesen működik. Viszont, néha az oldal "hibát dob" ahonnan a képeket kérném le mert gondolom egyszerre sok a lekérdezést.
Hogyan lehetne késlelteni a lekérdezért, hogy 1-1- kép között várjon mondjuk 2-3 másodpercet?
Sub URLPictureInsert()
Dim Pshp As Shape
Dim xRg As Range
Dim xCol As Long
On Error Resume Next
Application.ScreenUpdating = False
Set rng = ActiveSheet.Range("C2:C90")
For Each cell In rng
filenam = cell
ActiveSheet.Pictures.Insert(filenam).Select
Set Pshp = Selection.ShapeRange.Item(1)
If Pshp Is Nothing Then GoTo lab
xCol = cell.Column + 1
Set xRg = Cells(cell.Row, xCol)
With Pshp
.LockAspectRatio = msoFalse
If .Width > xRg.Width Then .Width = xRg.Width * 2 / 3
If .Height > xRg.Height Then .Height = xRg.Height * 2 / 3
.Top = xRg.Top + (xRg.Height - .Height) / 2
.Left = xRg.Left + (xRg.Width - .Width) / 2
End With
lab:
Set Pshp = Nothing
Range("A2").Select
Next
Application.ScreenUpdating = True
End Sub -
Mutt
senior tag
Annyi pontosítás, hogy ahogy nézem a sort könnyebben el lehet érni, vagyis a a kód rövidebb tud lenni.
illetve annyit finomítottam, hogy csak akkor frissít ha a linkedcell értéke nem jó.
Sub UpdateLinkedCells()
Dim sp As Shape
Dim rng As Range
Const sorEltol As Long = 0
Const oszlopEltol As Long = 7
For Each sp In ActiveSheet.Shapes
'az aktív lapon talált objektumok közül csak a jelölőnégyzeteket keressük meg
'hiba esetén menjünk tovább
On Error Resume Next
If sp.DrawingObject.progID Like "*CheckBox*" Then
'a jelőlőnégyzet a TopLeftCell.Column oszlopban található, a sort pedig TopLeftCell.Row adja meg
'a sor és oszlop azonosítókat csal akkor toljuk el a megadott értékkel ha ráférnek még a lapra
If sp.TopLeftCell.Row + sorEltol <= Rows.Count And sp.TopLeftCell.Column + oszlopEltol <= Columns.Count Then
Set rng = Cells(sp.TopLeftCell.Row + sorEltol, sp.TopLeftCell.Column + oszlopEltol)
'frissítsünk ha az új hely máshol van
If Intersect(rng, ActiveSheet.Range(sp.DrawingObject.LinkedCell)) Is Nothing Then
'mentsük át az új helyre az eddigi értéket
rng = ActiveSheet.Range(sp.DrawingObject.LinkedCell)
'töröljük a korábbi hely tartalmát
ActiveSheet.Range(sp.DrawingObject.LinkedCell).ClearContents
'linkeljük be az újat
sp.DrawingObject.LinkedCell = rng.Address
End If
End If
End If
On Error GoTo 0
Next sp
End Sub -
szricsi_0917
tag
Szia
Sub kmfrissites_auto()
Dim auto As Worksheet
Dim utnyilvan As Worksheet
Dim szerviz As Worksheet
Dim lastrow
Dim lastrow1
Dim lastrow2
Dim i As Long
Dim a As Long
Dim vMax As Double
Dim xMax As Double
'On Error GoTo kmfrissites_auto_Error
Set auto = Sheets("Autó")
Set utnyilvan = Sheets("Útnyilvántartó")
Set szerviz = Sheets("Szerviznyilvántartó")
lastrow = auto.Cells(Rows.Count, 1).End(xlUp).Row
lastrow1 = utnyilvan.Cells(Rows.Count, 1).End(xlUp).Row
lastrow2 = szerviz.Cells(Rows.Count, 1).End(xlUp).Row
For i = 2 To lastrow
For a = 10 To 21
auto.Range("V" & i) = Evaluate("=SumProduct(Max((Szerviznyilvántartó!B2:B" & lastrow2 & " = Autó!B" & i & ") * (INDIRECT(""'Szerviznyilvántartó'!"" & address(2," & a & ",4) & "":"" & INDIRECT(address(" & lastrow2 & "," & a & ",4)) = ""Motorolajcsere"") * Szerviznyilvántartó!G2:G" & lastrow2 & "))")Átalakítottam az általad javasolt megoldásra viszont újabb probléma merült fel.
Több feltételt szeretnék hozzárakni. A probléma, hogy a 2. feltétel más méretű tömb mint a többi így ugye hibára fut a képlet.
For ciklussal oldottam meg, hogy a 2. feltételnél oszloponként megy újra végig és mindig az utolsó legnagyobb értéket hagyja meg így a végén megkapom majd a maximum értéket.
A probléma, hogy az indirect megoldással mindig érték hibára fut. Mi lehet a probléma? -
Mutt
senior tag
válasz
mulli86 #44058 üzenetére
Szia,
1. lastsor típusa Long legyen, mert az integer csak 32 ezer sorral fog bírni.
2. A hibaname és oszlopnumber a két for cikluson belül van inicilaziálva ami nem jó, hozd ki őket a for-ok elé.
3. Variant a hibaname típusa, de közben a cella értékét ellenőrzöd. Jobb lenne egy specifikus típust használnod pl. Double ha számok érdekelnek, vagy String ha szöveg.
4. Ha sokat dolgozol egy lapon akkor érdemes With ... End With-et használnod.
pl.With Worksheets(1)
lastsor = .Range("A5").End(xlDown).Row
For x ...
For y ...
hibaname = .Cells(5, y)
For p ...
If hibaname = Sheets(3).Cells(1,p) then
....
End If
Next p
Next y
Next x
End With5. A GoTo rész biztos hogy kell? Miért nem teszed az IF-be az ottani dolgokat?
6. Sokat gyorsít a "villódzás" kikapcsolása.
Application.ScreenUpdating = False a for ciklusok elé, majd = True a legvégén.üdv
-
Fferi50
Topikgazda
válasz
ROBOTER #43323 üzenetére
Szia!
A nevek mindaddig megmaradnak a munkafüzetben, amíg ki nem törölted azokat - mindegy, hogy a munkafüzetben kézzel vagy makróval hoztad létre azokat. Tehát ismételt megnyitás esetén nem is kell már foglalkozni velük, hacsak nem módosítani szükséges.
Ha nem létezik a név, a Subscript out of Range (9 -es hibaszám) hibaüzenet adja tudtul.On Error Resume Next
nev=names("neve").name
if Err=9 Then ' a név még nincs létrehozva
létrehozod a nevet
endif
Err=0
On Error Goto 0
Üdv.
-
Delila_1
veterán
válasz
ny.erno #43238 üzenetére
Külön oszlopokba írd a termékeket. A megfelelő cellákba elég egy betűt írnod. Ha nem volt még a termékednek lapja, a makró létrehozza. Beírja az adatokat a megfelelő helyekre.
A makrót az Adatbazis laphoz kell rendelned.
Private Sub Worksheet_Change(ByVal Target As Range)
Dim lapnev, usor As Long, LN As String, uoszlop As Integer
uoszlop = Cells(1, Columns.Count).End(xlToLeft).Column
If Target.Column > 2 And Target.Column < uoszlop And Target.Row > 1 And Target.Count = 1 Then
Application.EnableEvents = False
On Error Resume Next
LN = Cells(1, Target.Column)
Set lapnev = Sheets(LN)
If Err.Number <> 0 Then
Sheets.Add.Name = LN
Sheets(LN).Move After:=Sheets.Count + 1
On Error GoTo 0
End If
With Sheets(LN)
.Cells(1) = "Név": .Cells(2) = "Email"
.Cells(3) = "Termék": .Cells(4) = "Kapcsolati forrás"
usor = .Range("A" & Rows.Count).End(xlUp).Row + 1
.Cells(usor, 1) = Cells(Target.Row, "A")
.Cells(usor, 2) = Cells(Target.Row, "B")
.Cells(usor, 3) = LN
.Cells(usor, 4) = Cells(Target.Row, uoszlop)
End With
Sheets("Adatbazis").Move Before:=Sheets(1)
Application.EnableEvents = True
End If
End SubSzerk.: a termékek számát bővítheted, vagy szűkítheted.
-
zsolti_20
senior tag
válasz
Delila_1 #43111 üzenetére
Bedobom ide a teljes kódot, így lesz a legjobb. Kicsi alakítottam rajta, de sajnos mindig errort kapok pont ott ahol el kellene kezdenie átmásolni.
Function getFile() As Workbook
Dim fn As Variant
fn = Application.GetOpenFilename(FileFilter:="Excel Files (*.xls*), *.xls*", Title:="Select workbook")
If TypeName(fn) <> "Boolean" Then Set getFile = Workbooks.Open(fn)
End Function
Sub useGetFile()
Dim Dic As Object, key As Variant, oCell As Range, i&
Dim wb1 As Workbook, wb2 As Workbook
Dim wb1Sheet1 As Worksheet, wb2Sheet1 As Worksheet
Set wb2 = getFile
If Not wb2 Is Nothing Then
On Error Resume Next
Set wb2Sheet1 = wb2.Sheets("Sheet1")
On Error GoTo 0
If Not wb2Sheet1 Is Nothing Then
Set wb1 = Workbooks("1.xlsx")
Set wb1Sheet1 = wb1.Sheets("Sheet1")
i = wb1.Cells.SpecialCells(xlCellTypeLastCell).Row
For Each oCell In wb1.Range("A1:A" & i)
If Not Dic.exists(oCell.Value) Then
Dic.Add oCell.Value, oCell.Offset(, 3).Value
End If
Next
i = wb2.Cells.SpecialCells(xlCellTypeLastCell).Row
For Each oCell In wb2.Range("A2:A" & i)
For Each key In Dic
If oCell.Value = key Then
oCell.Offset(, 2).Value = Dic(key)
End If
Next
Next
Else
MsgBox "Sheet1 not found in " & wb2.Name, vbCritical
End If
'Maybe close wb2 here?
wb2.Close SaveChanges:=False
Else
Debug.Print "User cancelled"
End If
Set wb1 = Nothing
Set wb2 = Nothing
Set wb1Sheet1 = Nothing
Set wb2Sheet1 = Nothing
End Sub -
zsolti_20
senior tag
válasz
Delila_1 #43106 üzenetére
Ígérem mára az utolsó kérdés
Van két excel fileom, az elsőben az A oszlopban lefelé vannak számok felsorolva, amik mellett a B oszlopban adat van megadva Pl 1 | a 2 | b stb...
Itt van jó pár száz sor. A másik excel fileban van a több száz szám közül néhány, van amikor 5 de van amikor 20. Szeretném ezeket a számokat megkeresni az első excel fileban, és a megfelelő szám mellé a megfelelő értéket átmásolni, hogy ne nekem kelljen egyesével kikeresgélni.Sub VlookMultipleWorkbooks()
Dim lookFor As Range
Dim srchRange As Range
Dim book1 As Workbook
Dim book2 As Workbook
Dim book2Name As String
book2Name = "1.xlsx" 'modify it as per your requirement
Dim book2NamePath As String
book2NamePath = ThisWorkbook.Path & "\" & book2Name
Set book1 = ThisWorkbook
If IsOpen(book2Name) = False Then Workbooks.Open (book2NamePath)
Set book2 = Workbooks(book2Name)
Set lookFor = book1.Sheets(1).Cells(5, 1) ' value to find
Set srchRange = book2.Sheets(1).Range("A:B") 'source
lookFor.Offset(0, 1).Value = Application.VLookup(lookFor, srchRange, 2, False)
End Sub
Function IsOpen(strWkbNm As String) As Boolean
On Error Resume Next
Dim wBook As Workbook
Set wBook = Workbooks(strWkbNm)
If wBook Is Nothing Then 'Not open
IsOpen = False
Set wBook = Nothing
On Error GoTo 0
Else
IsOpen = True
Set wBook = Nothing
On Error GoTo 0
End If
End Function
Ez a kód egész jó lenne, de a probléma az, hogy abba a sorba akarja beilleszteni az értéket ahonnan kimásolta előtte, de az adott szám nem a 68-ik sorban van hanem mondjuk a harmadikban.
A másik probléma hogy csak egy értéket másol át de én az összeset szeretném egyszerre. -
Fferi50
Topikgazda
Szia!
A "kulcsok" megfeleltetését egy táblázatba érdemes foglalni. Szerintem érdemes a formázást egy munkalapon manuálisan megcsinálni, utána pedig ezt lehet másolni.
Nálam a kódtábla ugyanazon a lapon van, ahol az adatok, és az alábbi makrót erről az aktív munkalapról kell indítani:Sub osztas()
Dim sh As Worksheet, wb As Workbook, cl As Range, tabla As Range, klcs As String, mlapnev As String, sh1 As Worksheet
Set sh = ActiveSheet
Set tabla = Range("X1:Y100") 'itt van a kulcstábla
On Error Resume Next
For Each cl In sh.UsedRange.Columns(1).Offset(1, 0).Cells 'az első oszlopon a 2. cellától megy végig
If cl.Value = "" Then Exit For 'üres cella esetén kilép a ciklusból
klcs = Left(cl.Value, 2) ' az első két karakter a kulcs
mlapnev = tabla.Find(what:=klcs, LookIn:=xlValues, lookat:=xlWhole).Offset(0, 1).Value
If Err = 0 Then ' ha megtaláltuk az értéket a kulcstáblában, akkor
Set sh1 = Sheets(mlapnev)
If Err = 9 Then ' ha még nincs ilyen nevű munkalap
Sheets("Sablon").Copy after:=Sheets(Sheets.Count) ' a Sablon nevű munkalapot másoljuk
Set sh1 = Sheets(Sheets.Count) ' és átnevezzük
sh1.Name = mlapnev
Err = 0
End If
sh1.Cells(Rows.Count, 2).End(xlUp).Offset(1, 0).Value = cl.Value 'a B oszlop első üres cellájába másoljuk a cella értékét
Else ' figyelmeztetés, hogy olyan kulcs van, amihez még nincs érték
MsgBox "Ehhez a kulcshoz nincs név: " & klcs, vbInformation
Err = 0 ' ezt az értéket figyelmen kívül hagyja és megy tovább
End If
Next
On Error GoTo 0
sh.Activate
MsgBox "kész vagyok", vbExclamation
End Sub
A már meglevő munkalapokon az adatok nem íródnak felül, tehát ismételt feldolgozás esetén duplázódnak.
Ha kérdésed van, írj bátran.
Üdv. -
sztanozs
veterán
válasz
szőröscica #42427 üzenetére
1) nem látom, hogy a boundary definiálva lenne
2) nem xml adat amit átadsz (nem beszédes a változónév)
3) nincsenek definiálva a változók
Nem bonyolítod el ezt egy kicsit?Én így küldök GET/POST ützenetet:
Public Function CMD_ServiceXML(ByRef Vars As Variant, Query As String, Optional Method As String = "GET") As Object
Dim strResponse As String
Dim objHTTP As Object
Set objHTTP = CreateObject("Microsoft.XMLHTTP")
If IsArray(Vars) Then
Dim var, vx
vx = 0
For Each var In Vars
Query = Replace(Query, "{" & vx & "}", URLEncode(CStr(var)))
vx = vx + 1
Next
Else
Query = Replace(Query, "{0}", UCase(Vars))
End If
If UCase(Method) = "GET" Then
objHTTP.Open "GET", Query, False
objHTTP.Send
ElseIf UCase(Method) = "POST" Then
Dim URI
URI = Split(Query, "?")
objHTTP.Open "GET", URI(0), False
objHTTP.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
objHTTP.Send URI(1)
Else
Set CMD_ServiceXML = Nothing
End If
If objHTTP.statusText = "OK" Then
strResponse = objHTTP.ResponseText
Set objHTTP = Nothing
Else
Set CMD_ServiceXML = Nothing
Set objHTTP = Nothing
Exit Function
End If
Set CMD_ServiceXML = CreateObject("Msxml2.DOMDocument.3.0") ''// Using MSXML 3.0
On Error Resume Next
CMD_ServiceXML.LoadXML strResponse
If err Then
Debug.Print "<CMD XML>", Vars, strResponse
err.Clear
Set CMD_ServiceXML = Nothing
End If
On Error GoTo 0
End Function -
Fferi50
Topikgazda
válasz
Richard #42223 üzenetére
Szia!
Ha van a szűrésnek eredménye, akkor csak a szűrt értékeket másolja a DataBodyRange.Copy.
A DataBodyRange az a fejléc és összesítősor nélküli tartományt jelenti. Ha nincs a szűrésnek eredménye, akkor ennek nincs látható része, tehát a SpecialCells(xlCelltypeVisible) hibával tér vissza és ezt a hibaüzenetet az Application.DisplayAlert paranccsal sem tudod elnyomni, csak a megelőző On Error Resume Next utasítással ellenőrizheted, hogy hiba keletkezett-e .
On Error Resume Next
ListObjects(1).DataBodyRange.SpecialCells(xlCellTypeVisible).Copy
If Err<>0 Then Msgbox "Nincs mit másolni"
On Error Goto 0
Viszont így a teljes tartomány egyben marad, ezért a sima DataBodyRange.Copy másolja az egészet. (Lehet, hogy ez bug, mert ilyenkor hibát kellene logikusan adni, ezt igazából Redmond tudhatja, miért nem így van.)
A szűrés eredményét a táblázat teljes tartományának vizsgálatával is tudod ellenőrizni.
pl. így, ekkor nem kell hibakezelés bele:ListObjects(1).Range.SpecialCells(xlCellTypeVisible).Rows.Count
Üdv. -
Delila_1
veterán
válasz
Fferi50 #42205 üzenetére
Egy keveset módosítottam, mert X-et tett oda is, ahova nem kellett volna, no meg a kérdezőnek .png képei vannak.
For Each Pic In Pics
Pic.Offset(0, -1).Select
On Error Resume Next
ActiveSheet.Shapes.AddPicture Filename:=Path & Pic.Value & ".png", linktofile:=msoFalse, saveWithdocument:=msoTrue, Left:=Pic.Offset(0, -1).Left + 5, Top:=Pic.Top, Width:=50, Height:=60
If Pic.Value = "" Or Err <> 0 Then
Pic.Offset(0, -1).Value = "X"
Pic.Offset(0, -1).Font.ColorIndex = 3
On Error GoTo 0
Else
Pic.RowHeight = 60
End If
Next
-
Delila_1
veterán
válasz
bucihost #42170 üzenetére
Másik megoldás, hogy a "nagy piros x kép" ne növelje a fájl méretét.
A két, csillagokkal jelölt sor a kép méretét határozza meg. A 0.4-et írd át kedved szerint. Ki is hagyható ez a két sor.Sub PlacePics()
Dim Path As String, Pics As Range, Pic As Range
Path = "C:\Users\branyiczkif\Desktop\AjanlatKepek\kepek\"
Set Pics = ActiveSheet.Range("B2:B20")
For Each Pic In Pics
Pic.Offset(0, -1).Select
On Error Resume Next
ActiveSheet.Pictures.Insert(Path & Pic.Value & ".png").Select
Selection.ShapeRange.ScaleWidth 0.4, msoFalse, msoScaleFromTopLeft '***
Selection.ShapeRange.ScaleHeight 0.4, msoFalse, msoScaleFromTopLeft '***
If VarType(Selection.ShapeRange) = vbError Then
Pic.Offset(0, -1).Value = "X"
Pic.Offset(0, -1).Font.ColorIndex = 3
On Error GoTo 0
End If
Next Pic
End Sub
-
karlkani
aktív tag
válasz
Fferi50 #42072 üzenetére
Szia!
Értem.
Jól sejted, van egy másik lap, onnan nézi a dátumokat.(#42073) ny.janos
Feltételes formázásnál ez a képlet szerepel:=DARABTELI(Ünnepnapok;$C1)>0
(#42076) Delila_1
Ezzel a képlettel működik:=HA(DARABTELI(Ünnepnapok;C2251)>0;DARABTELI(Ünnepnapok;C2251);"")
Annak idején segítettél nekem létrehozni ezt a makrót:
Function Orak(tartomany As Range)
Dim CV As Range, osszeg As Double, WSD As Worksheet, WF As WorksheetFunction
Set WSD = Sheets("Dátum")
Set WF = Application.WorksheetFunction
For Each CV In tartomany
If Not IsNumeric(CV) Or CV = "" Then GoTo Tovabb
If WF.CountIf(WSD.Columns(4), Cells(CV.Row, "C")) = 0 And _
WF.CountIf(WSD.Columns(6), Cells(CV.Row, "C")) = 0 And _
WF.Weekday(Cells(CV.Row, "C"), 2) < 6 Or _
WF.CountIf(WSD.Columns(2), Cells(CV.Row, "C")) > 0 Then osszeg = osszeg + CV
Tovabb:
Next
Orak = osszeg
End Function
Már többször előfordult, hogy a füzet megnyitásakor az összes olyan cella értéke, ami ezt a makrót használja összegzésre 0-ra módosult. Csak úgy tudtam újraszámoltatni, hogy a cellára álltam, szerkesztőléc, Enter (sok cellánál ez elég macerás), vagy átneveztem a fájlt, vagy töröltem a fájlra vonatkozó bejegyzést a regisztrációs adatbázisból az alábbi helyen.
HKEY_CURRENT_USER\Software\Microsoft\Office\15.0\Excel\Security\Trusted Documents\TrustRecords
Ötlet?
-
lappy
őstag
válasz
Doki16 #41477 üzenetére
egy vba
Sub ColorCompanyDuplicates()
'Updateby Extendoffice 20160704
Dim xRg As Range
Dim xTxt As String
Dim xCell As Range
Dim xChar As String
Dim xCellPre As Range
Dim xCIndex As Long
Dim xCol As Collection
Dim I As Long
On Error Resume Next
If ActiveWindow.RangeSelection.Count > 1 Then
xTxt = ActiveWindow.RangeSelection.AddressLocal
Else
xTxt = ActiveSheet.UsedRange.AddressLocal
End If
Set xRg = Application.InputBox("please select the data range:", "Excel", xTxt, , , , , 8)
If xRg Is Nothing Then Exit Sub
xCIndex = 2
Set xCol = New Collection
For Each xCell In xRg
On Error Resume Next
xCol.Add xCell, xCell.Text
If Err.Number = 457 Then
xCIndex = xCIndex + 1
Set xCellPre = xCol(xCell.Text)
If xCellPre.Interior.ColorIndex = xlNone Then xCellPre.Interior.ColorIndex = xCIndex
xCell.Interior.ColorIndex = xCellPre.Interior.ColorIndex
ElseIf Err.Number = 9 Then
MsgBox "Too many duplicate companies!", vbCritical, "Excel"
Exit Sub
End If
On Error GoTo 0
Next
End Sub -
Delila_1
veterán
válasz
sz_abika #41082 üzenetére
Azonos füzetbe tettem a körte és alma nevű lapokat, amiknek a nevét a Munka1!A1 cellában választom ki, vagy írom be.
Biztosan át tudod alakítani a makrót úgy, hogy a lapok nevét ne a saját füzetben, hanem a ladak.xls-ben keresse, és onnan másoljon.Sub Masolas()
Dim a, lapnev As String
lapnev = Sheets(1).Range("A1")
On Error Resume Next
Set a = Sheets(lapnev) '***
If Err.Number <> 0 Then
MsgBox "Nincs " & lapnev & " nevű lap", vbCritical
Else
Sheets(lapnev).Range("A1:C5").Copy Sheets(1).Range("A2") '*** (sor elején)
End If
On Error GoTo 0
End Sub***-gal jelöltem, hol kell megadnod a másik füzet útvonalát, nevét.
-
Mutt
senior tag
válasz
bartucz911 #41001 üzenetére
Szia,
Köszi a pontosítást. Beépített függvényekkel nem sikerült értelmes eredményt kihoznom, de ha UDF (makrós függvény) is játszik, akkor ezt próbáld ki. Alt-F11-el VBE szerkesztő megnyilik, majd ott Insert -> Module és a megjelenő üres ablakba másold be a kódot.
Function NextMatch(adat As Range)
Dim szam As Range
Dim szamok As New Collection
On Error GoTo ismetlodes
For Each szam In adat
If Len(szam.Value) > 0 Then
szamok.Add szam.Value, CStr(szam.Value)
End If
Next szam
Exit Function
ismetlodes:
NextMatch = szamok.Count
End FunctionEzek után lesz egy NextMatch függvényed, amely egy tartományt vár ahol a vizsgálandó számok vannak (a tartomány elejét ne fixáld!).
üdv
-
Pakliman
tag
válasz
-szabi- #40996 üzenetére
Szia!
Egy lehetőség:
(A wiki oldalát jelöld ki CTRL+A-val, majd CTRL+C, aztán a makró indítása)Sub Olvas()
Dim oClip As Object
Dim arr
Dim db As Long
Dim i As Long
Dim sor As Long
Dim bKód As Boolean
'Ez a Microsoft Forms 2.0 Object Library "késői kötése" (c:\windows\system32\FM20.DLL)
Set oClip = CreateObject("New:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")
On Error GoTo Hiba
oClip.GetFromClipboard
'Beolvassuk egy tömbbe a szöveget...
arr = Split(oClip.GetText(1), vbCrLf)
db = UBound(arr)
bKód = False
sor = 0
For i = 0 To db
If arr(i) Like "### ?*" Then
bKód = True
sor = sor + 1
Cells(sor, 1) = Left(arr(i), 3)
Cells(sor, 2) = Mid(arr(i), 5)
End If
If bKód = True Then
If arr(i) Like " ?*" Then
Cells(sor, 3) = Cells(sor, 3) & IIf(Cells(sor, 3) <> "", vbCrLf, "") & Mid(arr(i), 5)
End If
End If
Next i
Hiba:
End Sub -
Delila_1
veterán
Egyszerűbb lenne, ha telepítenéd a naptár vezérlőt, de itt egy ellenőrző makró. A (végül) bevitt dátumot az A1 cellába írja be.
Sub Dat_ellenorzes()
Dim kelt As String
kelt = Application.InputBox("Add meg dátumot", "Dátum bekérése", , , , , , 2)
'Ellenőrzés
'Teljes hossz
If Len(kelt) <> 10 Then GoTo Hiba
'Pontok helye
If Mid(kelt, 3, 1) <> "." Then GoTo Hiba 'nap
If Mid(kelt, 6, 1) <> "." Then GoTo Hiba 'hónap
'Szám-e
If Not IsNumeric(Left(kelt, 2)) Then GoTo Hiba 'nap
If Not IsNumeric(Mid(kelt, 4, 2)) Then GoTo Hiba 'hónap
If Not IsNumeric(Right(kelt, 4)) Then GoTo Hiba 'év
'Számok helyessége
If Left(kelt, 2) > "31" Then GoTo Hiba 'nap
If Mid(kelt, 4, 2) > "12" Then GoTo Hiba 'hónap
Select Case Mid(kelt, 4, 2) 'hónap
Case "02" 'február
If Right(kelt, 4) / 4 <> Int(Right(kelt, 4) / 4) And Left(kelt, 2) > 28 Then GoTo Hiba
Case "04", "06", "09", "11" '30 napos hónapok
If Left(kelt, 2) > 30 Then GoTo Hiba
End Select
If Right(kelt, 4) / 4 = Int(Right(kelt, 4) / 4) And Mid(kelt, 4, 2) = "02" _
And Left(kelt, 2) > 29 Then GoTo Hiba 'szökőév február
Range("A1") = CDate(kelt)
Exit Sub
Hiba:
Dat_ellenorzes
End Sub -
Pakliman
tag
válasz
JagdPanther #40870 üzenetére
Szia!
Ennek így működnie kell:
Public Sub SendEmail()
Dim olApp As Object
Dim olMail As Object
Dim row_number As Long
Set olApp = CreateObject("Outlook.Application")
On Error Resume Next
For row_number = 2 To 6
Set olMail = olApp.CreateItem(0)
With olMail
.to = Worksheets("Lista1").Cells(row_number, 1)
.Subject = Worksheets("Lista1").Cells(row_number, 2)
.Body = Worksheets("Lista1").Cells(row_number, 3)
.send
End With
Next row_number
On Error GoTo 0
Set olMail = Nothing
Set olApp = Nothing
End SubJavítottam...
-
Pakliman
tag
válasz
tgumis #40459 üzenetére
Szia!
Még egyszerűbben, villogtatás nélkül:
Sub keplet_helyett_ertek()
Dim ws As Worksheet
On Error Resume Next
For Each ws In Worksheets
ws.Cells.SpecialCells(xlCellTypeFormulas, 23).Formula = ws.Cells.SpecialCells(xlCellTypeFormulas, 23).Value
Next ws
On Error GoTo 0
End Sub -
Delila_1
veterán
válasz
tgumis #40459 üzenetére
Sub keplet_helyett_ertek()
Dim lap As Integer, akt_range As Range
For lap = 1 To Sheets.Count
Sheets(lap).Activate 'Lap aktívvá tétele
'Képleteket tartalmazó tartományok kijelölése
On Error Resume Next 'Hibakezelés, ha nincs képlet
Selection.SpecialCells(xlCellTypeFormulas, 23).Select
'A keletkezett területek bejárása és képlet-érték csere
For Each akt_range In Selection.Areas
akt_range.Formula = akt_range.Value
Next
On Error GoTo 0
Next
End Sub -
Mutt
senior tag
válasz
sz_abika #40408 üzenetére
Szia,
Itt az én változatom a problémára:
Dim wsSource As Worksheet
Dim i As Long
Const wsName = " 1234"
i = 0
Do
i = i + 1
On Error Resume Next
Set wsSource = Sheets(Trim("xxx" & Mid(wsName, i, 1)))
On Error GoTo 0
Loop While wsSource Is Nothing And i < Len(wsName)
If wsSource Is Nothing Then
Call MsgBox("A keresett munkalap nem található", vbOKOnly, "Információ")
Else
ActiveCell.Offset(-2, 0).Value = wsSource.Range("A1")
End Ifüdv
-
Delila_1
veterán
válasz
wednesday #39628 üzenetére
Private Sub CommandButton1_Click()
Dim sor As Variant
On Error Resume Next
sor = Sheets(1).Range("A:A").Find(CDate(TextBox1)).Row
If IsEmpty(sor) Then
MsgBox "Nem található " & TextBox1 & " dátum az A oszlopban.", vbCritical
On Error GoTo 0
Exit Sub
Else: MsgBox sor
End If
End Sub -
Delila_1
veterán
válasz
Iethau #39608 üzenetére
A két lap neve nálam Régi és Friss. Az ügyfelek neve mindkét lapon az A oszlopban van. Írd át a makróban a saját lapjaid nevére.
A makrót modulba másold, ennek módját lásd a Téma összefoglalóban.Sub Frissites()
Dim sor As Long, talal, usor As Long
Sheets("Régi").Activate
usor = Range("A" & Rows.Count).End(xlUp).Row
For sor = usor To 2 Step -1
On Error Resume Next
talal = Application.Match(Cells(sor, "A"), Sheets("Friss").Columns("A"), 0)
If IsError(talal) Then Rows(sor).Delete Shift:=xlUp
On Error GoTo 0
Next
End Sub -
Delila_1
veterán
válasz
littleNorbi #39494 üzenetére
Másold a lap moduljába a makrót.
Private Sub Worksheet_Change(ByVal Target As Range)
Dim lapnev, ide As Long
If Target.Column = 4 And Target.Value <> "" And Target.Count = 1 Then
On Error Resume Next
Set lapnev = Sheets(Target.Value)
If Err.Number <> 0 Then
MsgBox "Nincs " & Target & " nevű lap", vbCritical
On Error GoTo 0
Exit Sub
End If
ide = Sheets(lapnev).Range("A" & Rows.Count).End(xlUp).Row + 1
Range("A" & Target.Row & ":D" & Target.Row).Copy Sheets(lapnev).Cells(ide, 1)
End If
End Sub -
Fferi50
Topikgazda
válasz
kezdosql #38967 üzenetére
Szia!
Próbáld ki az alábbi makrót:
Sub atrako()
Dim ws1 As Worksheet, ws2 As Worksheet, cl As Range, xx As Long, helye As Range, kodja As Range, kod As String
Set ws1 = Sheets("Munka1")
On Error Resume Next
Set ws2 = Sheets("Jelent?s")
If Err = 9 Then
Set ws2 = Sheets.Add(after:=Sheets(Sheets.Count))
ws2.Name = "Jelent?s"
Else
ws2.UsedRange.Clear
End If
On Error GoTo 0
With ws1.Range("A1").CurrentRegion
For Each cl In .Columns(1).Cells
If cl.Row > 1 Then
If Application.WorksheetFunction.CountA(.Rows(cl.Row)) > 1 Then
Set helye = ws2.Columns(1).Find(what:=cl, LookIn:=xlValues, lookat:=xlWhole)
If helye Is Nothing Then
Set helye = ws2.Cells(Rows.Count, 1).End(xlUp).Offset(1, 0)
helye.Value = cl.Value: ws2.Columns.AutoFit
End If
For xx = 1 To .Columns.Count
With cl.Offset(0, xx)
If .Value <> "" Then
kod = Left(.Value, 4)
Set kodja = ws2.Rows(1).Find(what:=kod, LookIn:=xlValues, lookat:=xlWhole)
If kodja Is Nothing Then
Set kodja = ws2.Cells(1, Columns.Count).End(xlToLeft).Offset(0, 1)
kodja.Value = kod
End If
ws2.Cells(helye.Row, kodja.Column).Value = Mid(.Value, 5)
End If
End With
Next
End If
End If
Next
End With
With ws2.UsedRange
.Range("A1") = "A000"
.Sort key1:=Range("A1"), order1:=xlAscending, Orientation:=xlSortRows, Header:=xlYes
.Sort key1:=Range("A1"), order1:=xlAscending, Orientation:=xlSortColumns, Header:=xlYes
.Range("A1").Clear
End With
End SubAz alapadatok a Munka1 munkalapon vannak, ha más a lap neve, írd át légy szíves. Az új elrendezést a Jelentés nevű munkalapon hozza létre. Ha nincs ilyen nevű lap, akkor megkreálja, ha már van akkor törli a tartalmát - tehát többször is lefuttatható.
A kód szerinti sorbarendezésnél fontos, hogy az egyes oszlopokban használt négyjegyű kódok első betűje minden oszlopban az előzőnél hátrább legyen az ABC-ben (A011,B0XX,C100 stb). A sorbarendezés akkor is megy, ha nem így van, csak akkor nem lesznek az oszlopok kódjai egymás után.
Kiindulás:
Eredmény:
Üdv. -
Delila_1
veterán
válasz
BalanceR #38735 üzenetére
Legyen mindkét füzet megnyitva. Nálam a Füzet1.xlsm-ben van a makró, modulban, a másik neve Füzet2.xlsx.
Mindkét füzetben Munka1 a lap neve, és címsort feltételezek.Sub Egyeztet()
Dim sor As Long, usor As Long
Dim WS1 As Worksheet, WS2 As Worksheet, talal
Set WS1 = Workbooks("Füzet1.xlsm").Sheets("Munka1")
Set WS2 = Workbooks("Füzet2.xlsx").Sheets("Munka1")
WS1.Activate
usor = Range("A" & Rows.Count).End(xlUp).Row
For sor = usor To 2 Step -1
On Error Resume Next
talal = Application.Match(Cells(sor, 1), WS2.Columns(1), 0)
If IsError(talal) Then
Rows(sor).Delete Shift:=xlUp
On Error GoTo 0
Else
Cells(sor, 9) = WS2.Cells(talal, 9)
End If
Next
End Sub -
Peddy789
őstag
Tiszteletem!
legujabb excelben:
importalok egy 160ezer soros txt-t.
Minden sor elso cellaja egy MB1 MB3 vagy MB4 uzenettel kezdodik
Ezt a kesobbi feldolgozas miatt szetakarom osztani mondjuk 3 kulon munkalapra, hogy az egyik munkalapon csak az MB1es sorok a masikon csak MB2-vel kezdodo stb sorok maradjnak.Szurovel megtudtam oldani hogy kijelolom a szurt sorokat es nyomok egy deletet, azomban igy rengeteg ures sor marad, ami utana elrontja a fugvenyeket amik az adot adat alatti cellat keresik, de igy csak ures cellakat talalnak.
Hogyan lehet ezt gyorsan elintezni? Hogy szetosszam az adatot 3 munkalapra, es ne maradjanak ures sorok az adatok kozott?
Probaltam a find&select goto special, select all blank-el hogy aztan ha kivannak jelolve az osszes sort torlom, de ez sajnos nem mukodik, az excel egyszeruen befagy a tulsok sor miatt, fura.
Nagyon koszonom a valaszokat elore is!
-
Mutt
senior tag
Szia,
...ugyan abban a sorrendben hagyja a füleket mint ahogy van...
A lenti kód már figyel a sorrendre is és kitörli az új fájl létrehozásakor automatikusan létrejövö felesleges lapo(ka)t.
A másik hiba pedig abból adódik, hogy mindent másolunk (értéket, képletet, formázást, elnevezett tartományokat stb) és ez ütközést okoz. Mindegyik fájlban ugyanaz a változó van a névkezelőben, így másoláskor ez hibára fog futni.
A Power Query megoldás csak egy lapot kezel, de viszonylag gyorsan lehet mindegyik lapra elkészíteni a lekérdezesét és legközelebb már csak a frissítésre kell kattintani, hogy az összes lapot legenerálja.
Sub ttt()
Dim forraslap As Worksheet, cellap As Worksheet
Dim forrasfuzet As Workbook
Dim lap As Worksheet
Dim ureslapok() As String, c As Long
mappak = Array("D:\Mappa\")
If Dir("D:\Mappa\eredmeny.xlsx") <> "" Then Kill "D:\Mappa\eredmeny.xlsx"
For Each mappa In mappak
Set uj = Workbooks.Add
'megjegyezzük a frissen létrehozott fájlban lévő üreslapokat
ReDim ureslapok(1 To uj.Worksheets.Count)
For i = 1 To UBound(ureslapok)
ureslapok(i) = uj.Worksheets(i).Name
Next i
fajl = Dir(mappa & "*.xlsx")
Do While fajl <> ""
Set forrasfuzet = Workbooks.Open(Filename:=mappa & fajl, ReadOnly:=True)
For i = 1 To forrasfuzet.Worksheets.Count
Set forraslap = forrasfuzet.Worksheets(i)
Set cellap = Nothing
If forraslap.Visible = xlSheetVisible Then 'csak a látható lapok érdekelnek
On Error Resume Next
'próbáljuk megnyitni az új füzetben a forrásban található azonos nevű lapot
Set cellap = uj.Worksheets(forraslap.Name)
On Error GoTo 0
If IsArray(ureslapok) Then
For c = 1 To UBound(ureslapok)
If forraslap.Name = ureslapok(c) Then 'ezt a lapot meg kell tartanunk mert volt a forrásfájlban
ureslapok(c) = ""
End If
Next c
End If
'ha nincs még az új füzetben ilyen nevű lap, akkor létrehozzuk
If cellap Is Nothing Then
Set cellap = uj.Worksheets.Add(after:=Worksheets(forraslap.Index - 1)) 'sorrendben adja hozzá
cellap.Name = forraslap.Name
End If
'ha még nincs fejléc akkor másoljuk
If cellap.Range("A1").CurrentRegion.Rows.Count = 1 Then
forraslap.Range("A1", forraslap.Range("A1").SpecialCells(xlLastCell)).Copy cellap.Range("A1")
Else
'ha már van fejléc akkor azt átugorjuk
forraslap.Range("A2", forraslap.Range("A1").SpecialCells(xlLastCell)).Copy _
cellap.Range("A" & cellap.Range("A1").CurrentRegion.Rows.Count + 1)
End If
End If
Next i
'bezárjuk a forrásfájlt
forrasfuzet.Close False
'jöhet az újabb fájl a mappából
fajl = Dir()
Loop
'felesleges munkalapok tőrlése a végső fájlból
Application.DisplayAlerts = False
If IsArray(ureslapok) Then
For c = 1 To UBound(ureslapok)
If ureslapok(c) <> "" Then
uj.Worksheets(ureslapok(c)).Delete 'erre a lapra már nincs szükség
End If
Next c
End If
Application.DisplayAlerts = True
uj.SaveAs mappa & "eredmeny.xlsx"
uj.Close False
Next
MsgBox "Kész"
End Subüdv
-
Mutt
senior tag
Próbáld meg ezt a javított makrót.
Sub ttt()
Dim forraslap As Worksheet, cellap As Worksheet
Dim forrasfuzet As Workbook
mappak = Array("D:\Mappa\")
If Dir("D:\Mappa\eredmeny.xlsx") <> "" Then Kill "D:\Mappa\eredmeny.xlsx"
For Each mappa In mappak
Set uj = Workbooks.Add
fajl = Dir(mappa & "*.xlsx")
Do While fajl <> ""
Set forrasfuzet = Workbooks.Open(Filename:=mappa & fajl, ReadOnly:=True)
For i = 1 To forrasfuzet.Worksheets.Count
Set forraslap = forrasfuzet.Worksheets(i)
Set cellap = Nothing
If forraslap.Visible = xlSheetVisible Then 'csak a látható lapok érdekelnek
On Error Resume Next
'próbáljuk megnyitni az új füzetben a forrásban található azonos nevű lapot
Set cellap = uj.Worksheets(forraslap.Name)
On Error GoTo 0
'ha nincs még az új füzetben ilyen nevű lap, akkor létrehozzuk
If cellap Is Nothing Then
Set cellap = uj.Worksheets.Add
cellap.Name = forraslap.Name
End If
'ha még nincs fejléc akkor másoljuk
If cellap.Range("A1").CurrentRegion.Rows.Count = 1 Then
forraslap.Range("A1", forraslap.Range("A1").SpecialCells(xlLastCell)).Copy cellap.Range("A1")
Else
'ha már van fejléc akkor azt átugorjuk
forraslap.Range("A2", forraslap.Range("A1").SpecialCells(xlLastCell)).Copy _
cellap.Range("A" & cellap.Range("A1").CurrentRegion.Rows.Count + 1)
End If
End If
Next i
'bezárjuk a forrásfájlt
forrasfuzet.Close False
'jöhet az újabb fájl a mappából
fajl = Dir()
Loop
uj.SaveAs mappa & "eredmeny.xlsx"
uj.Close False
Next
MsgBox "Kész"
End Sub -
Delila_1
veterán
válasz
GreenIT #37884 üzenetére
A Munka1 lap A1 cellájától kezdve bevittem az idei dátumokat, ez A365-ig tart.
A Munka2 lap A oszlopába az idei ünnepnapok dátumát írtam be, a C-be pedig a "ledolgozós" szombatokét.A lenti makró kitörli a Munka1 A oszlopából a megfelelő sorokat.
Sub Munkanapok()
Dim sor As Integer, WF As WorksheetFunction
Set WF = Application.WorksheetFunction
Sheets("Munka1").Select
For sor = 365 To 1 Step -1
If WF.CountIf(Sheets("Munka2").Columns(3), Cells(sor, 1)) > 0 Then GoTo Tovabb 'szombati munkanap
If WF.CountIf(Sheets("Munka2").Columns(1), Cells(sor, 1)) > 0 Then Rows(sor).Delete Shift:=xlUp 'ünnepnap
If WF.Weekday(Cells(sor, 1), 2) > 5 Then Rows(sor).Delete Shift:=xlUp 'hétvége
Tovabb:
Next
End SubAmelyik listában nem akarod a hétvégéket törölni, annál tedd megjegyzésbe a hétvégés makrós sort úgy, hogy a sor elejére aposztrófot teszel.
-
p5quser
tag
válasz
Fferi50 #37664 üzenetére
Sub SearchFolders()
'UpdatebyKutoolsforExcel20151202
Dim xFso As Object
Dim xFld As Object
Dim xStrSearch As String
Dim xStrPath As String
Dim xStrFile As String
Dim xOut As Worksheet
Dim xWb As Workbook
Dim xWk As Worksheet
Dim xRow As Long
Dim xFound As Range
Dim xStrAddress As String
Dim xFileDialog As FileDialog
Dim xUpdate As Boolean
Dim xCount As Long
On Error GoTo ErrHandler
Set xFileDialog = Application.FileDialog(msoFileDialogFolderPicker)
xFileDialog.AllowMultiSelect = False
xFileDialog.Title = "Select a forlder"
If xFileDialog.Show = -1 Then
xStrPath = xFileDialog.SelectedItems(1)
End If
If xStrPath = "" Then Exit Sub
xStrSearch = "KTE"
xUpdate = Application.ScreenUpdating
Application.ScreenUpdating = False
Set xOut = Worksheets.Add
xRow = 1
With xOut
.Cells(xRow, 1) = "Workbook"
.Cells(xRow, 2) = "Worksheet"
.Cells(xRow, 3) = "Cell"
.Cells(xRow, 4) = "Text in Cell"
Set xFso = CreateObject("Scripting.FileSystemObject")
Set xFld = xFso.GetFolder(xStrPath)
xStrFile = Dir(xStrPath & "\*.xls*")
Do While xStrFile <> ""
Set xWb = Workbooks.Open(Filename:=xStrPath & "\" & xStrFile, UpdateLinks:=0, ReadOnly:=True, AddToMRU:=False)
For Each xWk In xWb.Worksheets
Set xFound = xWk.UsedRange.Find(xStrSearch)
If Not xFound Is Nothing Then
xStrAddress = xFound.Address
End If
Do
If xFound Is Nothing Then
Exit Do
Else
xCount = xCount + 1
xRow = xRow + 1
.Cells(xRow, 1) = xWb.Name
.Cells(xRow, 2) = xWk.Name
.Cells(xRow, 3) = xFound.Address
.Cells(xRow, 4) = xFound.Value
End If
Set xFound = xWk.Cells.FindNext(After:=xFound)
Loop While xStrAddress <> xFound.Address
Next
xWb.Close (False)
xStrFile = Dir
Loop
.Columns("A:D").EntireColumn.AutoFit
End With
MsgBox xCount & "cells have been found", , "Kutools for Excel"
ExitHandler:
Set xOut = Nothing
Set xWk = Nothing
Set xWb = Nothing
Set xFld = Nothing
Set xFso = Nothing
Application.ScreenUpdating = xUpdate
Exit Sub
ErrHandler:
MsgBox Err.Description, vbExclamation
Resume ExitHandler
End SubEbből a szösszenetből lett plasztikázva.
Köszönöm a segítséget! -
p5quser
tag
válasz
Fferi50 #37652 üzenetére
Üdv!
Nem teljesen világos, hová kéne beszúrnom a copy parancsot. Ahová raktam, ott range copy metódus hibával elszállt.
Most így néz ki a script jelenleg, de így "előjeltelen"Private Sub CommandButton1_Click()
Dim xFso As Object
Dim xFld As Object
Dim xStrSearch As String
Dim xStrPath As String
Dim xStrFile As String
Dim xOut As Worksheet
Dim xWb As Workbook
Dim xWk As Worksheet
Dim xRow As Long
Dim xFound As Range
Dim xStrAddress As String
Dim xFileDialog As FileDialog
Dim xUpdate As Boolean
Dim xCount As Long
On Error GoTo ErrHandler
Set xFileDialog = Application.FileDialog(msoFileDialogFolderPicker)
xFileDialog.AllowMultiSelect = False
xFileDialog.Title = "Select a forlder"
If xFileDialog.Show = -1 Then
xStrPath = xFileDialog.SelectedItems(1)
End If
If xStrPath = "" Then Exit Sub
xStrSearch = "elszámol"
xUpdate = Application.ScreenUpdating
Application.ScreenUpdating = False
Set xOut = Worksheets.Add
xRow = 1
With xOut
.Cells(xRow, 1) = "Munkafüzet"
.Cells(xRow, 2) = "Munkalap"
.Cells(xRow, 3) = "Cella"
.Cells(xRow, 4) = "Találat"
.Cells(xRow, 5) = "Név"
.Cells(xRow, 6) = "Összeg"
Set xFso = CreateObject("Scripting.FileSystemObject")
Set xFld = xFso.GetFolder(xStrPath)
xStrFile = Dir(xStrPath & "\*.xls*")
Do While xStrFile <> ""
Set xWb = Workbooks.Open(Filename:=xStrPath & "\" & xStrFile, UpdateLinks:=0, ReadOnly:=True, AddToMRU:=False)
For Each xWk In xWb.Worksheets
Set xFound = xWk.UsedRange.Find(xStrSearch)
Set xFn = xWk.UsedRange.Find(xStrSearch)
If Not xFound Is Nothing Then
xStrAddress = xFound.Address
xNev = xFound.Offset(0, -1).Value
xOssz = xFound.Offset(0, 1).Value
End If
Do
If xFound Is Nothing Then
Exit Do
Else
xCount = xCount + 1
xRow = xRow + 1
.Cells(xRow, 1) = xWb.Name
.Cells(xRow, 2) = xWk.Name
.Cells(xRow, 3) = xFound.Address
.Cells(xRow, 4) = xFound.Value
.Cells(xRow, 5) = xNev
.Cells(xRow, 6) = xOssz
End If
Set xFound = xWk.Cells.FindNext(After:=xFound)
Loop While xStrAddress <> xFound.Address
Next
xWb.Close (False)
xStrFile = Dir
Loop
.Columns("A:F").EntireColumn.AutoFit
End With
MsgBox xCount & " egyezést találtam", , "Elszámolósdi"
ExitHandler:
Set xOut = Nothing
Set xWk = Nothing
Set xWb = Nothing
Set xFld = Nothing
Set xFso = Nothing
Application.ScreenUpdating = xUpdate
Exit Sub
ErrHandler:
MsgBox Err.Description, vbExclamation
Resume ExitHandler
End SubKöszönöm!
-
p5quser
tag
Sziasztok!
Ismét a segítségeteket kérném. Adott egy munkafüzet, a hónap napjaira bontott munkalapokkal. Ebben a munkafüzetben kellene rákeresnem az "elszámolás" szóra minden munkalapon, kilistáztatva a napot, az elszámolás szót, egy oszloppal a találat előtti értéket és egy oszloppal a találat utáni értéket.
Alább a script amit találtam, teszi a dolgát, csak nem tudom hogy irassam ki vele az eltolt oszlopok értékeit.Private Sub CommandButton1_Click()
Dim xFso As Object
Dim xFld As Object
Dim xStrSearch As String
Dim xStrPath As String
Dim xStrFile As String
Dim xOut As Worksheet
Dim xWb As Workbook
Dim xWk As Worksheet
Dim xRow As Long
Dim xFound As Range
Dim xStrAddress As String
Dim xFileDialog As FileDialog
Dim xUpdate As Boolean
Dim xCount As Long
On Error GoTo ErrHandler
Set xFileDialog = Application.FileDialog(msoFileDialogFolderPicker)
xFileDialog.AllowMultiSelect = False
xFileDialog.Title = "Select a forlder"
If xFileDialog.Show = -1 Then
xStrPath = xFileDialog.SelectedItems(1)
End If
If xStrPath = "" Then Exit Sub
xStrSearch = "elszámol"
xUpdate = Application.ScreenUpdating
Application.ScreenUpdating = False
Set xOut = Worksheets.Add
xRow = 1
With xOut
.Cells(xRow, 1) = "Workbook"
.Cells(xRow, 2) = "Worksheet"
.Cells(xRow, 3) = "Cella"
.Cells(xRow, 4) = "Találat"
.Cells(xRow, 5) = "Összeg"
.Cells(xRow, 6) = "Név"
Set xFso = CreateObject("Scripting.FileSystemObject")
Set xFld = xFso.GetFolder(xStrPath)
xStrFile = Dir(xStrPath & "\*.xls*")
Do While xStrFile <> ""
Set xWb = Workbooks.Open(Filename:=xStrPath & "\" & xStrFile, UpdateLinks:=0, ReadOnly:=True, AddToMRU:=False)
For Each xWk In xWb.Worksheets
Set xFound = xWk.UsedRange.Find(xStrSearch)
If Not xFound Is Nothing Then
xStrAddress = xFound.Address
End If
Do
If xFound Is Nothing Then
Exit Do
Else
xCount = xCount + 1
xRow = xRow + 1
.Cells(xRow, 1) = xWb.Name
.Cells(xRow, 2) = xWk.Name
.Cells(xRow, 3) = xFound.Address
.Cells(xRow, 4) = xFound.Value
.Cells(xRow, 5) = xFound.Value
.Cells(xRow, 6) = xFound.Value
End If
Set xFound = xWk.Cells.FindNext(After:=xFound)
Loop While xStrAddress <> xFound.Address
Next
xWb.Close (False)
xStrFile = Dir
Loop
.Columns("A:D").EntireColumn.AutoFit
End With
MsgBox xCount & " egyezést találtam", , "Elszámolós"
ExitHandler:
Set xOut = Nothing
Set xWk = Nothing
Set xWb = Nothing
Set xFld = Nothing
Set xFso = Nothing
Application.ScreenUpdating = xUpdate
Exit Sub
ErrHandler:
MsgBox Err.Description, vbExclamation
Resume ExitHandler
End SubEzeket szeretném megváltoztatni;
.Cells(xRow, 5) = xFound.Value (találat_oszlop -1, találat_sor)
.Cells(xRow, 6) = xFound.Value (találat_oszlop +1, találat_sor)
Előre is köszönöm! -
Fferi50
Topikgazda
válasz
the radish #36629 üzenetére
Szia!
Arra van lehetőség, hogy a futásidejű hibák ne okozzanak leállást, illetve korrigálhatók legyenek. Nézz utána az On Error Goto ill. az On Error Resume utasításoknak a Help-ben.
Üdv.
-
bsh
addikt
Üdv.
Próbálnék egy olyat megoldani, hogy egy bazihosszú képlet helyett egy rövidebb saját függvényt használni, ami ugyanazt csinálná. Így még pár extra egyszerűsítést is bele tudnék mókolni.
Application.Caller-rel megpróbálnám kiolvasni, hogy hányadik sorból hívódik a képlet (így nem kéne megadni paraméternek semmit)
De random módon olyan hibákat csinál, hogy pl. azt mondja, hogy "Application.WorksheetFunction osztály Match tulajdonsága nem érhető el" (miközben watch szerint elérhető) meg ilyenek...
Ez az Application.Caller-t nem ismerem, gondolom ezzel kell valamit trükközni? Mert magában a funkcióm az működik.Public Function KKERES() As Double
KKERES = 0
If TypeOf Application.Caller Is Range Then
Dim Caller As Range
Set Caller = Application.Caller
Dim Z As String
Z = Munka2.Cells(Caller.Row, 2).Text
If Z <> "" Then
On Error GoTo notfound
X = Caller.Application.WorksheetFunction.Match(Z, Munka3.Range("B:B"), 0)
If IsError(X) Then
Y = Caller.Application.WorksheetFunction.Match(Z, Munka4.Range("B:B"), 0)
If IsError(Y) Then Y = Caller.Application.WorksheetFunction.Match(Z, Munka4.Range("C:C"), 0)
If IsError(Y) Then
On Error GoTo 0
KKERES = 0
Exit Function
Else
On Error GoTo 0
If Caller.Column = 5 Then
KKERES = Munka4.Cells(Y, 5).Value
Exit Function
End If
If Caller.Column = 6 Then
KKERES = Munka4.Cells(Y, 6).Value
Exit Function
End If
End If
Else
On Error GoTo 0
If Caller.Column = 5 Then
KKERES = Munka3.Cells(X, 5).Value
Exit Function
End If
If Caller.Column = 6 Then
KKERES = Munka3.Cells(X, 6).Value
Exit Function
End If
End If
End If
End If
notfound:
End Function -
Pakliman
tag
válasz
ben800 #36204 üzenetére
Úgy nagyjából valami ilyesmi...
Public Sub AdatMásolás()
Dim wbT As Workbook 'A "kis" munkafüzet, ami tartalmazza a...
Dim wsT As Worksheet '..munkalapokat (1-től 12-ig)
Dim cT As Long 'Számláló (a 19 db táblázathoz)
Dim usT As Long 'A kis táblázat utolsó sora
Dim aws As Worksheet 'Csak azért, hogy ne ActiveSheet legyen:)
Dim us As Long 'A FŐ táblázat utolsó sora
Dim sor As Long 'Egyszerű számláló
Dim talált 'A keresett azonosító cellacíme lesz
Set aws = ActiveSheet
For cT = 1 To 19
On Error GoTo Hiba
Set wbT = Workbooks.Open("a feldolgozandó kis táblázat neve útvonallal együtt")
For Each wsT In wbT.Worksheets
usT = wsT.Cells(wsT.Rows.Count, 1).End(xlUp).Row
For sor = 2 To usT 'Feltételezve, hogy az 1. sor fejléc
'Az azonosító az 1. oszlopban van
'!!! A FŐ táblában (aws) keressük a kis táblás azonosítót (wsT.Cells(sor, 1)) !!!
Set talált = aws.Columns(1).Find(What:=wsT.Cells(sor, 1), LookAt:=xlWhole, MatchCase:=True)
'Ha találtunk, akkor nem csinálunk semmit.
'Ellenben:
If talált Is Nothing Then
us = aws.Cells(aws.Rows.Count, 1).End(xlUp).Row
aws.Cells(us + 1, 1) = "azonosító"
aws.Cells(us + 1, 2) = "adat1"
aws.Cells(us + 1, 3) = "adat2"
aws.Cells(us + 1, 4) = "adat3"
aws.Cells(us + 1, 5) = "adat4"
aws.Cells(us + 1, 6) = "adat5"
'...
End If
Next sor
Next wsT
On Error GoTo 0
wbT.Close SaveChanges:=False
Next cT
Set wbT = Nothing
Set wsT = Nothing
Set aws = Nothing
GoTo Vége
Hiba:
'Hibakezelés, pl. ha nincs olyan fájl stb.
'Ha nem kell tenni semmit hiány esetén, akkor egyszerűen csak..
Resume Next
Vége:
End Sub -
Delila_1
veterán
válasz
föccer #35928 üzenetére
Dim a
On Error Resume Next
Set a = Sheets(Range("C2"))
If Err.Number <> 0 Then
Sheets.Add.Name = Range("C2")
On Error GoTo 0
End If
Columns("A:D").ColumnWidth = 20Az alsó sor az A:D oszlopok szélességét állítja be, és teszi ezt az újonnan létrehozott lapon, mert hivatalból az új lap az aktív. Ha másik lapon akarod a szélességet beállítani, akkor ezt jelezni kell.
Sheets(1).Columns("A:D").ColumnWidth = 20
-
Delila_1
veterán
válasz
Acustic #35720 üzenetére
Szia Attila!
Az első makrót a laphoz kell rendelned. Mikor a H oszlopba beírsz, vagy bemásolsz egy nevet, akkor ez a cella, valamint az A oszlopban lévő, azonos tartalmú cellák háttere sárga lesz. Az első, A oszlopban lévő név cellája lesz kijelölt.
Private Sub Worksheet_Change(ByVal Target As Range)
Dim ter As Range, CV As Object
If Target.Column = 8 Then
Set ter = Range("A1:A" & Range("A" & Rows.Count).End(xlUp).Row)
For Each CV In ter
If CV = Target Then
CV.Interior.Color = vbYellow
CV.HorizontalAlignment = xlRight
CV.VerticalAlignment = xlTop
End If
Next
Range(Target.Address).Interior.Color = vbYellow
Range(Target.Address).HorizontalAlignment = xlRight
Range(Target.Address).VerticalAlignment = xlTop
Range("A" & Application.WorksheetFunction.Match(Target, Columns(1), 0)).Select
End If
End SubA második makró modulba kerül. Ehhez rendelj billentyű kombinációt, aminek hatására indul a makró. Az aktuális cella háttere piros lesz, a kijelölés a következő, ilyen nevet tartalmazó cellára ugrik az A oszlopban. Mikor a kombinációval befejezted a szereplőhöz tartozó összes cella átszínezését, a H oszlopban is pirosra vált a név cellája, ez lesz kijelölt. Üzenetet kapsz, hogy a szereplő összes sora kész van.
Sub Piros()
Dim sor, nev As String
If Selection.Column = 1 Then
nev = Selection.Value
On Error GoTo KeszVan
sor = Range("A" & Selection.Row + 1 & ":A10000").Find(nev).Row
Selection.Interior.Color = vbRed
Selection.HorizontalAlignment = xlLeft
Cells(sor, "A").Select
End If
Exit Sub
KeszVan:
Selection.Interior.Color = vbRed
Selection.HorizontalAlignment = xlLeft
sor = Columns(8).Find(nev).Row
Cells(sor, "H").Interior.Color = vbRed
Cells(sor, "H").HorizontalAlignment = xlLeft
Cells(sor, "H").Select
MsgBox nev & " minden sora kész van.", vbInformation, "Értesítés"
End SubJó munkát! Üdv
Kati -
Pakliman
tag
Sziasztok!
Ha valakinek esetleg kellene egy ilyen:
Public Function Darabolt(darabolandó, rész As Long, Optional elválasztó As String = " ", Optional elválasztó_egyben_használandó As Boolean = True) As String
Dim delim
Dim i As Long
If elválasztó_egyben_használandó Then
delim = elválasztó
Else
delim = Mid(elválasztó, 1, 1)
For i = 2 To Len(elválasztó)
darabolandó = Replace(darabolandó, Mid(elválasztó, i, 1), delim)
Next i
End If
On Error GoTo Hiba
Darabolt = Split(darabolandó, delim)(rész - 1)
Exit Function
Hiba:
Darabolt = ""
End FunctionHasználata:
darabolandó -> bármilyen szöveg, amiből egy részt akarunk visszakapni
rész -> az elválasztók által határolt n-edik rész
elválasztó -> ezt a karaktert vagy szöveget értelmezzük elválasztóként -> ha nincs megadva, akkor 1 db szóköz
elválasztó_egyben_használandó -> lásd lentebbDarabolt("A darabolandó szöveg-> kukac@excel.hu",2) -> "darabolandó"
Darabolt("A darabolandó szöveg-> kukac@excel.hu",4) -> "kukac@excel.hu"
Darabolt("A darabolandó szöveg-> kukac@excel.hu",1,"->") -> "A darabolandó szöveg"
Darabolt("A darabolandó szöveg-> kukac@excel.hu",2,"->") -> " kukac@excel.hu"Darabolt("A darabolandó szöveg-> kukac@excel.hu",1,"->",False) -> "A darabolandó szöveg"
Darabolt("A darabolandó szöveg-> kukac@excel.hu",2,"->",False) -> ""
Darabolt("A darabolandó szöveg-> kukac@excel.hu",3,"->",False) -> " kukac@excel.hu"Darabolt("A darabolandó szöveg-> kukac@excel.hu",3,"->@",False) -> " kukac"
Darabolt("A darabolandó szöveg-> kukac@excel.hu",4,"->@",False) -> "excel.hu"Darabolt("A darabolandó szöveg-> kukac@excel.hu",1,"->@",True) -> "A darabolandó szöveg-> kukac@excel.hu"
Használható VBA-ban és cellában egyaránt.
-
Fferi50
Topikgazda
válasz
Capella #35504 üzenetére
Szia!
Ha J2 cellában egy cím keletkezik a képlet alapján akkor egyszerűen:
Application.Goto Reference:=Range(Range("J2").Value)
A Goto aktíválja is az adott cellát.Így az összes többi sor teljesen felesleges, elegendő ez az egy.
Ha pedig az éppen aktuális celládban van a kívánt cím akkor:Application.Goto Reference:=Range(Selection.Value)
Üdv.
-
poffsoft
veterán
válasz
Capella #35504 üzenetére
A J2 tartalma egészen pontosan milyen formátumban tartalmazza az utolsó cella címét? R1C1, vagy A1 vagy más? Ha A1 a formátum:
Sub GotoLastCell()
'
' GotoLastCell Makró
'
' Billentyűparancs: Ctrl+n
'
' Range("J2").Select
' Selection.Copy
' Application.Goto Reference:="R3135C6"
' ActiveCell.Select
' Application.CutCopyMode = False
Range(Range("J2")).Select
End Sub -
Capella
senior tag
Szeretnék egy táblázat legutolsó vagy az általam megadott cellájába ugrani egy makróval. Hogy mi az utolsó, azt én határozom meg egy képlettel a J2 cellában.
Gondoltam az F5 ugrás gombot használva és bemásolva ide a cellatartalmat makrórögzítéssel megoldom.
Azonban nem működik rendesen a makró, mert fixen bedrótozva mindig a rögzítéskor bemásolt értékhez ugrik, vagy ezt mindig nekem kell kézzel átírnom a makróban, ha változtatni akarok.
Azt látom, hogy a Application.Goto Reference:="R3135C6" sorral van baj.
Hogyan lehetne rávenni a makrót átszerkesztve, hogy mindig a J2 cellatartalomra ugorjon?Sub GotoLastCell()
'
' GotoLastCell Makró
'
' Billentyűparancs: Ctrl+n
'
Range("J2").Select
Selection.Copy
Application.Goto Reference:="R3135C6"
ActiveCell.Select
Application.CutCopyMode = False
End Sub -
RAiN91
őstag
Sziasztok
Van egy ilyenem, 3 excel táblában is.
Private Sub worksheet_idozito()
1
Cells(6, 6) = Cells(9, 8)
ido = Timer + 0.2
Do While (Timer < ido)
DoEvents
Loop
If Cells(9, 8) < Cells(6, 6) Then
Cells(6, 7) = Cells(9, 8)
ido = Timer + 1.5
Do While (Timer < ido)
DoEvents
Loop
Cells(6, 8) = Cells(9, 8)
ido = Timer + 1.5
Do While (Timer < ido)
DoEvents
Loop
Cells(6, 9) = Cells(9, 8)
ido = Timer + 1.5
Do While (Timer < ido)
DoEvents
Loop
Else
End IfGoTo 1
End SubHogyan lehet megoldani, hogy ha elindítom az excel fájlt, akkor ezek automatikusan fussanak?
Ha kézzel indítom, akkor csak az egyik worksheetben fut. -
Juditta_56
aktív tag
Sziasztok!
Már minden lehetséges netes forrást végigkutattam, de nem jövök rá, hogy miért nem működik a következő makró (bemásolom az egészet, a második nagybetűs komment sor alatti sorra dobja a hibát):
Sub EllMasol()
'
Dim ControlNeve, LapNeve, osszlap, SegLap As String
Dim fso As Object
' Dim ControlFile As Workbook
Set fso = CreateObject("Scripting.FileSystemObject")
fileExists = fso.fileExists("C:\Users\Desktop\Test\journals.xlsx")
'csak ebben a modulban:
Dim EllSor, EllOszl, JelSor, HibaOszl As Integer
Dim OszKonyvt, OszNeve As String
Dim OsszSor, OsszOszl, OsszOszlMax As Integer
' On Error GoTo Errorcatch
ControlNeve = ActiveWorkbook.Sheets(1).Range("AW1")
'EZ SEM MŰKÖDIK, DE EZT KIKERÜLTEM
' Set ControlFile = Workbooks(ControlNeve)
osszlap = Workbooks(ControlNeve).Worksheets("Összesítő").Name
SegLap = Workbooks(ControlNeve).Worksheets("Segéd").Name
If Environ("username") = azennevem Then 'Ide eredetileg az itthoni felhasználónevem,
'otthon
OszKonyvt = azenkönyvtáram 'ide meg az adott könyvtár neve van beírva...
Else
'benti
OszKonyvt = ActiveWorkbook.Sheet(1).Range("AY1")
End If
OszNeve = Workbooks(ControlNeve).Sheets(1).Range("AZ1")
EllSor = Workbooks(ControlNeve).Sheets(osszlap).Range("IJ1")
EllOszl = Workbooks(ControlNeve).Sheets(osszlap).Range("IK1")
JelSor = Workbooks(ControlNeve).Sheets(osszlap).Range("IL1")
HibaOszl = Workbooks(ControlNeve).Sheets(osszlap).Range("IM1")
fileExists = fso.fileExists(OszKonyvt & OszNeve)
Workbooks.Open (OszKonyvt & OszNeve) 'Megnyitja
Windows(OszNeve).Activate
Sheets(1).Activate
OsszSor = Range("CJ31")
OsszOszl = Range("A" & OsszSor)
OsszOszlMax = Range("A" & OsszSor + 1)
Range(Cells(OsszSor + 10, 4), Cells(OsszSor + 18, 4)).Copy 'Kimásolja
'ENNÉL A SORNÁL HIBAÜZENET: "Run-time error '1004'. Application-defined or operation-defined error." MIÉRT?
Workbooks(ControlNeve).Sheets(osszlap).Range(Cells(EllSor + 24, HibaOszl)).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
Application.CutCopyMode = False
Range(Cells(OsszSor + 20, OsszOszl), Cells(OsszSor + 18, OsszOszlMax)).Copy
Workbooks(ControlNeve).Sheets(osszlap).Range(Cells(EllSor + 24, EllOszl)).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
Application.CutCopyMode = False
Range(Cells(OsszSor, OsszOszl), Cells(OsszSor + 8, OsszOszlMax)).Copy
Workbooks(ControlNeve).Sheets(osszlap).Range(Cells(EllSor, EllOszl)).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
Application.CutCopyMode = False
Range(Cells(OsszSor + 10, OsszOszl), Cells(OsszSor + 19, OsszOszlMax)).Copy
Workbooks(ControlNeve).Sheets(osszlap).Range(Cells(JelSor, EllOszl)).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
Application.CutCopyMode = False
Exit Sub
'Errorcatch: MsgBox Err.Description
End SubA Debugnál szépen kiírja az összes változó nevét, (fájl, sorok-oszlopok száma), tehát nem azokkal van baja...
Köszönöm szépen előre is a segítséget!
-
Pakliman
tag
válasz
the radish #35165 üzenetére
Szia!
Ezt "kényszerből" írtam, mert sokszor volt/van szükségem darabolásra.
Használható cellában és makróban egyaránt.Public Function Darabolt(darabolandó, rész As Long, Optional elválasztó As String = " ", Optional elválasztó_egyben_használandó As Boolean = True, Optional trim As Boolean = True) As String
Dim delim
Dim s
Dim i As Long
s = IIf(trim, Application.Trim(darabolandó), darabolandó)
If elválasztó_egyben_használandó Then
delim = elválasztó
Else
delim = Mid(elválasztó, 1, 1)
For i = 2 To Len(elválasztó)
s = Replace(s, Mid(elválasztó, i, 1), delim)
Next i
End If
On Error GoTo Hiba
Darabolt = Split(s, delim)(rész - 1)
Exit Function
Hiba:
Darabolt = ""
End FunctionHasználata:
darabolandó= "dara bolandó napok"
rész= lásd eredményeknél
elválasztó= " n" 'ha nem adod meg, akkor 1 db szóköz
' elválasztó_egyben_használandó= ha nem adod meg, akkor IGAZ
' trim= ha nem adod meg, akkor IGAZ
elválasztó_egyben_használandó= HAMIS (=a szóköz is és az n is elválasztóként használandó)
trim= HAMIS (=feldolgozás előtt a dupla/tripla stb szóközöket NEM cseréli 1 db szóközre)
eredmény rész=1 --> "dara"
eredmény rész=2 --> ""
eredmény rész=3 --> ""
eredmény rész=4 --> ""
eredmény rész=5 --> ""
eredmény rész=6 --> "bola"
eredmény rész=7 --> "dó"
eredmény rész=8 --> ""
eredmény rész=8 --> "apok"
'-------------------------------------------------
darabolandó= "dara bolandó napok"
elválasztó= " n"
elválasztó_egyben_használandó= IGAZ (=KIZÁRÓLAG a " n" sztring az elválasztó!!)
trim= IGAZ (=feldolgozás előtt a dupla/tripla stb szóközöket kicseréli 1 db szóközre)
eredmény rész=1 --> "dara bolandó"
eredmény rész=2 --> "apok" -
Fferi50
Topikgazda
válasz
szőröscica #33445 üzenetére
Szia!
Az egyik lehetőség, hogy hibakezelést építesz be: On Error Resume Next sorral.
Ha tudod, hogy csak ez lehet a hiba, akkor semmit nem is kell tenned, csak a programszekció végén visszaadni a hibakezelést a VBA-nak: On Error Goto 0
Ez azért szerintem kissé kockázatos, bár természetesen minden sor után meg lehet nézni, milyen hiba keletkezett (If ERR= x akkor mi legyen - a hibaszámokat megtalálod a helpben).Másik megoldás, hogy végigmész a tételeken:
Dim pvti as PivotItem
For Each pvti in ,PivotItems
If pvti.Name = "Level 2" Or pvti.Name = "Level 1" Or pvti.Name = "Level 3" Then pvti.Visible = True
NextNekem ez utóbbi jobban tetszik.
Üdv.
-
Delila_1
veterán
válasz
mormota #33050 üzenetére
Egy üres füzetben modulba másold be a makrót.
Sub Szetcincalas()
Dim sor As Long, usor As Long
Dim WSF As Worksheet, WSS As Worksheet
Const utvonal = "D:\Tmp\" 'ide jön a saját útvonalad
On Error Resume Next
Workbooks.Open Filename:=utvonal & "Forrás.xlsx"
On Error GoTo 0
On Error Resume Next
Workbooks.Open Filename:=utvonal & "Sablon.xlsb"
On Error GoTo 0
Set WSF = Workbooks("Forrás.xlsx").Sheets(1) 'saját füzeted és lapod neve
Set WSS = Workbooks("Sablon.xlsb").Sheets(1) 'saját füzeted és lapod neve
usor = WSF.Range("F" & Rows.Count).End(xlUp).Row
WSS.Activate
For sor = 2 To usor
Cells(1, "C") = WSF.Cells(sor, "F")
Cells(2, "C") = WSF.Cells(sor, "G")
Cells(3, "C") = WSF.Cells(sor, "L")
Cells(4, "C") = WSF.Cells(sor, "H")
ActiveWorkbook.SaveAs Filename:=utvonal & Range("C3") & ".xlsx", _
FileFormat:=xlOpenXMLWorkbook, CreateBackup:=False
Next
MsgBox "Kész"
End SubÍrd át a 3 jelzett sorban az útvonalat, a fájlneveket, és hogy hányadik lapon vannak az adatok a forrás és a sablon füzetekben. Adj rá mentést, Makrós.xlsm-ként.
A makró megnyitja a sablon és forrás fájlokat, elvégzi a másolást, menti az aktuális C3 néven a fájlt.
Új hozzászólás Aktív témák
Hirdetés
- Bitdefender Total Security 3év/3eszköz! - Tökéletes védelem, Most kedvező áron!
- Microsoft licencek KIVÉTELES ÁRON AZONNAL - UTALÁSSAL IS AUTOMATIKUS KÉZBESÍTÉS - Windows és Office
- Windows, Office licencek kedvező áron, egyenesen a Microsoft-tól - Automata kézbesítés utalással is!
- Antivírus szoftverek, VPN
- 27%-OS ÁFÁS SZÁMLA I Jogtiszta Microsoft digitális és fizikai termékek I DIGITALKEYZ.COM
- 18 éve! Billentyűzet magyarítás magyarosítás. Festés vagy lézerezés és egyebek! 3 lehetőség is van.
- Alkatrészt cserélnél vagy bővítenél? Nálunk van, ami kell! Enterprise alkatrészek ITT
- BESZÁMÍTÁS! Asus TUF F15 FX506HM Gamer notebook - i5 11400H 16GB DDR4 RAM 512GB SSD RTX 3060 6GB W10
- Xiaomi Redmi Note 13 256GB Kártyafüggetlen 1Év Garanciával
- Azonnali készpénzes AMD CPU AMD VGA számítógép felvásárlás személyesen / postával korrekt áron
Állásajánlatok
Cég: PCMENTOR SZERVIZ KFT.
Város: Budapest
Cég: Promenade Publishing House Kft.
Város: Budapest