C# excel nesne tanımlamada problem

Katılım
24 Nisan 2005
Mesajlar
3,671
Excel Vers. ve Dili
Office 2016 EN 64 Bit
Altın Üyelik Bitiş Tarihi
25/05/2022
Merhaba,

C# community ile bazı denemeler yapmak istiyorum. C# konusunda bilgim yok.

Bu kodlar ile excel i açıp hücrelere yazdırmada bir sorun yokken

C#:
 public void excelverikaydet()
{    
     excel.Application xlApp = new excel.Application();
     excel.Workbook xlWorkbook = xlApp.Workbooks.Open(FileName);
     excel.Worksheet xlWorksheet = (excel.Worksheet)xlWorkbook.Sheets[1];
     excel.Range xlRange = xlWorksheet.UsedRange;
     xlApp.Visible = true;
     xlApp.UserControl = false;
     ilkcalisma = 1;          
           

    var dateTime = DateTime.Now;
    xlRange.Cells[1, 1] = dateTime.ToString("MM/dd/yyyy");
    xlRange.Cells[1, 2] = Plc.Instance.Db1.Int1Variable;
    xlRange.Cells[1, 3] = Plc.Instance.Db1.Int2Variable;
    xlRange.Cells[1, 4] = Plc.Instance.Db1.Int3Variable;
}
Excel dosyasını açma işlemlerini IF bloğu içine aldığımda koyu belirtilen xlRange. nesnesinde hata veriyor.
CS0103 The name 'xlRange' does not exist in the current context

excelverikaydet timer nesnesine bağlı olarak her 1 sn de bir kayıt yapacak.
Bu nedenle excel dosyası açma ve sayfa tanımlama işlemleri bir defa çalışmalı.

Bu konuyu çözemedim. :)

C#:
public void excelverikaydet()
{

    if (ilkcalisma==0)
    {
        excel.Application xlApp = new excel.Application();
        excel.Workbook xlWorkbook = xlApp.Workbooks.Open(FileName);
        excel.Worksheet xlWorksheet = (excel.Worksheet)xlWorkbook.Sheets[1];
        excel.Range xlRange = xlWorksheet.UsedRange;
        xlApp.Visible = true;
        xlApp.UserControl = false;
        ilkcalisma = 1;
    }          
         

    var dateTime = DateTime.Now;
    [B]xlRange[/B].Cells[1, 1] = dateTime.ToString("MM/dd/yyyy");
    [B]xlRange[/B].Cells[1, 2] = Plc.Instance.Db1.Int1Variable;
   [B] xlRange.[/B]Cells[1, 3] = Plc.Instance.Db1.Int2Variable;
    [B]xlRange[/B].Cells[1, 4] = Plc.Instance.Db1.Int3Variable;
}
 
Katılım
17 Haziran 2008
Mesajlar
1,871
Excel Vers. ve Dili
Microsoft Ofis Profesyonel 2019 x64 TR
Altın Üyelik Bitiş Tarihi
26-03-2020
Emin değili ama , sanki bu kodlar else içinde olması gerekiyor...

var dateTime = DateTime.Now;
xlRange.Cells[1, 1] = dateTime.ToString("MM/dd/yyyy");
xlRange.Cells[1, 2] = Plc.Instance.Db1.Int1Variable;
xlRange.Cells[1, 3] = Plc.Instance.Db1.Int2Variable;
xlRange.Cells[1, 4] = Plc.Instance.Db1.Int3Variable;

yani şu şekilde ;

