• DİKKAT

    DOSYA İndirmek/Yüklemek için ÜCRETLİ ALTIN ÜYELİK Gereklidir!
    Altın Üyelik Hakkında Bilgi

C# excel nesne tanımlamada problem

  • Konbuyu başlatan Konbuyu başlatan Asri
  • Başlangıç tarihi Başlangıç tarihi
Katılım
24 Nisan 2005
Mesajlar
3,683
Excel Vers. ve Dili
Office 2016 EN 64 Bit
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;
}
 
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;
    }
}
 
@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 :)
 
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:
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;
 
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...

.
 
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.
 
C# ' ın burada günahı yok. :) Asıl mesele, Object Oriented Programming (OOP) gibi görünüyor.

.
 
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;
    }
 
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....

        }

    }
 
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 :)
 
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...
 
Tahmin ediyorum, takılmak için yazmıştı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...

Windows Form App (.net freanwork ) projesi olarak çalışıyorum.
 
Geri
Üst