Страницы: 1
RSS
помогите пожалуйста написать программу под Excel
 
Всем доброго дня,  
помогите пожалуйста написать программу под Excel, очень надо срочно    
 
Задача: в экселе два столбца в одном находятся русские слова напротив - их перевод на английский. Необходимо чтобы программа выводила на экран русское слово и ждала пока я не нажму клавишу, как только нажимаю клавишу - она вместо русского слова выдает его эквивалент на английском (либо рядом либо на том же месте где было русское слово). и так по порядку весь файл бы и шерстила сверху вниз.  
Цель - учить английский язык. Нашел иностр. слово - записал его и его перевод и в течение дня запустил и проверил свою память. Вот собственно и всё. если кто то сможет помочь набросать код для данной программы буду очень признателен. Спасибо.
 
Так?
 
Для начала:  
 
Sub test()  
   Dim arr, n As Long, i As Long, x As Long  
 
   arr = ActiveSheet.Range("A1:B" & ActiveSheet.Range("A" & Rows.Count).End(xlUp).Row).Value  
   x = UBound(arr)  
   For i = 1 To x  
       n = Int((x * Rnd) + 1)  
       MsgBox arr(n, 1)  
       MsgBox arr(n, 2)  
   Next  
     
End Sub  
 
Нужно продумать выход из кода, а то пока гонит до конца...
 
Так например - выйти можно в любой момент:  
 
Sub test()  
   Dim arr, n As Long, i As Long, x As Long, ans As Byte  
 
   arr = ActiveSheet.Range("A1:B" & ActiveSheet.Range("A" & Rows.Count).End(xlUp).Row).Value  
   x = UBound(arr)  
   For i = 1 To x  
       n = Int((x * Rnd) + 1)  
       ans = MsgBox(arr(n, 1), vbYesNo)  
       If ans = 7 Then Exit Sub  
       ans = MsgBox(arr(n, 2), vbYesNo)  
       If ans = 7 Then Exit Sub  
   Next  
 
End Sub
 
Да, так скорее всего все слова не переберёт, ибо возможны повторы. Но зато каждое новое слово будет неожиданно :)
 
Сейчас подумал - чтоб не было повторов и чтоб перебрать все - можно словарь подключить, куда собирать выпавшие номера. При повторе генерить новый n.
 
Что-то это мне напоминает... :-)
 
Со словарём было, давно... Не сам придумал :)
 
Игорь, я не про это :-) Я про как бы "диалог"...
 
{quote}{login=Hugo}{date=13.03.2011 09:42}{thema=}{post}Сейчас подумал - чтоб не было повторов и чтоб перебрать все - можно словарь подключить, куда собирать выпавшие номера. При повторе генерить новый n.{/post}{/quote}  
 
 
можно, конечно, и так , но в конце списка может тормозить ( ниподецки :))  
 
есть два других способа:  
 
1 генерить сразу массив случайных чисел по количеству слов, сортировать его(вместе с порядковыми номерами)  
 
2 создать индексный массив, в котором вычеркивать использованные слова, а случайные числа понимать как количество неиспользованных слов, например, с начала списка..  
 вычеркивать можно и прямо из массива слов, если повторное его применение не планируется, а разницей в скорости обработки можно пренебречь..
Живи и дай жить..
 
а можно еще прикруть автозаполнение.. ну полуавто - пишете русское/англ слово, а оно вам ищет перевод в словаре/нете
Живи и дай жить..
 
а можно еще и грамотность проверять, и статистику вести - показывается русское слово, вы пишите английское, программа проверяет и определяет правильность перевода и написания, ведет статистику..
Живи и дай жить..
 
Зацепило? :)  
Такого в Экселе ещё не видел. А было бы интересно. И например в школе бы пригодилось - на скрытом листе слова за проверяемый период.  
А ещё можно не предлагать писать, а например выбрать из списка - всех слов, или случайно или специально подобранных.
 
{quote}{login=Hugo}{date=13.03.2011 09:42}{thema=}{post}Сейчас подумал - чтоб не было повторов и чтоб перебрать все - можно словарь подключить, куда собирать выпавшие номера. При повторе генерить новый n.{/post}{/quote}  
 
