Probleem bij Saven van Workbook met Sheet die Shapes bevat.

Status
Niet open voor verdere reacties.

MDN111

Gebruiker
Lid geworden
13 aug 2007
Berichten
503
Hallo !

Een Excel-bestand met diverse sheets en macro's bevat o.a. VBA-code om cellen te formatteren aan de hand van hun waarde. Geen van de macro's veroorzaakte problemen, tot na een recente wijziging. Op vraag van de gebruiker werd de code aangepast om het volgende te realiseren: Als men in een cel de waarde 9 invoert, moet een bepaalde afbeelding op de betreffende cel geplaatst worden. Of dat zinvol is of niet, doet er niet toe, ik heb de macro's aangepast en het werkt. Op een bepaald moment liep het echter fout bij het opslaan van het bestand: "Microsoft Office Excel has stopped working..." Zie screenshot in bijlage. Op het eerste zicht willekeurig, maar na een hele zoektocht kwam ik toch op het scenario waarbij het de mist in ging, en kan ik nu het foutscenario herhalen.

Omwille van de eenvoud heb ik in het bestand "TestSaveWithShapes.xlsm" in bijlage, de VBA-code tot het strikte minimum herleid. Het bevat enkele macro's om de afbeelding uit de sheet "R" te kopiëren op een cel in sheet "A" als men daarin de waarde 9 invoert, en om de sheet "Z" uit het bestand "TP00000000.xlsx" te kopiëren en te hernoemen naar sheet "B".

Als de sheet "B" reeds bestaat en men kopiëert de sheet "Z" uit het bestand "TP00000000.xlsx" als sheet "B", dan zal de macro "InsertSheet" eerst de bestaande sheet "B" verwijderen. Of er in de sheet "A", al of niet, cellen bestaan met een waarde 9, zou daar geen invloed op mogen hebben. Maar als men die macro uitvoert terwijl er cellen met waarde 9 bestaan, loopt het fout als men het bestand wil saven.

Ik werk met Windows 7 en Office 2007.
Er zijn geen actieve Add-Ins en een "repair" van MS-Office heeft evenmin geholpen.

Hopelijk kan iemand mij informeren over de oorzaak dit verschijnsel.

Grtz,
MDN111.
 

Bijlagen

  • Screenshot.png
    Screenshot.png
    120,7 KB · Weergaven: 51
  • TestSaveWithShapes.xlsm
    29,8 KB · Weergaven: 36
  • TP00000000.xlsx
    11,3 KB · Weergaven: 33
Het is een raar probleem; in O2010 heb je een vergelijkbaar probleem; iets andere foutmelding maar je kunt het bestand niet opslaan. Er zitten wat rare namen in beide bestanden met niet-bestaande verwijzingen, maar dat zal wel komen doordat je het bestand gestript hebt. Overigens maakt het bij mij niet uit of je wel of niet een 9 (en dus een plaatje) invoegt of niet, ik krijg altijd een foutmelding zodra het blad uit TP00000000.xlsx wordt gehaald. En dan maakt het niet uit of je de macro gebruikt, of het blad gewoon kopieert. Zodra hij er in staat, is het einde oefening.
 
Ik ondervind geen problemen (XP; O 2010):

- het bestand TP hernoemd naar TP_001.xlsx

- de code herschreven naar

Code:
Sub InsertSheet()
  c00 = ThisWorkbook.path & "\TP_001.xlsx"

  If Dir(c00) = "" Then
    c01 = "Bestand <" & c00 & "> Niet Gevonden"
  Else
    With GetObject(c00)
      If [not(isref([TP_001.xlsx]Z!A1))] Then
        c01 = "Het bestand <" & c00 & "> bevat geen sheet <Z>"
      Else
        application.displayalerts=false
        ThisWorkbook.Sheets("B").Delete
        .Sheets("Z").Copy ThisWorkbook.Sheets("A")
        ThisWorkbook.Sheets("Z").Name = "B"
      End If
      .Close 0
    End With
  End If
    
  If c01 <> "" Then MsgBox c01
End Sub
 
Laatst bewerkt:
Dag OctaFish,
Dag snb,

1.
Bedankt voor de reacties!