C#:
public void excelverikaydet()
{

    if (ilkcalisma==0)
    {
        excel.Application xlApp = new excel.Application();
        excel.Workbook xlWorkbook = xlApp.Workbooks.Open(FileName);
        excel.Worksheet xlWorksheet = (excel.Worksheet)xlWorkbook.Sheets[1];
        excel.Range xlRange = xlWorksheet.UsedRange;
        xlApp.Visible = true;
        xlApp.UserControl = false;
        ilkcalisma = 1;
    }
    else
    {
     var dateTime = DateTime.Now;
    [B]xlRange[/B].Cells[1, 1] = dateTime.ToString("MM/dd/yyyy");
    [B]xlRange[/B].Cells[1, 2] = Plc.Instance.Db1.Int1Variable;
   [B] xlRange.[/B]Cells[1, 3] = Plc.Instance.Db1.Int2Variable;
    [B]xlRange[/B].Cells[1, 4] = Plc.Instance.Db1.Int3Variable;
    }
}
 
Katılım
24 Nisan 2005
Mesajlar
3,671
Excel Vers. ve Dili
Office 2016 EN 64 Bit
Altın Üyelik Bitiş Tarihi
25/05/2022
@k0081, o şekilde de olmalı.
xlrange tanımlaması IF içinde yapılıyor. Bu durumda xlrange kullanımı da IF dışında.
Program IF içini ayrı bir fonksiyon gibi mi değerlendiriyor. xlrange nesnesini global gibi bir tanımlamamı yapmak lazım.

Ne kadar doğru bilemedim :)
 

Zeki Gürsoy

Uzman
Uzman
Katılım
31 Aralık 2005
Mesajlar
4,344
Excel Vers. ve Dili
Office 365 (64 bit) - Türkçe
Bir "if" bloğu içerisinde tanımlanan değişken, o bloğun içerinde geçerli olur. Zaten bloğun dışında değişkeni kullanmaya çalışırsanız, editör hemen altını kırmızı olarak çizecektir.

Son olarak; belleğe doğrudan erişim (pointer'lar veya unsafe code) ihtiyacınız yoksa, Vb.NET size her durumda yetecektir. VBA bilginizle başlangıçta zorlanmazsınız.

.
 
Son düzenleme:
Katılım
24 Nisan 2005
Mesajlar
3,671
Excel Vers. ve Dili
Office 2016 EN 64 Bit
Altın Üyelik Bitiş Tarihi
25/05/2022
Bir "if" bloğu içerisinde tanımlanan değişken, o bloğun içerinde geçerli olur. Zaten bloğun dışında değişkeni kullanmaya çalışırsanız, editör hemen altını kırmızı olarak çizecektir.
.
@Zeki Gürsoy ,

Excel dosyasını programın çalışması süresince bir defa açmam gerekiyor.
Aynı metot içinde isem açıp içine kayıt yapıp kapatabiliyorum.
Ancak bu durumda her defasında dosyayı aç yaz kapa yapmam lazım.

Excel dosyasını bir defa açıp yada tanımlayıp daha sonra her defasında yeni kayıtlar yapabilmek için.
Buradaki tanımlamayı nerede yapmam lazım.

excel.Application xlApp = new excel.Application();
excel.Workbook xlWorkbook = xlApp.Workbooks.Open(FileName);
excel.Worksheet xlWorksheet = (excel.Worksheet)xlWorkbook.Sheets[1];
excel.Range xlRange = xlWorksheet.UsedRange;
xlApp.Visible = true;
xlApp.UserControl = false;

Buradaki işlemleri de farklı bir metot altında sürekli kullanmayı planlıyorum. Açık excel dosyasını kapatana kadar.
var dateTime = DateTime.Now;
xlRange.Cells[1, 1] = dateTime.ToString("MM/dd/yyyy");
xlRange.Cells[1, 2] = Plc.Instance.Db1.Int1Variable;
xlRange.Cells[1, 3] = Plc.Instance.Db1.Int2Variable;
xlRange.Cells[1, 4] = Plc.Instance.Db1.Int3Variable;
 

Zeki Gürsoy

Uzman
Uzman
Katılım
31 Aralık 2005
Mesajlar
4,344
Excel Vers. ve Dili
Office 365 (64 bit) - Türkçe
Böyle bir durumda sınıf düzeyinde değişken tanımlayıp, Load olayı altında new sözcüğü ile instance verilir. VBA olsa böyle yapmaz mıydınız? Mantık, aynı mantık...

.
 
Katılım
24 Nisan 2005
Mesajlar
3,671
Excel Vers. ve Dili
Office 2016 EN 64 Bit
Altın Üyelik Bitiş Tarihi
25/05/2022
Böyle bir durumda sınıf düzeyinde değişken tanımlayıp, Load olayı altında new sözcüğü ile instance verilir. VBA olsa böyle yapmaz mıydınız? Mantık, aynı mantık...

.
C# den hep uzak durmuşumdur. :)
Ön yargılarımı kırıp başladım bakalım.

Deneyeyim teşekkürler.
 

Zeki Gürsoy

Uzman
Uzman
Katılım
31 Aralık 2005
Mesajlar
4,344
Excel Vers. ve Dili
Office 365 (64 bit) - Türkçe
C# ' ın burada günahı yok. :) Asıl mesele, Object Oriented Programming (OOP) gibi görünüyor.

.
 
Katılım
24 Nisan 2005
Mesajlar
3,671
Excel Vers. ve Dili
Office 2016 EN 64 Bit
Altın Üyelik Bitiş Tarihi
25/05/2022
C# ' ın burada günahı yok. :) Asıl mesele, Object Oriented Programming (OOP) gibi görünüyor.
Amatör olarak Gwbasic, Pascal, Turbo Pascal, Delphi geçmişimden sonra OOP beni çok çekmedi açıkcası :)))
Bu arada delphi de OOP sanırım. :)
ChatGPT ile biraz konuştuktan sonra verdiği örnekleri kendi projeme yorumladım.
Sorun çözüldü. Ancak tam olarak anladığımı da söyleyemeyeceğim :))