Спасибо Вам большое, хоть кто-то мне помог УРА!!!    
Но появился вопрос: а можно подсказать как бы сделать чтобы повторов не было, прямо код выложить?
 
слэн сказал, что будет ниподецки :)  
Я согласен. Поэтому может будут другие варианты кода?
 
я выкладывал недавно программу выбора случайных файлов - там это реализовано.  
 
отдельного кода сейчас под рукой нет
Живи и дай жить..
 
Я бы так сделал  
Sub eng_ru()  
Dim sl&, dict As Object, arr(), i&  
Set dict = CreateObject("Scripting.Dictionary")  
arr = [a1].CurrentRegion.Value
For i = 1 To UBound(arr)  
Randomize: sl = Int((UBound(arr)) * Rnd + 1)  
If dict.exists(sl) Then  
i = i - 1  
Else  
dict.Add sl, i  
Select Case MsgBox(arr(sl, 1), 1, "Английский")  
Case 1  
 MsgBox arr(sl, 2), 0, "Русский"  
Case 2  
  End  
End Select  
End If  
Next  
End Sub
Спасибо
 
время полного прохода массива без сообщений  
7,703125 кол-во слов: 31621 randomize в цикле  
2,671875 кол-во слов: 31621 randomize за циклом  
 
правда не знаю как правильно его все таки использовать :(( ??
Спасибо
 
повторов конечно многовато, но с генерировать массив случайных уникальных чисел быстрее у меня не получается...  
тест скорости и кол-во повторов  
2,203125;  кол-во слов: 31621;  повторов : 250476  
2,5625;  кол-во слов: 31621;  повторов : 280147  
3,15625;  кол-во слов: 31621;  повторов : 381512  
3,046875;  кол-во слов: 31621;  повторов : 364639  
2,5625;  кол-во слов: 31621;  повторов : 295091
Спасибо
 
Интересно а нет ли у кого просто кода который в случайном порядке меняет в начале строки на листе (именно строки а не ячейки)?
 
Это проще, и повторы не помешают - просто выгружаем в столбец массив случайных значений, потом сортируем по этому столбцу.
 
Вот передела вышевыложенный код.  
Рассчитано на пустой столбец C.  
 
Option Explicit  
 
Sub test()  
Dim arr, arr2, n As Long, i As Long, x As Long  
Application.ScreenUpdating = False  
 
Columns("C:C").ClearContents  
 
arr = ActiveSheet.Range("A1:A" & ActiveSheet.Range("A" & Rows.Count).End(xlUp).Row).Value  
ReDim arr2(1 To UBound(arr), 1 To 1)  
 
x = UBound(arr)  
For i = 1 To x  
n = Int((x * Rnd) + 1)  
arr2(i, 1) = n  
Next  
 
[C1].Resize(UBound(arr2)) = arr2
Columns("A:C").Sort Key1:=Range("C1"), Order1:=xlAscending  
Columns("C:C").ClearContents  
 
Application.ScreenUpdating = True  
End Sub
 
arr = ActiveSheet.Range("A1:A" & ActiveSheet.Range("A" & Rows.Count).End(xlUp).Row).Value  
 
Извиняюсь за тупой вопрос но что это за зверь такой?:)...я так понимаю что массив, но что в нем? почему просто нельзя activesheet.range.current.value использовать?
 
В смысле a = [a1].CurrentRegion.Value?
Можно, если Вы уверены, что возьмёте все нужные данные.
 
arr = ActiveSheet.Range("A1:A" & ActiveSheet.Range("A" & Rows.Count).End(xlUp).Row).Value  
вот вопрос: вначале программы я инициализировал этот массив но теперь например мне необходимо не рассматривать в нем какую либо строчку, как можно её исключить из рассмотрения (но не стирая её!)? то есть получить массив arr теперь без неё (строчка например А3:В3 или любая другая по которой я заранее знаю положение)? и делать какие-либо действия без этой строчки, но не стирая её?
 
Непонятно.  
Если просто не учитывать при обработке - поставьте условие проверки переменной, с помощью которой анализируется массив.
Страницы: 1
Читают тему
Наверх