Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: VBA: Mysteerinen virheilmoitus

Sivun loppuun

tneva82 [14.01.2009 13:03:03]

#

Eli excel-projekti. Uudistan valmista koodia uuteen uskoon. Ohjelman pitäisi tiettyinä aikoina pistää sähköpostiviesti eteenpäin. Postin lähetyskoodi on vanhaa perua johon en ole koskenut. Oma työ tähänasti koskenut lähinnä excel taulukosta vastaanottajien ja kellonaikojen selvittämistä ja pistää tiedot valmiille funktiolle eteenpäin.

Ongelma: Kun ohjelma yrittää lähettää sähköpostia tulee seuraava virheilmoitus:

Virhe numero 1004 xxxx@yyyy.com

the name xxxx@yyyy.com, zzzz@llll.com is unknown. Specify valid name

Tarvitsisi tietää 2 asiaa. a) mikä tuon virheilmoituksen voisi saada aikaan ja b) mistä tuo ,zzzz@llll.com kohta oikein tulee? Vastaanottajaruutu oli tuossa muodossa yhteenaikaan mutta sitten poistin jälkimmäisen osoitteen, tallentanut, sammuttanut excelin, uudelleenkäynnistänyt excelin etc. Myöskin kyseinen muuttuja alustetaan tyhjällä funktion alussa. MISSÄÄN taulukossa ei löydy zzzz@llll.com tekstiä(en löydä omilla silmillä, en löydä find toiminnolla) saatika sitten koodissa. MISTÄ tuo haamuteksti pystyy tulemaan? Kaupanpäälle niinpitkälle kuin pystyin näkemään(tai koodin alkuperäinen tekijä) ei koodissa myöskään viestiruudun sisältöä muokata(vain otsikkoa).

Grez [14.01.2009 13:52:06]

#

Kannattaa tutustua niihin debuggaustyökaluihin. Jos se Excel-taulukko on nenän edessä, niin tuollainen (ylimääräisen tekstin) ongelma on äärimmäisen helppo selvittää. Jos taas pitäisi selvittää se tuon kuvauksesi perusteella ilman itse taulukkoa/koodia, niin se on todella vaikeaa.

Eli laitat breaklinen ennen kun viesti lähtee ja katselet vähän mitä muuttujissa on sisällä. Tarvittaessa suoritat sitä rivi kerrallaan eteenpäin ja tutkit niitä muuttujia. Jossain vaiheessa tuo teksti kuitenkin tulee johonkin muuttujaan..

neau33 [14.01.2009 13:58:32]

#

Moikkz tneva82!

Aja se koodi suoraan VBE:ssä eli pienennä Excel palkkiin, aktivoi UserForm tai Moduuli joka sisältää koodin ja klikkaa Run-nappia, jolloin VBE-näyttää automaattisesti kohdan, jossa töksähtää ensimmäisen kerran...epäilisin vahvati että koodissa on viittaus alustamattomaan muuttujaan tai viittaus (ei julkiseen) muuttujaan, joka ei näy ko. moduuliin...lisäksi, jos Excelisi on esim. suomenkielinen ja alkuperäinen koodi on väännetty vaikkapa US/En-versiolla saattaa taulujen uudelleen nimeäminen aiheuttaa moisen virheen. Elikä projektissa on viittaus johonkin työkirjan tauluun esim. "Sheet1" jne...
Kun virhe löytyy niin ole ystävällinen, käyttä copy/paste kombinaatiota ja laita tänne se osa koodista, josta virhe löytyi...

tneva82 [14.01.2009 13:59:30]

#

"Eli laitat breaklinen ennen kun viesti lähtee ja katselet vähän mitä muuttujissa on sisällä. Tarvittaessa suoritat sitä rivi kerrallaan eteenpäin ja tutkit niitä muuttujia. Jossain vaiheessa tuo teksti kuitenkin tulee johonkin muuttujaan.."

No kun ei tule. Debuggerilla on käytetty mutta jokainen oman koodin muuttuja sisältää pelkästään xxxx@yyyy.com. zzzz@llll.com loistaa poissaoloaan.

"Aja se koodi suoraan VBE:ssä eli pienennä Excel palkkiin, aktivoi UserForm tai Moduuli joka sisältää koodin ja klikkaa Run-nappia, jolloin VBE-näyttää automaattisesti kohdan, jossa töksähtää ensimmäisen kerran..."

Kokeilin. Viestilaatikko ilmestyi mutta ohjelma ei pysähtynyt. Se vain loikkaa pätkään joka pistää virheilmoituksen ja jatkaa ohjelman ajoa. Tämä tapahtuu myös ilman debuggeria eli kuitattuaan virheilmoituksen ohjelma jatkaa ajoaan ja jos odottaisi kunnes seuraava lähetysaika tulee(tai rukkaa koneen kelloa) tulisi virheilmoitus uudestaan.

Haamuosoite siis oli alunalkaenkin vain yhdessä solussa. Koodiin en ole kovakoodannut sitä missään vaiheessa(projektin tarkoituksena nimenomaan vähentää kovakoodauksen määrää). Tästä se menee koodissa yhteen muuttujaan joka alustetaan lauseella vastaanottajat = "" juuri ennen käyttöä. Tämänjälkeen koodi menee alusta loppuun siten että muuttujan sisältö pysyy oikeana kaikenaikaan. Tämän olen varmistanut useampaan otteeseen seuraamalla koodia debugerrilla rivi riviltä.

Grez [14.01.2009 14:41:11]

#

Siis jos sähköpostinlähetintä kutsuttaessa missään paremetrissa ei ole tuota osoitetta ja sähköpostinlähetin kuitenkin lähettää sähköpostipalvelimelle (tarkista vaikka Network Monitorilla) niin silloinhan vika on pakosti lähettimessä. Ehkä se hakee jostain erillisestä tiedostosta tai registrystä asetuksia?

tneva82 [14.01.2009 14:50:53]

#

"Siis jos sähköpostinlähetintä kutsuttaessa missään paremetrissa ei ole tuota osoitetta ja sähköpostinlähetin kuitenkin lähettää sähköpostipalvelimelle (tarkista vaikka Network Monitorilla) niin silloinhan vika on pakosti lähettimessä. Ehkä se hakee jostain erillisestä tiedostosta tai registrystä asetuksia?"

Paitsi että lähetin toimii toisella dokumentilla jossa on vanha koodi(eli versio johon en ole koskenut). Eli siinä ei ollut.

Mutta onnistuin saamaan homman toimimaan copy&pastettamalla koodin(ja osoitelomakkeen) toiseen vastaavanlaiseen dokumenttiin eli ongelma tuntuisi olevan jonkinsortin cache ongelma. Ottaa dokumentin wanhasta versiosta(jolloin siis se ylimmääräinen osoite OLI solussa pilkulla eroteltuna. Ideana on siis saada useammalle vastaanottajalle samaanaikaan sama viesti pistettyä) solun osoitetiedot uusimman sijasta. Outoa :-/

Eli alkuperäinen oletukseni että solu jossa lukee xxxx@yyyy.com, zzzz@llll.com ei toimi näin oli sittenkin oikea:

With ActiveWorkbook.RoutingSlip
.Recipients = rsItem.Recipients

(rsItem.Recipient siis sisältää solun arvon ilman mitään muokkauksia. On otettu vastaanottajat = mySheet.Cells(26 + i, 3).Value lauseella talteen ja siitä lähetettyä eteenpäin) vaikka pelkkä xxxx@yyyy.com toimii. Eli mites saisi helpoimmiten useita vastaanottajia jos ne on yhdessä solussa pilkuilla eroteltuna?

Ja miten tuon cache ongelman saisi poistettua?

Grez [14.01.2009 15:06:31]

#

Siis olet sitä mieltä, että sähköpostinlähetyskomponentti kakuttaa jotenkin osoitteita ja lähettää välillä muihinkin osoitteisiin kuin mihin sitä pyydetään lähettämään? Itse kyllä vaihtaisin ihan ensimmäiseksi jonkin "toimivan" komponentin tilalle.

tneva82 [14.01.2009 15:14:11]

#

"Siis olet sitä mieltä, että sähköpostinlähetyskomponentti kakuttaa jotenkin osoitteita ja lähettää välillä muihinkin osoitteisiin kuin mihin sitä pyydetään lähettämään? Itse kyllä vaihtaisin ihan ensimmäiseksi jonkin "toimivan" komponentin tilalle."

Komponentti? Ei en sitä usko. Enemmänkin veikkaan että excel itsessään(excel kyllä kaatui jossainvaiheessa joten saattaa olla että se sai aikaan tuollaisen haamun). Excelin routingslippiä siinä käytetään. Mitään 3rd party komponenttia ei tässä tietääkseni käytetä.