Bu şekilde tanımlamalardan sonra workbook ve worksheet i artık diğer metotların içinde kullanabiliyorum.

C#:
public partial class MainWindow : Window
{
    DispatcherTimer timer = new DispatcherTimer();
    private int eskiprogram = 0;
    private int yeniprogram = 0;
    public string FileName = @"D:\\temp\\data.xlsx";

    public int ilkcalisma = 0;
    public int satir = 0;


    Excel.Application excelApp;
    Excel.Workbook workbook;
    Excel.Worksheet worksheet;

    public MainWindow()
    {

        InitializeComponent();
        timer.Interval = TimeSpan.FromMilliseconds(100);
        timer.Tick += timer_Tick;
        timer.IsEnabled = true;
        txtIpAddress.Text = Settings.Default.IpAddress;

        excelApp = new Excel.Application();
        excelApp.Visible = true;
        excelApp.UserControl = false;
    }
 

beab05

Özel Üye
Katılım
19 Mart 2007
Mesajlar
1,418
Excel Vers. ve Dili
Office 2013
Merhaba;

Aşağıdaki gibi ilerleyebilirsiniz. Bence C# ile kalın. Bütün kaynaklar nerdeyse C#, convert ile zaman kaybedeceğinize c# ı anlamak öğrenmek için zaman kaybedersiniz. Tabii kodu kendinize göre düzenleyip tamamlamalısınız.

C#:
class Eklentim

    {

        static excel.Application xlApp;

        static excel.Workbook xlWorkbook;

        static excel.Worksheet xlWorksheet;

        static excel.Range xlRange;

        static Timer timer;

        

        static void EklentiAna()

        {

            xlApp = new excel.Application();

            xlWorkbook = xlApp.Workbooks.Open(@"dosya yolu");

            xlWorksheet = (excel.Worksheet)xlWorkbook.Sheets[1];

            xlRange = xlWorksheet.UsedRange;

            

            timer = new Timer(1000); // 1000 milisaniye = 1 saniye

            timer.Elapsed += VerileriKaydet;

//.......

//.......

        }

        

        private static void VerileriKaydet()