2.
De code van snb geeft geen probleem bij het Saven. De implementatie in mijn "echt" bestand was eenvoudig. Gewoon één regel:
Code:
Set oWkb = Workbooks.Open(Filename:=cFile)
vervangen door:
Code:
Set oWkb = GetObject(cFile)
en dat werkt. Er is nu echter een ander probleem opgedoken. In sommige gevallen worden de afbeeldingen niet getoond in de geïmporteerde sheet. Er staan rode kruisjes en er staat er ook één bij met een hele tekst. Zie bijlage, a.u.b. Ik ben er nog niet in geslaagd dit foutscenario uit te lokken in de gestripte versie.

3.
Na nog wat trial and error ben ik op het volgende uitgekomen: De afbeeldingen komen op de sheet "A" terecht via de Worksheet_Change procedure. Daarin had ik een soort veiligheid ingebouwd om de gebruiker te waarschuwen door een macro te verbinden aan de afbeeldingen met de OnAction-property. Als ik die macro weglaat, blijkt mijn oude code wel te werken bij het Saven. Als men nauwkeuring toekijkt deed ik toch wel iets wat misschien toch niet echt OK is, namelijk afbeeldingen met een OnAction-macro opslaan in een bestand dat niet macro-enabled is. Misschien heeft dat er iets mee te maken?

4.
Dat er iets niet pluis is met afbeeldingen in Excel blijkt hier uit. Dat gaat weliswaar over Excel 2010, maar wie zegt dat Excel 2007 vrij is van dergelijke verschijnselen?

5.
@snb:
Ter informatie nog even vermelden dat er een probleem was met de code vermeld in #3, met de regel:
Code:
If [not(isref([TP_001.xlsx]Z!A1))] Then
Ik vond dat een mooie manier om het bestaan van een worksheet te testen (slechts één regel), maar er blijkt iets fout te gaan.
Als de sheet "Z" bestaat in "TP_001.xlsx", dan geeft de functie isref() een True. Dat is OK.
Maar als de sheet "Z" niet bestaat in "TP_001.xlsx", dan geeft die functie isref() niet False maar een Runtime-error '13': Type mismatch.

Grtz,
MDN111.
 

Bijlagen

  • Niet getoonde afbeelding.png
    Niet getoonde afbeelding.png
    3,4 KB · Weergaven: 21
Dus had jij die fantastische test snel omgebouwd naar:

Code:
If [not(iserr(isref([TP_001.xlsx]Z!A1)))] Then
 
Dat zou ik zeker graag gewild hebben, maar ik krijg dat niet voor mekaar:
Er wordt geen run-time error meer gegenereerd, maar de uitdrukking geeft altijd True, ongeacht welke sheet-naam men gebruikt ?
Code:
'Het bestand TP_001.xlsx bevat één sheet, de sheet "Z".
[not(iserr(isref([TP_001.xlsx]Z!A1)))]      'Geeft True
[not(iserr(isref([TP_001.xlsx]Y!A1)))]      'Geeft True ???
[not(iserr(isref([TP_001.xlsx]AAAAA!A1)))]  'Geeft True ????
 
Laatst bewerkt:
Gebruik dan:

Code:
If IsError([isref([TP_001.xlsx]Z!A1)]) Then
  c01 = "Het bestand <" & c00 & "> bevat geen sheet <Z>"
Else
  Application.DisplayAlerts = False
  ThisWorkbook.Sheets("B").Delete
  .Sheets("Z").Copy ThisWorkbook.Sheets("A")
  ThisWorkbook.Sheets("Z").Name = "B"
End If
 
Laatst bewerkt:
Ja, ik had wel gezien dat de "not" weg moest als je test op een error in plaats van op een referentie, maar ik zat wat in de war omdat ik de uitdrukking "IsError([isref([TP_001.xlsx]Z!A1)])" eerst getest had in het Immediate window en die gaf ALTIJD False, ongeacht of de sheet "Z" wel of niet bestond. Ik had mij echter niet gerealiseerd dat TP_001.xlsx niet open stond. Sorry for not seeing the obvious. :eek::eek:
 
De kern van de vraag (kopiëren van sheets met afbeeldingen) is in feite niet echt opgelost, maar met een workaround kon ik het probleem oplossen. De oplossing bestaat erin om eerst de macro van de shapes te verwijderen (OnAction = vbNullstring), dan de sheet te kopiëren en tenslotte de macro terug aan de shapes toe te voegen.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan