1

Konu: Excel Otomasyonu TextToColumns

Excele aktardığım tablonun bir kolonunda text olarak formüller var. Tüm satırlarda
=COUNTIF(GUNLER!A1:A300;"<="&I2)
benzeri formül yazıyor. Excel oluşturulduktan sonra formülün bulunduğu kolon text olarak gözüküyor ve hesaplamıyor. Her bir hücredeki formüle edit ile girip Enter tuşuna bastığımda değerler hesaplanıp gözüküyor veya Data / TextToColumns'a tıkladığımda tüm değerler textten formüle geçiyor.
İnternette araştırdığımda aşağıdakine benzer kodlar buldum ve denedim ama beceremedim.
A kolonunu seçip Excelin TextToColumn fonksiyonunu nasıl aktif ettirebilirim.
Excelde TextToColumn'a tıklayıp oradan FixedWidth'i seçip Finish'e bastığımda istediğim oluyor aslında. Bunu FoxProda nasıl yapabilirim.

with oExcel
      .Columns('A:A').select
     .Selection.TextToColumns(.Selection.Range("A1"),1,,.t.,,.t.)
EndWith

Anlatması güçtü ama umarım derdimi anlatabilmişimdir. Özetle : Bir kolonda text olarak algılanan formülü excelin formül olarak algılaması için TextToColumn özelliğini VFP içinde nasıl kullanabilirim.

Şimdiden çok teşekkürler.

2

Re: Excel Otomasyonu TextToColumns

"Excele aktardığım tablonun bir kolonunda text olarak formüller var"

Excel'e tabloyu nereden nasıl aktarıyorsun? Sanki, yaptigin islemde formül kullanımı yok, onun yerine formüllerin text sekli var. Formulleri nasıl yazıyorsun?

3 Son düzenleyen, comez (17.12.2018 08:15:13)

Re: Excel Otomasyonu TextToColumns

Evet Hocam formülün text hali var. Karakter field içinde formül yazıyor. EXPORT TO kutuk TYPE XL5 ... şeklinde excel oluşturuluyor.