Jokatapauksessa tämä osa projektia alkaa olla valmis kunhan saan useammalle vastaanottajalle samalla rivillä toimimaan(nythän rivejä pystyy uuden koodin ansiosta lisäämään ad infinum mutta kätevämpää on jos samaan kellonaikaan lähteville voisi laittaa samalla rivillä).

neau33 [14.01.2009 15:24:09]

#

Moikka taas tneva82!

ensinnäkin erottele osoitteet mielummin puolipisteellä, niin ei tarvitse säätää sähköpostiohjelmaa erikseen hyväksymään pilkkua erottimeksi...elikä xxxx@yyyy.com; zzzz@llll.com; jne...
tökkimistä voi minimoida myö liittämällä viestiin aiheen...
mikäli haluat tutkia funktiota tekstin parsimiseksi mail-formaattiin niin mene
tuonne ja pistä selaimen: Muokkaa -> Etsi tältä sivulta... -> hakusanaksi: Parsi, jolloin säästyt paljolta scrollaamiselta...

tneva82 [14.01.2009 15:27:31]

#

"ensinnäkin erottele osoitteet mielummin puolipisteellä, niin ei tarvitse säätää sähköpostiohjelmaa erikseen hyväksymään pilkkua erottimeksi...elikä xxxx@yyyy.com; zzzz@llll.com; jne... "

Kokeilin. ei toiminut. Ja sama ongelma ilmeni TAAS! "#¤!"#¤!¤!!!

Aihe ja viesti otetaan vastaavasti toisista soluista. Kyllä nekin sinne määritelty(ynnä muita asetuksia joihin en ole koskenut).

Edit: Löysin VBA:n sendMe komennon jolla koko homma näyttäisi toimivan komeasti. Useammalle lähetyskin onnistuu kätevästi syöttämällä parametrina taulukon mikä onnistuukin kätevästi split funktiolla.

Edelleen mysteeri miksi routingslippiin jää vastaanottajaksi haamuarvoksi tuo kaksi osoitetta sisältävä rivi mutta ellei käy ilmi jotain mikä tekisi sendme funktiosta ei-toimivan ratkaisun niin hällä väliä. Ohjelma toimii ja lähetyskin onnistuu selvästi lyhyemmällä koodimäärällä.

Grez [14.01.2009 15:45:53]

#

Siis koko tuon routingslipsin ideahan on kierrättää se useamman vastaanottajan kautta yksi kerrallaan. Eli jos tarkoitus on pistää se vain yhdelle vastaanottajalle tai useammalle yhtä aikaa, niin kyseessähän on jo lähtökohtaisesti väärä komponentti. Eli kuulostaisi siltä että tuo SendMe:n käyttäminen on juuri se mitä ehdotinkin, toimivaan komponenttiin vaihtamista :D

Mutta edelleen en kyllä ymmärrä miten se voisi keksiä sinne ylimääräisen vastaanottajan, jos kerran olet tarkistanut ettei siellä routingslipissä ole muita vastaanottajia kuin se haluamasi.

tneva82 [14.01.2009 15:49:32]

#

Grez kirjoitti:

Mutta edelleen en kyllä ymmärrä miten se voisi keksiä sinne ylimääräisen vastaanottajan, jos kerran olet tarkistanut ettei siellä routingslipissä ole muita vastaanottajia kuin se haluamasi.

En tajua minäkään mutta niin se vain on. Vastaanottaja laitetaan siis

With ActiveWorkbook.RoutingSlip
.Delivery = rsItem.SendMethod
.Recipients = rsItem.Recipients

kohdassa. rsItem.Recipients sisältää tasantarkkaan yhden osoitteen ainakin debuggerin mukaan. Aikaisemminhan siis solussa oli useampi vastaanottaja joista sitten toinen poistettiin kun arvelin(näköjään oikein) sen olevan virhe. Mutta silti jää haamuilemaan. Ei excelissä pääsisi routingslipin muuttujiin käsiksi jotenkin? Olisi kiva kuikuilla mikä sen arvo on ennenkuin käynnistää makron.