        {

        // kodlarınız....

        }

    }
 

beab05

Özel Üye
Katılım
19 Mart 2007
Mesajlar
1,418
Excel Vers. ve Dili
Office 2013
Bu arada WPF ile mi başladınız?
 
Katılım
24 Nisan 2005
Mesajlar
3,671
Excel Vers. ve Dili
Office 2016 EN 64 Bit
Altın Üyelik Bitiş Tarihi
25/05/2022
Merhaba;

Aşağıdaki gibi ilerleyebilirsiniz. Bence C# ile kalın. Bütün kaynaklar nerdeyse C#, convert ile zaman kaybedeceğinize c# ı anlamak öğrenmek için zaman kaybedersiniz. Tabii kodu kendinize göre düzenleyip tamamlamalısınız.

C#:
class Eklentim

    {

        static excel.Application xlApp;

        static excel.Workbook xlWorkbook;

        static excel.Worksheet xlWorksheet;

        static excel.Range xlRange;

        static Timer timer;

       

        static void EklentiAna()

        {

            xlApp = new excel.Application();

            xlWorkbook = xlApp.Workbooks.Open(@"dosya yolu");

            xlWorksheet = (excel.Worksheet)xlWorkbook.Sheets[1];

            xlRange = xlWorksheet.UsedRange;

           

            timer = new Timer(1000); // 1000 milisaniye = 1 saniye

            timer.Elapsed += VerileriKaydet;

//.......

//.......

        }

       

        private static void VerileriKaydet()

        {

        // kodlarınız....

        }

    }
@beab05, kodlar için teşekkür ederim.

C# i kendi işim olarak değil de işime bir yardımcı araç olarak kullanmayı planlıyorum.
class işlemlerinin detaylarına hakim olursam benim için yeterli olacaktır.
Çok ciddi büyük projeler oluşturacak kadar bilmeme gerek yok.

Şimdiden plc haberleşmesi veri alış verişi, mssql e insert gibi işlemleri yapılabiliyor.
Çoğu da hazır örnek projeler ve kodlar sadece araya girip eklemek yetiyor.
İşi bilmeyince de bir IF de takılabiliyoruz : ))

Ama sevdim devam ediyorum :)
 

Haluk

Özel Üye
Katılım
7 Temmuz 2004
Mesajlar
12,406
Excel Vers. ve Dili
64 Bit 2010 - İngilizce
+
Google Sheets
+
JScript
Altın Üyelik Bitiş Tarihi
Bu şekilde tanımlamalardan sonra workbook ve worksheet i artık diğer metotların içinde kullanabiliyorum.
.....
...

En baştaki süslü parantez açık kalmış..... :)

.
 

beab05

Özel Üye
Katılım
19 Mart 2007
Mesajlar
1,418
Excel Vers. ve Dili
Office 2013
Comunity sürümü
Visual Studio sürümün Community'dir. Ben c# ile proje oluştururken windows form mu toksa WPF ile mi başladın onu merak ettim. Son verdiğin kodlar WPF gibi... Yani bir com class ya da console da değil...
 

Haluk

Özel Üye
Katılım
7 Temmuz 2004
Mesajlar
12,406
Excel Vers. ve Dili
64 Bit 2010 - İngilizce
+
Google Sheets
+
JScript
Altın Üyelik Bitiş Tarihi
Tahmin ediyorum, takılmak için yazmıştım ... :)


.
 
Katılım
24 Nisan 2005
Mesajlar
3,671
Excel Vers. ve Dili
Office 2016 EN 64 Bit
Altın Üyelik Bitiş Tarihi
25/05/2022
Visual Studio sürümün Community'dir. Ben c# ile proje oluştururken windows form mu toksa WPF ile mi başladın onu merak ettim. Son verdiğin kodlar WPF gibi... Yani bir com class ya da console da değil...
Windows Form App (.net freanwork ) projesi olarak çalışıyorum.
 
Üst