Hücrenin değeri olarak (...Value= ...COUNTIF(GUNLER!A1:A300;"<="&I2)  diyerek veremiyorum. COM Hatası veriyor. Ben de text field içine bunu yazdırıp direkt excele gönderiyorum. Excelde manual olarak Data/TexToColumns yaptığımda sorunsuz çalışıyor ama bunu Foxtan nasıl yapabileceğimi bulamadım.

4

Re: Excel Otomasyonu TextToColumns

<pre>EXPORT TO ... type xl5</pre>

benim asla kullanmayacaklarım listesinde. COM hatası veriyor diye .Value kullanmaktan vazgeçmektesiniz yerine, verdigi hatanın uzerine gitsen daha iyi.

Bir parca data ile aslinda ne yapmak istediğini versen de bir baksam nasıl olur? Internette VFP2Excel arayabilirsin, ben onun N tane versiyonunu yazdım ve aktarım icin export yerine hep onu kullanıyorum. Veya daha iyisi, versiyonlardan birisini burada vereyim birazdan.

5

Re: Excel Otomasyonu TextToColumns

Select ;
    c.Cust_id, c.Company, c.Contact, ;
    o.Order_id, o.Order_Date, o.Shipped_on, ;
    oi.line_no, p.Prod_name, oi.Quantity, oi.Unit_price ;
    from (_Samples+'Data\Customer') c ;
    inner Join (_Samples+'Data\Orders') o On c.Cust_id = o.Cust_id ;
    inner Join (_Samples+'Data\OrdItems') oi On o.Order_id = oi.Order_id ;
    inner Join (_Samples+'Data\Products') p On oi.Product_Id = p.Product_Id ;
    inner Join (_Samples+'Data\Employee') e On o.Emp_id = e.Emp_id ;
    inner Join crsAvgQty aQ on oi.Product_id = aq.Product_id ;
    into Cursor crsCustomData ;
    nofilter

Local loExcel
loExcel = Createobject('Excel.Application')
loExcel.Workbooks.Add()
loExcel.Visible = .T.
With loExcel.ActiveWorkBook.ActiveSheet
    VFP2Excel('crsCustomData', .Range('A1') )
    
    .Range('M2').Value = 10
    
    .Range('N2').Value = Textmerge('=COUNTIF(I2:I<< Reccount()+1 >>, "<=" & $M2 )')
EndWith

6

Re: Excel Otomasyonu TextToColumns

*** VFP2Excel.prg

Lparameters tcCursorName, toRange, tcHeaders, tnPrefferredWidthForMemo
* tcCursorName
* toRange
* tcHeaders: Optional. Defaults to field headers
* tnPrefferredWidthForMemo: Optional. Default 80
* Function VFP2Excel
tcCursorName = Evl(m.tcCursorName,Alias())
tnPrefferredWidthForMemo = Evl(m.tnPrefferredWidthForMemo,80)
Local loConn As AdoDB.Connection, loRS As AdoDB.Recordset,;
  lcTemp,lcTempDb, oExcel,ix, lcFieldName, lcHeaders

lnSelect = Select()
lcTemp   = Forcepath(Sys(2015)+'.dbf',Sys(2023))
lcTempDb = Forcepath(Sys(2015)+'.dbc',Sys(2023))

Create Database (m.lcTempDb)
Select * From (m.tcCursorName) Into Table (m.lcTemp) Database (m.lcTempDb)

Local Array aMemo[1], aDateTime[Fcount()]
Local nMemoCount
Store 0 to m.nMemoCount
lcHeaders = ''
For ix = 1 To Fcount()
  lcFieldName = Field(m.ix)
  If Type(Field(m.ix))='M'
    nMemoCount = m.nMemoCount + 1
    Dimension aMemo[m.nMemoCount]
    aMemo[m.nMemoCount] = m.ix
    Replace All &lcFieldName With Chrtran(&lcFieldName,Chr(13)+Chr(10),Chr(10))
  EndIf
  aDateTime[m.ix] = (Type(Field(m.ix))='T')
  lcHeaders = m.lcHeaders + Iif(Empty(m.lcHeaders),'',',')+Proper(m.lcFieldName)
Endfor
tcHeaders = Evl(m.tcHeaders,m.lcHeaders)

Use In (Juststem(m.lcTemp))
Close Databases
Set Database To

loStream = Createobject('AdoDb.Stream')
loConn = Createobject('ADODB.Connection')
loRS = Createobject("ADODB.Recordset")
loConn.ConnectionString = "Provider=VFPOLEDB;Data Source="+m.lcTempDb
loConn.Open()
loRS = loConn.Execute("select * from "+m.lcTemp)
loRS.Save( loStream )
loRS.Close
loConn.Close
Erase (m.lcTemp)

* Use first row for headers
Local Array aHeader[1]

loRS.Open( loStream )
toRange.Offset(1,0).CopyFromRecordSet( loRS )  && Copy data starting from headerrow + 1

Set Safety Off
Delete Database (m.lcTempDb) Deletetables

Select (m.lnSelect)

For ix=1 To Iif( !Empty(m.tcHeaders), ;
    ALINES(aHeader, m.tcHeaders,1,','), ;
    loRS.Fields.Count )
  toRange.Offset(0,m.ix-1).Value = ;
    Iif( !Empty(m.tcHeaders), ;
    aHeader[m.ix], ;
    Proper(loRS.Fields(m.ix-1).Name) )
  toRange.Offset(0,m.ix-1).Font.Bold = .T.
EndFor

For ix=1 to Alen(aDateTime)
    If (aDateTime[m.ix])
        toRange.WorkSheet.UsedRange.Columns(m.ix).NumberFormat = "mm/dd/yyyy hh:mm:ss AM/PM"
    endif
endfor

#Define xlJustify                                         -4130
#Define xlTop                                             -4160
* This part is cosmetic
toRange.WorkSheet.Activate
With toRange.WorkSheet.UsedRange
  .VerticalAlignment = xlTop && set all to top
  For ix=1 To m.nMemoCount
    With .Columns(aMemo[m.ix])
      .ColumnWidth = m.tnPrefferredWidthForMemo && 80 chars width
      .WrapText = .T.
    Endwith
  Endfor
  .Columns.AutoFit
  .Rows.AutoFit
Endwith

7

Re: Excel Otomasyonu TextToColumns

Hocam, excel içindeki bir hücreye normalde tüm formülleri yazabiliyorum ve sorunsuz çalışıyor. Örneğin:
.Cells(1,1).Value="=COUNTA(A3:A300)"
Bir tek COUNTIF kullanımımda sorun çıkıyor. Ya tırnak (") işaretine, ya da & işaretine sorun çıkarıyor. Örneğin:
.Cells(1,3).Value='=COUNTIF(GUNLER!A3:A300;"<"&I2)'
yazdığımda 
"OLE error code 0x800a03ec Unknown COM status code"
diye hata veriyor. Ben de bu yüzden text alan içine bu formülü yazıp excele kabul ettirmeye çalıştım bu sefer de text olarak gördü.
Tüm formülleri yazdırabiliyorken .Cells(1,3).Value='=COUNTIF(GUNLER!A3:A300;"<"&I2)' şeklinde bir formüle tosladım açıkçası.
Amacım da excelde 2. sayfa içinde yer alan tarihlere bağlı olarak dinamik bir formül koymaktı. Kullanıcı tarihlerin olduğu sayfaya tarih ekledikçe veya çıkardıkça buna bağlı olarak günleri saymasını istemiştim. Koşula bağlı sayma olduğu için COUNTIF'e mecbur kaldım. SUM, COUNT vb. bunların kullanımında sorun yok. Sıkıntımın temeli exceldeki herhangi bir hücreye sadece COUNTIF formülünü koyamamak.

Ayırdığınız zaman ve ilginiz için teşekkür ederim.

8

Re: Excel Otomasyonu TextToColumns

Hocaaaaammm buldum smile
Tırnak " işareti veya & işaretine sorun çıkarmıyormuş.
Normalde exceldeyken formülde kullandığım ";" yerine "," kullanınca problem çıkmadı ve oldu.
Noktalı virgüle kızıyormuş meğer, hiç tahmin etmemiştim.

Ayırdığınız vakit, ilgi ve desteğiniz için tekrar tekrar teşekkür ederim.