Mutta kuten editoin sendme funktio toimi jokatapauksessa. Oli näköjään parempikin tapa lähettää(juteltiin tässä itseasiassa juuri että routingslip pitäisi korvata paremmalla jokatapauksessa kun vaatii rekisteriin tavaroiden lisäämistä. Ei hyvä ylläpidettävyyden kannalta jos joskus hamassa tulevaisuudessa palvelinta joutuvat vaihtamaan). Joten routingslip painukoon hiiteen.

Mod. lisäsi kooditagit ja lainaustagit

neau33 [14.01.2009 16:45:23]

#

Moikka taas tneva82!

Yksi mahdollisuus on tietenkin sitten pukata jokainen viesti jo lähdössä erikseen...elikä

'....
If InStr(rsItem.Recipients, ";") > 0 Or _
InStr(rsItem.Recipients, ",") > 0 Then
   rsItem.Recipients = Replace(rsItem.Recipients, ",", ";")
   Dim MyArray() As String
   MyArray = Split(rsItem.Recipients, ";")
End If
Dim ArrayExists As Boolean

On Error Resume Next
ArrayExists = (LBound(MyArray) = 0)
If Err > 0 Then
   Err.Clear: On Error GoTo 0
Else
  ArrayExists = True
End If

'MsgBox (ArrayExists)

If ArrayExists Then
   Dim i As Integer
   For i = 0 To UBound(MyArray)
      With ActiveWorkbook.RoutingSlip
       .Delivery = rsItem.SendMethod
       .Recipients = MyArray(i)
       '....
      End With
      '....
   Next i
Else
   With ActiveWorkbook.RoutingSlip
    .Delivery = rsItem.SendMethod
    .Recipients = rsItem.Recipients
    '....
   End With
   '....
End If
'...

And BTW suosittelisin aiheen/viestin parsimista mail-formaattiin...

tneva82 [15.01.2009 10:02:07]

#

Doddih taisin keksiä teorian mistä johtuu. Faktat: Taulukossa ei itsessään ole missään. Ei myöskään koodissa. Mikä jää jäljelle missä tuo osoite voisi olla tallessa? Vastaus: Excelin meta tiedot! Eli mikäli teoriani on oikea routingSlipin ominaisuudet tallentuvat meta tietoihin. Ja sitten kun:

ActiveWorkbook.HasRoutingSlip = True

tämä tapahtuu jos siellä osoitekentässä on entuudestaan virheellinen osoite(kuten nyt se kaksi osoitetta kerralla) pistää erroria liikkeeseen jolloin virheenhallinta potkaisee kehiin ja uutta osoitetta ei päästä laittamaan.

Ja mikä hauskinta jos tuon yrittää laittaa arvojen asettamisen JÄLKEEN alkaa heittää erroria eli ilmeisesti tuon pitää olla true ennenkuin routingslipin ominaisuuksia voi säätää. Eli varsinainen aikapommikoodin sain käsiini työnalle. Ei tarvitse kuin että joku typottaa osoitteen ja laittaa käyntiin ja koodi+taulukot pitää copy&pasteta uuteen dokumenttiin.

Teoria vain(en ole ehtinyt edes miettiä kuinka meta tiedostot voisi makron alussa nollata jolla voisin tarkistaa. Kun löysin uuden funktion jolla toimii olen jatkanut väsäämistä eteenpäin) mutta paras minkä olen pystynyt kehittelemään.

neau33 [15.01.2009 14:10:19]

#

Moikka taas tneva82!

Oletko kokeillut restoida RoutingSlip'iä..?

If WorkBooks(ActveWorkbook.Name).HasRoutingSlip Then
   WorkBooks(ActveWorkbook.Name).RoutingSlip.Reset
End If

tneva82 [15.01.2009 14:47:59]

#

"Oletko kokeillut restoida RoutingSlip'iä..?"

Nah. Kun löytyi toimiva metodi(ja routingslip ilmeisesti väärä tarkoitukseen jokatapauksessa) en ole viitsinyt yrittää keksiä keinoa hyödyntää vanhaa koodia. Kun uusi koodi tekee 10% rivimäärällä saman homman toimivasti ei oikein ole järkevää lisätä vanhaan koodiin lisää rivejä jotta sen saisi toimimaan jotenkuten ;-)

Mutta kiitos vinkistä. Pidetään tulevaisuudessa mielessä jos pitää routingslippiä käyttää.

neau33 [15.01.2009 15:24:02]

#

Heippa taas!

joo toimivat viritykset ovat yksinkertaisia...


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta